semPower.powerLGCM {semPower}R Documentation

semPower.powerLGCM

Description

Convenience function for performing power analysis on effects in a latent growth curve model (LGCM). This requires the lavaan package.

Usage

semPower.powerLGCM(
  type,
  comparison = "restricted",
  nWaves = NULL,
  means = NULL,
  variances = NULL,
  covariances = NULL,
  quadratic = FALSE,
  timeCodes = NULL,
  ticExogSlopes = NULL,
  ticEndogSlopes = NULL,
  groupEqual = NULL,
  nullEffect = NULL,
  nullWhichGroups = NULL,
  autocorResiduals = TRUE,
  ...
)

Arguments

type

type of power analysis, one of 'a-priori', 'post-hoc', 'compromise'.

comparison

comparison model, one of 'saturated' or 'restricted' (the default). This determines the df for power analyses. 'saturated' provides power to reject the model when compared to the saturated model, so the df equal the one of the hypothesized model. 'restricted' provides power to reject the hypothesized model when compared to an otherwise identical model that just omits the restrictions defined in nullEffect, so the df equal the number of restrictions.

nWaves

number of waves, must be >= 3 for linear and > 3 for quadratic trends.

means

vector providing the means of the intercept and the linear slope factor (and the quadratic slope factor, if quadratic = TRUE). A list for multiple group models.

variances

vector providing the variances of the intercept and the linear slope factor (and the quadratic slope factor, if quadratic = TRUE). Can be omitted, if a matrix is provided to covariances. Takes precedence over the diagonal in covariances when both are defined. A list for multiple group models.

covariances

either the variance-covariance matrix between the intercept and the slope (and the quadratic slope factor, if quadratic = TRUE), or a single number giving the covariance between intercept and slope factor, or NULL for orthogonal factors. A list for multiple group models.

quadratic

whether to include a quadratic slope factor in addition to a linear slope factor. Defaults to FALSE for no quadratic slope factor.

timeCodes

vector of length nWaves defining the loadings on the slope factor. If omitted, the time codes default to (0, 1, ..., (nWaves - 1)).

ticExogSlopes

vector defining the slopes for an exogenous time-invariant covariate in the prediction of the intercept and slope factors (and the quadratic slope factor, if quadratic = TRUE). Can be omitted for no covariate.

ticEndogSlopes

vector defining the slopes for the intercept and slope factors (and the quadratic slope factor, if quadratic = TRUE) in the prediction of an endogenous time-invariant covariate. Can be omitted for no covariate.

groupEqual

parameters that are restricted across groups in both the H0 and the H1 model, when nullEffect implies a multiple group model. Valid are 'imean', 'smean', 's2mean' to restrict the means of the intercept, linear slope, and quadratic slope factors, and 'ivar', 'svar', 's2var' for their variances, and 'iscov', 'is2cov', 'ss2cov' for the covariances between intercept and slope, intercept and quadratic slope, and linear and quadratic slope.

nullEffect

defines the hypothesis of interest. See details for valid arguments.

nullWhichGroups

for hypothesis involving cross-groups comparisons, vector indicating the groups for which equality constrains should be applied, e.g. c(1, 3) to constrain the relevant parameters of the first and the third group. If NULL, all groups are constrained to equality.

autocorResiduals

whether the residuals of the indicators of latent variables are autocorrelated over waves (TRUE, the default) or not (FALSE). This is only applied to second order LGCMs. This affects the df when the comparison model is the saturated model and generally affects power (also for comparisons to the restricted model).

...

mandatory further parameters related to the specific type of power analysis requested, see semPower.aPriori(), semPower.postHoc(), and semPower.compromise(), and parameters specifying the factor model. The order of factors is (X1, X2, ..., X_nWaves, ticExogSlopes, ticEndogSlopes). See details.

Details

This function performs a power analysis to reject various hypotheses arising in latent growth curve models (LGCM), where one variable X is repeatedly assessed at different time points (nWaves), and a latent intercept and a linear (and optionally a quadratic) latent slope factor is assumed.

Relevant hypotheses in arising in a LCGM are:

