使用 'mice' 调整后的 R 平方

Adjusted R squared using 'mice'

我正在使用 lme4 的 mice 包和 lmer 进行分析。但是,pool.r.squared() 不适用于此输出。我正在寻找有关如何在以下工作流程中计算调整后的 R 平方的建议。

require(lme4, mice)
imp <- mice(nhanes)
imp2 <- mice::complete(imp, "all") # This step is necessary in my analyses to include other variables/covariates following the multiple imputation
fit <- lapply(imp2, lme4::lmer, 
              formula = bmi ~ (1|age) + hyp + chl,
              REML = T)
est <- pool(fit)
summary(est)

这里有两个不同的问题。

首先,关于 multilevel/mixed-model 回归的 R 平方实际上是什么,存在多种观点。这就是 pool.r.squared 对您不起作用的原因,因为它不接受 lm() 以外的任何结果。我没有答案告诉你如何为你的模型计算 R 平方值,因为这是一个统计问题——而不是编程问题——我不会详细说明。然而,快速搜索表明,对于某些类型的多级 R 方,有适用于 R 的函数,例如mitml::multilevelR2.

其次,为了汇总插补样本的统计数据,它应该是正态分布的。因此,您必须将 R-squared 转换为 Fisher's Z,并在池化后对其进行反向转换。参见 https://stefvanbuuren.name/fimd/sec-pooling.html

在下文中,我假设您有一种方法(或多种选择)来计算您的(调整后的)R 平方。假设您使用 mitl::multilevelR2 并选择 LaHuis 等人的方法。 (2014),您可以通过以下步骤计算并将其汇总到您的估算中:

# what you did before:
imp <- mice::mice(nhanes)
imp2 <- mice::complete(imp, "all")
fit_l <- lapply(imp2, lme4::lmer, 
              formula = bmi ~ (1|age) + hyp + chl,
              REML = T)

# get your R-squareds in a vector (replace `mitl::multilevelR2` with your preferred function for this)
Rsq <- lapply(fit_l, mitml::multilevelR2, print="MVP")
Rsq <- as.double(Rsq)

# convert the R-squareds into Fisher's Z-scores
Zrsq <- 1/2*log( (1+sqrt(Rsq)) / (1-sqrt(Rsq)) )

# get the variance of Fisher's Z (same for all imputation samples)
Var_z <- 1 / (nrow(imp2$`1`)-3)
Var_z <- rep(Var_z, imp$m)

# pool the Zs
Z_pool <- pool.scalar(Zrsq, Var_z, n=imp$n)$qbar

# back-transform pooled Z to Rsquared
Rsq_pool <- ( (exp(2*Z_pool) - 1) / (exp(2*Z_pool) + 1) )^2

Rsq_pool #done