Shorter story: I'm calculating PUC, ECV, H, and FD for a bifactor model following Rodriguez, Reise, and Haviland (2016). Would the equations need changes to work with ordered categorical indicators (using WLSMV or ULSMV)?
Rodriguez et al. exemplify with a Likert scale but only work with the polychoric correlation marix. The calculations I'm currently using for continuous outcomes (using MLR) or non mean/variance adjusted DWLS are at the end.
Btw, of course I'm not aware of these indices being included in any lavaan-related package (e.g. semTools). I hope I did not miss that. In any case, would you consider that useful or feasible in the future?
Longer story:
I am analyzing a bifactor model with ordered categorical outcomes (5 points Likert-type scale). Following
Rodriguez, Reise, and Haviland (2016) I am studying
(1) the reliability of unit-weighted composite scores; (2) the use of a set of items to compute factor scores or to identify a latent variable in an SEM context; and (3) whether multidimensional (bifactor) data are “unidimensional enough” to specify a unidimensional measurement model in an SEM context.
The first aspect is dealt with omega hierarchical which as far as I know is adapted for categorical indices in `semTools::reliability` following different equations from Green and Yang (2009).
For the second aspect, Rodriguez et al. recommend using indices H and FD. For the third, they advise calculating explained common variance of the general factor on all items (ECV) and on specific items (I-ECV), as well as the percentage of uncontaminated correlations (PUC). Except for PUC, I am not sure if the formulas they propose are directly applicable when working with ordered categorical indicators using mean and variance adjusted estimators (WLSMV/ULSMV).
I'm sorry if the answers are obvious and in the case of PUC I honestly can't imagine how it would be different. I try my best to understand rigorously what I do, but due to my still limited knowledge on the mathematics underlying WLSMV (or ULSMV), I preferred to ask here since most members will know better.
Many thanks in advance
Manuel
References
Rodriguez A, Reise SP, Haviland MG. Evaluating bifactor models: calculating and interpreting statistical indices. Psychol Methods. 2016;21(2):137.
Code
fit <- cfa(model = bifactor.model, data = data, estimator = "WLSMV")
fit.std <- lavInspect(fit, "std")
Lambda <- fit.std$lambda
Lambda[is.na(Lambda)] <- 0 Lambda <- as.matrix(Lambda)
Theta <- fit.std$theta
Phi <- fit.std$psi
class(Phi) <- "matrix"
#######
# ECV #
#######
# Rodriguez et al. (2016, equation 10)
ECV_SS_C <- function(Fac, Lambda) {
inFactor <- Lambda[, Fac] != 0
L2 = Lambda^2
sum(L2[, Fac] * inFactor)/sum(L2 * inFactor)
}
ECV_results <- sapply(1:ncol(Lambda), ECV_SS_C, Lambda)
names(ECV_results) <- colnames(Lambda)
ECV_results
#######
# PUC #
#######
# Rodriguez et al. (2016, no equation but example in p. 144)
numItemsOnFactor <- colSums(Lambda != 0)
specificCorrelationCount <- sum(sapply(numItemsOnFactor,
function(x) {
x * (x - 1)/2
})) - (nrow(Lambda) * (nrow(Lambda) - 1)/2)
1 - specificCorrelationCount/(nrow(Lambda) * (nrow(Lambda) -
1)/2)
#####
# H #
#####
# Rodriguez et al. (2016, equation 9)
1/(1 + 1/(colSums(Lambda ^2/(1 - Lambda^2))))
######
# FD #
######
# Rodriguez et al. (2016, equation 8)
Psi <- diag(Theta)
Sigma <- Lambda %*% Phi %*% t(Lambda) + diag(Psi)
FacDet <- sqrt(diag(Phi %*% t(Lambda) %*% solve(Sigma) %*%
Lambda %*% Phi))
names(FacDet) <- colnames(Lambda)
FacDet