For hypotheses regarding longitudinal invariance, see semPower.powerLI(). For hypotheses regarding a simple autoregression, see semPower.powerAutoreg(). For hypotheses in an ARMA model, see semPower.powerARMA().

Beyond the arguments explicitly contained in the function call, additional arguments are required specifying the factor model and the requested type of power analysis.

Additional arguments related to the definition of the factor model:

So either Lambda, or loadings, or nIndicator and loadM need to be defined. Neither may contain entries referring to the intercept and slope factors. If the model contains observed variables only, use Lambda = diag(x) where x is the number of variables.

The order of the factors is (X1, X2, ..., X_nWaves, ticExogenous, ticEndogenous). If ticExogenous is undefined, ticEndogenous takes its place.

Additional arguments related to the requested type of power analysis:

If a simulated power analysis (simulatedPower = TRUE) is requested, optional arguments can be provided as a list to simOptions:

type = 'IG' implements the independent generator approach (IG, Foldnes & Olsson, 2016) approach specifying third and fourth moments of the marginals, and thus requires that skewness (skewness) and excess kurtosis (kurtosis) for each variable are provided as vectors. This requires the covsim package.

type = 'mnonr' implements the approach suggested by Qu, Liu, & Zhang (2020) and requires provision of Mardia's multivariate skewness (skewness) and kurtosis (kurtosis), where skewness must be non-negative and kurtosis must be at least 1.641 skewness + p (p + 0.774), where p is the number of variables. This requires the mnonr package.

type = 'RK' implements the approach suggested by Ruscio & Kaczetow (2008) and requires provision of the population distributions of each variable (distributions). distributions must be a list (if all variables shall be based on the same population distribution) or a list of lists. Each component must specify the population distribution (e.g. rchisq) and additional arguments (list(df = 2)).

type = 'VM' implements the third-order polynomial method (Vale & Maurelli, 1983) specifying third and fourth moments of the marginals, and thus requires that skewness (skewness) and excess kurtosis (kurtosis) for each variable are provided as vectors. This requires the semTools package.

Value

a list. Use the summary method to obtain formatted results. Beyond the results of the power analysis and a number of effect size measures, the list contains the following components:

Sigma

the population covariance matrix. A list for multiple group models.

mu

the population mean vector or NULL when no meanstructure is involved. A list for multiple group models.

SigmaHat

the H0 model implied covariance matrix. A list for multiple group models.

muHat

the H0 model implied mean vector or NULL when no meanstructure is involved. A list for multiple group models.

modelH0

lavaan H0 model string.

modelH1

lavaan H1 model string or NULL when the comparison refers to the saturated model.

simRes

detailed simulation results when a simulated power analysis (simulatedPower = TRUE) was performed.

See Also

semPower.genSigma() semPower.aPriori() semPower.postHoc() semPower.compromise()

Examples

## Not run: 
# Determine required N in a 3-wave LGCM model
# to detect that the mean of the slope factor differs from zero
# with a power of 80% on alpha = 5%, where
# X is measured by 3 indicators loading by .5 each (at each wave), and
# the mean of the intercept factor is .5 and
# the mean of the slope factor is .2 and
# the variance of the intercept factor is 1 and
# the variance of the slope factor is .5 and
# the intercept-slope covariance is .25 and
# autocorrelated residuals are assumed
powerLGCM <- semPower.powerLGCM(
  'a-priori', alpha = .05, power = .80,
  nWaves = 3,
  means = c(.5, .2),     # i, s
  variances = c(1, .5),  # i, s
  covariances = .25,
  nullEffect = 'sMean = 0',
  nIndicator = rep(3, 3), loadM = .5,
  autocorResiduals = TRUE
)

# show summary
summary(powerLGCM)
# optionally use lavaan to verify the model was set-up as intended
lavaan::sem(powerLGCM$modelH1, sample.cov = powerLGCM$Sigma,
            sample.mean = powerLGCM$mu,
            sample.nobs = powerLGCM$requiredN,
            sample.cov.rescale = FALSE)
