lavTestLRT.mi: Likelihood Ratio Test for Multiple Imputations

View source: R/pool-LRT.R

lavTestLRT.miR Documentation

Likelihood Ratio Test for Multiple Imputations

Description

Likelihood ratio test (LRT) for lavaan models fitted to multiple imputed data sets.

Usage

lavTestLRT.mi(
  object,
  ...,
  modnames = NULL,
  asANOVA = TRUE,
  pool.method = c("D4", "D3", "D2"),
  omit.imps = c("no.conv", "no.se"),
  asymptotic = FALSE,
  pool.robust = FALSE
)

## S4 method for signature 'lavaan.mi'
anova(object, ...)

Arguments

object

An object of class lavaan.mi

...

Additional objects of class lavaan.mi, as well as arguments passed to lavaan::lavTestLRT() when pool.method = "D2" and pool.robust = TRUE.

modnames

Optional character of model names to use as row names in the resulting matrix of results (when more than 2 models are compared)

asANOVA

logical indicating whether to return an object of class "anova". If FALSE, a numeric vector is returned for one (pair of) model(s), or a data.frame is returned for multiple pairs of models.

pool.method

character indicating which pooling method to use.

  • "D4", "new.LRT", "cm", or "chan.meng" requests the method described by Chan & Meng (2022). This is currently the default.

  • "D3", "old.LRT", "mr", or "meng.rubin" requests the method described by Meng & Rubin (1992).

  • "D2", "LMRR", or "Li.et.al" requests the complete-data LRT statistic should be calculated using each imputed data set, which will then be pooled across imputations, as described in Li, Meng, Raghunathan, & Rubin (1991).

Find additional details in Enders (2010, chapter 8).

omit.imps

character vector specifying criteria for omitting imputations from pooled results. Can include any of c("no.conv", "no.se", "no.npd"), the first 2 of which are the default setting, which excludes any imputations that did not converge or for which standard errors could not be computed. The last option ("no.npd") would exclude any imputations which yielded a nonpositive definite covariance matrix for observed or latent variables, which would include any "improper solutions" such as Heywood cases. Specific imputation numbers can also be included in this argument, in case users want to apply their own custom omission criteria (or simulations can use different numbers of imputations without redundantly refitting the model).

asymptotic

logical. If FALSE (default), the pooled test will be returned as an F-distributed statistic with numerator (df1) and denominator (df2) degrees of freedom. If TRUE, the pooled F statistic will be multiplied by its df1 on the assumption that its df2 is sufficiently large enough that the statistic will be asymptotically \chi^2 distributed with df1.

pool.robust

logical. Ignored unless pool.method = "D2" and a robust test was requested. If pool.robust = TRUE, the robust test statistic is pooled, whereas pool.robust = FALSE will pool the naive test statistic (or difference statistic) and apply the average scale/shift parameter to it. The harmonic mean is applied to the scaling factor, whereas the arithmetic mean is applied to the shift parameter.

Details

The "D2" method is available using any estimator and test statistic. When using a likelihood-based estimator, 2 additional methods are available to pool the LRT.

  • The Meng & Rubin (1992) method, commonly referred to as "D3". This method has many problems, discussed in Chan & Meng (2022).

  • The Chan & Meng (2022) method, referred to as "D4" by Grund et al. (2023), resolves problems with "D3".

When "D2" is not explicitly requested in situations it is the only applicable method, (e.g., DWLS for categorical outcomes), users are notified that pool.method was set to "D2".

pool.method = "Mplus" implies "D3" and asymptotic = TRUE (see Asparouhov & Muthen, 2010).

Note that the anova() method simply calls lavTestLRT.mi().

Value

  • When asANOVA=TRUE, returns an object of class stats::anova with a a test of model fit for a single model (object) or test(s) of the difference(s) in fit between nested models passed via ... (either an F or \chi^2 statistic, depending on the asymptotic argument), its degrees of freedom, its p value, and 2 missing-data diagnostics: the relative increase in variance (RIV = FMI / (1 - FMI)) and the fraction of missing information (FMI = RIV / (1 + RIV)).

  • When asANOVA=FALSE, returns a vector containing the LRT statistic for a single model or comparison of a single pair of models, or a data.frame of multiple model comparisons. Robust statistics will also include the average (across imputations) scaling factor and (if relevant) shift parameter(s), unless pool.robust = TRUE. When using pool.method = "D3" or "D4", the vector for a single model also includes its average log-likelihood and information criteria.

