| SSpower {semTools} | R Documentation |
Power for model parameters
Description
Apply Satorra & Saris (1985) method for chi-squared power analysis.
Usage
SSpower(powerModel, n, nparam, popModel, mu, Sigma, fun = "sem",
alpha = 0.05, ...)
Arguments
powerModel |
lavaan |
n |
|
nparam |
|
popModel |
lavaan |
mu |
|
Sigma |
|
fun |
character. Name of |
alpha |
Type I error rate used to set a criterion for rejecting H0. |
... |
additional arguments to pass to |
Details
Specify all non-zero parameters in a population model, either by using
lavaan syntax (popModel) or by submitting a population covariance
matrix (Sigma) and optional mean vector (mu) implied by the
population model. Then specify an analysis model that places at least
one invalid constraint (note the number in the nparam argument).
There is also a Shiny app called "power4SEM" that provides a graphical user interface for this functionality (Jak et al., in press). It can be accessed at https://sjak.shinyapps.io/power4SEM/.
Author(s)
Alexander M. Schoemann (East Carolina University; schoemanna@ecu.edu)
Terrence D. Jorgensen (University of Amsterdam; TJorgensen314@gmail.com)
References
Satorra, A., & Saris, W. E. (1985). Power of the likelihood ratio test in covariance structure analysis. Psychometrika, 50(1), 83–90. doi:10.1007/BF02294150
Jak, S., Jorgensen, T. D., Verdam, M. G., Oort, F. J., & Elffers, L. (2021). Analytical power calculations for structural equation modeling: A tutorial and Shiny app. Behavior Research Methods, 53, 1385–1406. doi:10.3758/s13428-020-01479-0
Examples
## Specify population values. Note every parameter has a fixed value.
modelP <- '
f1 =~ .7*V1 + .7*V2 + .7*V3 + .7*V4
f2 =~ .7*V5 + .7*V6 + .7*V7 + .7*V8
f1 ~~ .3*f2
f1 ~~ 1*f1
f2 ~~ 1*f2
V1 ~~ .51*V1
V2 ~~ .51*V2
V3 ~~ .51*V3
V4 ~~ .51*V4
V5 ~~ .51*V5
V6 ~~ .51*V6
V7 ~~ .51*V7
V8 ~~ .51*V8
'
## Specify analysis model. Note parameter of interest f1~~f2 is fixed to 0.
modelA <- '
f1 =~ V1 + V2 + V3 + V4
f2 =~ V5 + V6 + V7 + V8
f1 ~~ 0*f2
'
## Calculate power
SSpower(powerModel = modelA, popModel = modelP, n = 150, nparam = 1,
std.lv = TRUE)
## Get power for a range of sample sizes
Ns <- seq(100, 500, 40)
Power <- rep(NA, length(Ns))
for(i in 1:length(Ns)) {
Power[i] <- SSpower(powerModel = modelA, popModel = modelP,
n = Ns[i], nparam = 1, std.lv = TRUE)
}
plot(x = Ns, y = Power, type = "l", xlab = "Sample Size")
## Optionally specify different values for multiple populations
modelP2 <- '
f1 =~ .7*V1 + .7*V2 + .7*V3 + .7*V4
f2 =~ .7*V5 + .7*V6 + .7*V7 + .7*V8
f1 ~~ c(-.3, .3)*f2 # DIFFERENT ACROSS GROUPS
f1 ~~ 1*f1
f2 ~~ 1*f2
V1 ~~ .51*V1
V2 ~~ .51*V2
V3 ~~ .51*V3
V4 ~~ .51*V4
V5 ~~ .51*V5
V6 ~~ .51*V6
V7 ~~ .51*V7
V8 ~~ .51*V8
'
modelA2 <- '
f1 =~ V1 + V2 + V3 + V4
f2 =~ V5 + V6 + V7 + V8
f1 ~~ c(psi21, psi21)*f2 # EQUALITY CONSTRAINT ACROSS GROUPS
'
## Calculate power
SSpower(powerModel = modelA2, popModel = modelP2, n = c(100, 100), nparam = 1,
std.lv = TRUE)
## Get power for a range of sample sizes
Ns2 <- cbind(Group1 = seq(10, 100, 10), Group2 = seq(10, 100, 10))
Power2 <- apply(Ns2, MARGIN = 1, FUN = function(nn) {
SSpower(powerModel = modelA2, popModel = modelP2, n = nn,
nparam = 1, std.lv = TRUE)
})
plot(x = rowSums(Ns2), y = Power2, type = "l", xlab = "Total Sample Size",
ylim = 0:1)
abline(h = c(.8, .9), lty = c("dotted","dashed"))
legend("bottomright", c("80% Power","90% Power"), lty = c("dotted","dashed"))