lavaan::sem(powerLGCM$modelH0, sample.cov = powerLGCM$Sigma,
            sample.mean = powerLGCM$mu,
            sample.nobs = powerLGCM$requiredN,
            sample.cov.rescale = FALSE)


# same as above, but determine power with N = 250 on alpha = .05
powerLGCM <- semPower.powerLGCM(
  'post-hoc', alpha = .05, N = 250,
  nWaves = 3,
  means = c(.5, .2),
  variances = c(1, .5),
  covariances = .25,
  nullEffect = 'sMean = 0',
  nIndicator = rep(3, 3), loadM = .5,
  autocorResiduals = TRUE
)

# same as above, but determine the critical chi-square with N = 250 so that alpha = beta
powerLGCM <- semPower.powerLGCM(
  'compromise', abratio = 1, N = 250,
  nWaves = 3,
  means = c(.5, .2),
  variances = c(1, .5),
  covariances = .25,
  nullEffect = 'sMean = 0',
  nIndicator = rep(3, 3), loadM = .5,
  autocorResiduals = TRUE
)

# same as above, but compare to the saturated model
# (rather than to the less restricted model)
powerLGCM <- semPower.powerLGCM(
  'a-priori', alpha = .05, power = .80, comparison = 'saturated',
  nWaves = 3,
  means = c(.5, .2),
  variances = c(1, .5),
  covariances = .25,
  nullEffect = 'sMean = 0',
  nIndicator = rep(3, 3), loadM = .5,
  autocorResiduals = TRUE
)

# same as above, but assume only observed variables
powerLGCM <- semPower.powerLGCM(
  'a-priori', alpha = .05, power = .80, comparison = 'saturated',
  nWaves = 3,
  means = c(.5, .2),
  variances = c(1, .5),
  covariances = .25,
  nullEffect = 'sMean = 0',
  Lambda = diag(3),
  autocorResiduals = TRUE
)

# same as above, but provide reduced loadings matrix to define that
# X is measured by 3 indicators each loading by .5, .6, .4 (at each wave)
powerLGCM <- semPower.powerLGCM(
  'a-priori', alpha = .05, power = .80, comparison = 'saturated',
  nWaves = 3,
  means = c(.5, .2),
  variances = c(1, .5),
  covariances = .25,
  nullEffect = 'sMean = 0',
  loadings = list(
    c(.5, .6, .4),  # X1
    c(.5, .6, .4),  # X2 
    c(.5, .6, .4)   # X3
  ),
  autocorResiduals = TRUE
)

# same as above, but get required N to detect that
# the variance of the intercept factor differs from zero
powerLGCM <- semPower.powerLGCM(
  'a-priori', alpha = .05, power = .80,
  nWaves = 3,
  means = c(.5, .2),
  variances = c(1, .5),
  covariances = .25,
  nullEffect = 'iVar = 0',
  nIndicator = rep(3, 3), loadM = .5,
  autocorResiduals = TRUE
)

# same as above, but get required N to detect that
# the intercept-slope covariance differs from zero
powerLGCM <- semPower.powerLGCM(
  'a-priori', alpha = .05, power = .80,
  nWaves = 3,
  means = c(.5, .2),
  variances = c(1, .5),
  covariances = .25,
  nullEffect = 'iscov = 0',
  nIndicator = rep(3, 3), loadM = .5,
  autocorResiduals = TRUE
)


# include a quadratic slope factor
# and get required N to detect that
# its variance differs from zero.
# provide the variance-covariance matrix
# between intercept, slope, and quadratic slope factors
powerLGCM <- semPower.powerLGCM(
  'a-priori', alpha = .05, power = .80,
  nWaves = 4,
  quadratic = TRUE,
  means = c(.5, .2, .1),
  covariances = matrix(c(
    # i  s   s2
    c(1, .3, .2),
    c(.3, .5, .01),
    c(.2, .01, .1)
  ), ncol = 3, byrow = TRUE),
  nullEffect = 's2var = 0',
  nIndicator = rep(3, 4), loadM = .5,
  autocorResiduals = TRUE
)

