Skip to contents

This function can be used as part of a dynamiteformula() to define a common latent factor component. The latent factor is modeled as a spline similarly as a time-varying intercept, but instead of having equal effect on each group, there is an additional loading variable for each group so that in the linear predictor we have a term \(\lambda_i \psi_t\) for each group \(i\).

Usage

lfactor(
  responses = NULL,
  nonzero_lambda = TRUE,
  correlated = TRUE,
  noncentered_psi = FALSE,
  flip_sign = TRUE
)

Arguments

responses

[character()]
Names of the responses that the factor should affect. Default is all responses defined with obs except categorical responses, which do not (yet) support the factor component.

nonzero_lambda

[logical()]
If TRUE (the default), assumes that the mean of factor loadings is nonzero or not. Should be a logical vector matching the length of responses or a single logical value in case responses is NULL. See details.

correlated

[logical()]
If TRUE (the default), the latent factors are assumed to be correlated between channels.

noncentered_psi

[logical(1)]
If TRUE, uses a noncentered parametrization for spline coefficients of all the factors. The number of knots is based splines() call. Default is FALSE.

flip_sign

[logical(1)]
If TRUE (default), try to avoid multimodality due to sign-switching by defining the sign of \(\lambda\) and \(\psi\) based on the mean of \(\omega_1,\ldots, \omega_D\) coefficients. This only affects channels with nonzero_lambda = FALSE. If the true mean of \(\omega\)s is close to zero, this might not help, in which case it is better to set flip_sign = FALSE and post-process the samples in other ways (or use only one chain and/or suitable initial values). This argument is common to all factors.

Value

An object of class latent_factor.

See also

Model formula construction dynamite(), dynamiteformula(), lags(), random_spec(), splines()

Examples

data.table::setDTthreads(1) # For CRAN
# three channel model with common factor affecting for responses x and y
obs(y ~ 1, family = "gaussian") +
  obs(x ~ 1, family = "poisson") +
  obs(z ~ 1, family = "gaussian") +
  lfactor(
    responses = c("y", "x"), nonzero_lambda = c(TRUE, FALSE),
    correlated = TRUE, noncentered_psi = FALSE
  )
#>   Family   Formula
#> y gaussian y ~ 1  
#> x poisson  x ~ 1  
#> z gaussian z ~ 1