Author(s)

Terrence D. Jorgensen (University of Amsterdam; TJorgensen314@gmail.com)

Based on source code for lavaan::lavTestLRT() by Yves Rosseel.

References

Asparouhov, T., & Muthen, B. (2010). Chi-square statistics with multiple imputation. Technical Report. Retrieved from http://www.statmodel.com/

Chan, K. W., & Meng, X. L. (2022). Multiple improvements of multiple imputation likelihood ratio tests. Statistica Sinica, 32, 1489–1514. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.5705/ss.202019.0314")}

Enders, C. K. (2010). Applied missing data analysis. New York, NY: Guilford.

Grund, S., Lüdtke, O., & Robitzsch, A. (2023). Pooling methods for likelihood ratio tests in multiply imputed data sets. Psychological Methods, 28(5), 1207–1221. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1037/met0000556")}

Li, K.-H., Meng, X.-L., Raghunathan, T. E., & Rubin, D. B. (1991). Significance levels from repeated p-values with multiply-imputed data. Statistica Sinica, 1(1), 65–92. Retrieved from https://www.jstor.org/stable/24303994

Meng, X.-L., & Rubin, D. B. (1992). Performing likelihood ratio tests with multiply-imputed data sets. Biometrika, 79(1), 103–111. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.2307/2337151")}

Rubin, D. B. (1987). Multiple imputation for nonresponse in surveys. New York, NY: Wiley. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1002/9780470316696")}

See Also

lavaan::lavTestLRT() for arguments that can be passed via ..., and use lavaan::fitMeasures() to obtain fit indices calculated from pooled test statistics.

Examples

data(HS20imps) # import a list of 20 imputed data sets

## specify CFA model from ?lavaan::cfa help page
HS.model <- '
  visual  =~ x1 + x2 + x3
  textual =~ x4 + x5 + x6
  speed   =~ x7 + x8 + x9
'

fit1 <- cfa.mi(HS.model, data = HS20imps, estimator = "mlm")

## By default, pool.method = "D4".
## Must request an asymptotic chi-squared statistic
## in order to accommodate a robust correction.
lavTestLRT.mi(fit1, asymptotic = TRUE)
## or   anova(fit1, asymptotic = TRUE)

## Comparison with more constrained (nested) models: parallel indicators
HS.parallel <- '
  visual  =~ x1 + 1*x2 + 1*x3
  textual =~ x4 + 1*x5 + 1*x6
  speed   =~ x7 + 1*x8 + 1*x9
'

fitp <- cfa.mi(HS.parallel, data = HS20imps, estimator = "mlm")

## Even more constrained model: orthogonal factors
fit0 <- cfa.mi(HS.parallel, data = HS20imps, estimator = "mlm",
               orthogonal = TRUE)

## Compare 3 models, and pass the lavTestLRT(method=) argument

lavTestLRT.mi(fit1, fit0, fitp, asymptotic = TRUE,
              method = "satorra.bentler.2010")

## For a single model, you can request a vector instead of an anova-class
## table in order to see naive information criteria (only using D3 or D4),
## which are calculated using the average log-likelihood across imputations.
lavTestLRT.mi(fit1, asANOVA = FALSE)



## When using a least-squares (rather than maximum-likelihood) estimator,
## only the D2 method is available.  For example, ordered-categorical data:
data(binHS5imps) # import a list of 5 imputed data sets

## fit model using default DWLS estimation
fit1c <- cfa.mi(HS.model   , data = binHS5imps, ordered = TRUE)
fit0c <- cfa.mi(HS.parallel, data = binHS5imps, ordered = TRUE,
                orthogonal = TRUE)

## Using D2, you can either robustify the pooled naive statistic ...
lavTestLRT.mi(fit1c, fit0c, asymptotic = TRUE, pool.method = "D2")
## ... or pool the robust chi-squared statistic (NOT recommended)
lavTestLRT.mi(fit1c, fit0c, asymptotic = TRUE, pool.method = "D2",
              pool.robust = TRUE)

## When calculating fit indices, you can pass lavTestLRT.mi() arguments:
fitMeasures(fit1c, output = "text",
            # lavTestLRT.mi() arguments:
            pool.method = "D2", pool.robust = TRUE)



lavaan.mi documentation built on April 3, 2025, 9:36 p.m.