# Determine required N in a 3-wave LGCM model
# to detect that the slope of an time-invariant covariate (TIC)
# on the slope factor differs from zero. 
# The TIC is measured by 4 indicators loading
# by .7, .7, .5, and .8. The slope of the TIC in the prediction of
# the intercept factor is .5, and in the prediction of the slope factor is .4.
powerLGCM <- semPower.powerLGCM(
  'a-priori', alpha = .05, power = .80,
  nWaves = 3,
  means = c(.5, .2),
  variances = c(1, .5),
  covariances = .25,
  ticExogSlopes = c(.5, .4),  # i s
  nullEffect = 'betaST = 0',
  loadings = list(
    c(.5, .6, .4),      # X1
    c(.5, .6, .4),      # X2 
    c(.5, .6, .4),      # X3
    c(.7, .7, .5, .8)   # TIC
  ),
  autocorResiduals = TRUE
)

# Determine required N in a 3-wave LGCM model
# to detect that the slope of the slope factor in 
# the prediction of a time-invariant covariate (TIC) differs from zero. 
# The TIC is measured by 4 indicators loading
# by .7, .7, .5, and .8. The slopes of the intercept and the slope factors in
# the prediction of the TIC are .1 and .3, respectively.
powerLGCM <- semPower.powerLGCM(
  'a-priori', alpha = .05, power = .80,
  nWaves = 3,
  means = c(.5, .2),
  variances = c(1, .5),
  covariances = .25,
  ticEndogSlopes = c(.1, .3),  # i s
  nullEffect = 'betaTS = 0',
  loadings = list(
    c(.5, .6, .4),      # X1
    c(.5, .6, .4),      # X2 
    c(.5, .6, .4),      # X3
    c(.7, .7, .5, .8)   # TIC
  ),
  autocorResiduals = TRUE
)

# Determine required N in a 3-wave LGCM model
# to detect that the mean of the slope factor in group 1
# differs from the mean of the slope factor in group 2
# with a power of 80% on alpha = 5%, where
# X is measured by 3 indicators loading by .5 each (at each wave and in each group), and
# the means of the intercept factor in group 1 and 2 are .5 and .25
# the means of the slope factor in group 1 and 2 are .25 and .4
# the variance of the intercept factor is 1 in both groups and
# the variance of the slope factor is .5in both groups and
# the intercept-slope covariance is .25 in both groups and
# autocorrelated residuals are assumed and
# the groups are equal-sized
powerLGCM <- semPower.powerLGCM(
  'a-priori', alpha = .05, power = .80, N = list(1, 1),
  nWaves = 3,
  means = list(
    # i, s
    c(.5, .2),     # group 1 
    c(.25, .4)),   # group 2
  variances = c(1, .5),
  covariances = .25,
  nullEffect = 'sMeanA = sMeanB',
  nIndicator = rep(3, 3), loadM = .5,
  autocorResiduals = TRUE
)

# similar as above, but get required N to detect that
# the intercept-slope covariance differs across groups, 
# assuming that intercept and slope variances are equal across groups.
powerLGCM <- semPower.powerLGCM(
  'a-priori', alpha = .05, power = .80, N = list(1, 1),
  nWaves = 3,
  means = c(.5, .2),  
  variances = c(1, .5),
  covariances = list(
    c(.25), # group 1 
    c(.1)), # group 2
  nullEffect = 'isCovA = isCovB',
  groupEqual = c('ivar', 'svar'),
  nIndicator = rep(3, 3), loadM = .5,
  autocorResiduals = TRUE
)

# perform a simulated post-hoc power analysis
# with 250 replications
set.seed(300121)
powerLGCM <- semPower.powerLGCM(
  'post-hoc', alpha = .05, N = 500,
  nWaves = 3,
  means = c(.5, .2),     # i, s
  variances = c(1, .5),  # i, s
  covariances = .25,
  nullEffect = 'sMean = 0',
  nIndicator = rep(3, 3), loadM = .5,
  autocorResiduals = TRUE,
  simulatedPower = TRUE,
  simOptions = list(nReplications = 250)
)

## End(Not run)

[Package semPower version 2.1.0 Index]