semPower.powerMI {semPower}R Documentation

semPower.powerMI

Description

Convenience function for performing power analyses for hypothesis arising in multigroup measurement invariance models concerning a specific level of invariance. This requires the lavaan package.

Usage

semPower.powerMI(type, comparison = NULL, nullEffect = NULL, ...)

Arguments

type

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

comparison

comparison model, either 'saturated' or one of 'configural', 'metric', 'scalar', 'covariances', or a vector of restrictions in lavaan format (with 'none' for no restrictions). See details.

nullEffect

defines the hypothesis (i.e., level of invariance) of interest. One of 'metric', 'scalar', 'residual', 'covariances', 'means' or a vector of restrictions in lavaan format. See details.

...

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. See details.

Details

This function performs a power analysis to reject various hypotheses arising in the context of multigroup measurement invariance. Multigroup invariance models fit the specified model simultaneously to various groups and place increasingly restrictive cross-group equality constrains on the model parameters. The typical - but not in all parts necessary - sequence is (a) configural, (b) metric, (c) scalar, and (d) residual invariance, where each level of invariance is compared against the previous level (e.g., scalar vs. metric). Power analysis provides the power (or the required N) to reject a particular level of invariance.

For hypotheses regarding longitudinal invariance, see semPower.powerLI().

The models defined in the comparison and the nullEffect arguments can be specified in two ways. Either specify a specific level of invariance that includes all previous levels:

For example, setting comparison = 'metric' and nullEffect = 'scalar' determines power to reject the hypothesis that the constraints placed in the scalar invariance model (restricting loadings and intercepts) over the metric invariance model (restricting only the loadings) are defensible.

For greater flexibility, the models can also be defined using lavaan style group.equal restrictions as a vector:

For example, setting comparison = c('loadings') and ⁠nullEffect = 'c('loadings', 'intercepts')'⁠ determines power to reject the hypothesis that the constraints placed in the scalar invariance model (restricting loadings and intercepts) over the metric invariance model (restricting only the loadings) are defensible. Note that variance scaling is used, so invariance of variances ('lv.variances') is always met.

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 always need to be defined, and Theta, tau and Alpha need to be defined for particular levels of invariance. As this function operates on multiple groups, either argument is a list whenever there are group differences in the respective parameters. When no list is provided, the same parameter values are assumed for all groups.

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: 
# obtain the required N to reject the hypothesis of metric invariance
# in comparison to the configural invariance model 
# with a power of 95% on alpha = 5% 
# assuming equally sized groups (N = list(1, 1)) 
# for a factor model involving a single factor which 
# is measured by 5 indicators (in both groups)
# loading by .5 each in the first group and 
# loading by .6 each in the second group.
powerMI <- semPower.powerMI(type = 'a-priori',
                            comparison = 'configural', 
                            nullEffect = 'metric',
                            nIndicator = list(5, 5),
                            loadM = list(.5, .6),
                            alpha = .05, beta = .05, N = list(1, 1))

# show summary
summary(powerMI)
# optionally use lavaan to verify the model was set-up as intended
lavaan::sem(powerMI$modelH1, sample.cov = list(powerMI$Sigma[[1]], powerMI$Sigma[[2]]),
            sample.nobs = as.list(powerMI$requiredN.g), sample.cov.rescale = FALSE)
lavaan::sem(powerMI$modelH0, sample.cov = list(powerMI$Sigma[[1]], powerMI$Sigma[[2]]),
            sample.nobs = as.list(powerMI$requiredN.g), sample.cov.rescale = FALSE)

# same as above, but determine power with N = 500 in each group on alpha = .05
powerMI <- semPower.powerMI(type = 'post-hoc',
                            comparison = 'configural', 
                            nullEffect = 'metric',
                            nIndicator = 5,
                            loadM = list(.5, .6),
                            alpha = .05, N = list(500, 500))

# same as above, but determine the critical chi-square with N = 500 in each 
# group so that alpha = beta
powerMI <- semPower.powerMI(type = 'compromise',
                            comparison = 'configural', 
                            nullEffect = 'metric',
                            nIndicator = 5,
                            loadM = list(.5, .6),
                            abratio = 1, N = list(500, 500))

# same as above, but compare to the saturated model
# (rather than to the configural invariance model)
powerMI <- semPower.powerMI(type = 'a-priori',
                            comparison = 'saturated', 
                            nullEffect = 'metric',
                            nIndicator = 5,
                            loadM = list(.5, .6),
                            alpha = .05, beta = .05, N = list(1, 1))

# same as above, but provide individual factor loadings by group using a 
# reduced loading matrix to define a  single factor model with three indicators
# loading by .4, .6, .5 in the first group and 
# loading by .5, .6, .7 in the second group
powerMI <- semPower.powerMI(type = 'a-priori',
                            comparison = 'saturated', 
                            nullEffect = 'metric',
                            loadings = list(
                              list(c(.4, .6, .5)), 
                              list(c(.5, .6, .7))),
                            alpha = .05, beta = .05, N = list(1, 1))

# same as above, but make first group twice as large as the second group 
powerMI <- semPower.powerMI(type = 'a-priori',
                            comparison = 'saturated', 
                            nullEffect = 'metric',
                            loadings = list(
                              list(c(.4, .6, .5)), 
                              list(c(.5, .6, .7))),
                            alpha = .05, beta = .05, N = list(2, 1))

# obtain the required N to reject the hypothesis of scalar invariance
# in comparison to the metric invariance model 
# with a power of 95% on alpha = 5% 
# assuming equally sized groups (N = list(1, 1)) 
# for a two factor model, where both factors are  
# measured by 3 indicators each and all loadings equal .5 (in both groups),
# the factor correlation is .3 in both groups, and the
# all intercepts are 0.0 in the first group, but
# the intercepts are .1, .2, .3, .4, .5, .6 in the second group
powerMI <- semPower.powerMI(type = 'a-priori',
                            comparison = 'metric', 
                            nullEffect = 'scalar',
                            Phi = list(.3, .3),
                            nIndicator = list(
                              c(3, 3), 
                              c(3, 3)),
                            loadM = .5,
                            tau = list(
                              rep(0.0, 6), 
                              seq(.1, .6, .1) 
                            ),
                            alpha = .05, beta = .05, N = list(1, 1))

# same as above, but use lavaan group.equal strings 
powerMI <- semPower.powerMI(type = 'a-priori',
                            comparison = c('loadings'), 
                            nullEffect = c('loadings', 'intercepts'),
                            Phi = list(.3, .3),
                            nIndicator = list(
                              c(3, 3), 
                              c(3, 3)),
                            loadM = .5,
                            tau = list(
                              rep(0.0, 6), 
                              seq(.1, .6, .1) 
                            ),
                            alpha = .05, beta = .05, N = list(1, 1))

# same as above, but
# obtain the required N to reject the hypothesis of equal latent means
# in comparison to the scalar invariance model;
# all intercepts are zero in both groups, 
# in the first group, the latent means equal 0.0, 
# in the second group, the latent mean of the factors are 0.0 and 0.5
powerMI <- semPower.powerMI(type = 'a-priori',
                            comparison = c('loadings', 'intercepts'), 
                            nullEffect = c('loadings', 'intercepts', 'means'),
                            Phi = list(.3, .3),
                            nIndicator = list(
                              c(3, 3), 
                              c(3, 3)),
                            loadM = .5,
                            tau = list(
                              rep(0.0, 6), 
                              rep(0.0, 6) 
                            ),
                            Alpha = list(
                              c(0.0, 0.0),
                              c(0.0, 0.5)
                            ),
                            alpha = .05, beta = .05, N = list(1, 1))

# request a simulated post-hoc power analysis with 500 replications
# to reject the hypothesis of metric invariance.
set.seed(300121)
powerMI <- semPower.powerMI(type = 'post-hoc',
                            comparison = 'configural', 
                            nullEffect = 'metric',
                            nIndicator = list(5, 5),
                            loadM = list(.5, .6),
                            alpha = .05, N = list(500, 500), 
                            simulatedPower = TRUE, 
                            simOptions = list(nReplications = 500))
                             

## End(Not run)

[Package semPower version 2.1.0 Index]