我想做t检验(或chi^2检验)来估计
grou=0
和grou=1
之间变量的差异。数据集中的所有变量均由 MICE 估算。变量包括AGE
、SCORE
、GENDER
、HEART
等; AGE
和SCORE
是连续变量,GENDER
和HEART
是分类变量。
如果一次只对一个变量做t检验,我知道代码是:
library(MICE)
data_im<-mice(data, m=5,seed=6666)
summary(pool(with(data_im,glm(AGE~grou))))
输出
p-value
也是t检验的p-value
但是我需要评估的变量太多了,所以我想写一个for循环或者创建一个函数来一次输出多个变量的汇总测试结果
我试过写:
vars <- c("AGE","SCORE","GENDER","HEART")
afterMICE <- c()
for(i in 1:4){
pool_fitMICE <- pool(with(data_im,glm(substitute(y ~ grou,list(y=as.name(vars[i]))))))
}
**Error in eval(predvars, data, env) : object 'AGE' not found**
afterMICE <- rbind(afterMICE,C(vars[i],coef(summary(pool_fitMICE))[2,c(1,2,4)]))
我知道错误的原因是
data_im
不是常规的数据帧结构。
如何修改代码实现批量输出不同变量的汇总结果?
#-------------------------------------------- ------------------------------
编辑:
mice()
是对缺失数据进行多元插补的函数。 https://www.rdocumentation.org/packages/mice/versions/3.15.0/topics/mice
以
data("nhanes2")
为例,我们可以看到data_im
的结构。
library(MICE)
data("nhanes2")
vars=c("bmi","chl","age","hyp")
catvars=c("age","hyp")
data_im=mice(nhanes2,m=5,seed=6666)
pool.fits <- pool(with(data_im, glm(age~hyp)))
但是我们需要对
pool(with(data_im, glm(vars~hyp)))
的结果进行batch pool(vars
中的变量轮流作为glm()
中的因变量,以hyp
为自变量。)
对于动态生成模型公式,您可以查看
reformulate
。 reformulate
可能会把你从paste
/substitute
/as.name
地狱中拯救出来。我相信我们也不需要with()
。它可能会产生一些环境混乱。
vars <- c("AGE","SCORE","GENDER","HEART")
list_of_formulas <- lapply(vars, \(x) reformulate(termlabels = 'grou', response = x))
查看创建的公式列表:
[[1]]
AGE ~ grou
<environment: 0x557191bff8b8>
[[2]]
SCORE ~ grou
<environment: 0x557191c07b58>
[[3]]
GENDER ~ grou
<environment: 0x557191cb30f8>
[[4]]
HEART ~ grou
<environment: 0x557191ccad40>
然后在你的 for 循环中使用这个列表。
pool_fitMICE <- list()
for(i in 1:4){
pool_fitMICE[[i]] <- pool(glm(formula = list_of_formulas[[i]], data = data_im))
}
如果我们使用循环函数,我们还可以避免启动输出列表或使用 for 循环的需要:
lapply(list_of_formulas, \(x) pool(glm(formula = x, data = data_im))
在这种情况下,您实际上不需要乱用
eval
和substitute
。您可以正常创建公式(例如使用 as.formula
),当在 with
中计算公式时,它将自动在估算数据中找到变量。
library(mice)
set.seed(123)
vars <- c("age", "bmi", "chl")
imps <- mice(nhanes, printFlag = FALSE)
mods <- list()
for(i in seq_along(vars)) {
mods[[i]] <- pool(with(imps,
glm(as.formula(paste0(vars[[i]], "~ hyp")))))
}
names(mods) <- vars
lapply(mods, summary)
#> $age
#> term estimate std.error statistic df p.value
#> 1 (Intercept) 0.5216374 0.4873196 1.070422 17.71793 0.2987954
#> 2 hyp 1.0163241 0.3744249 2.714360 19.13894 0.0136971
#>
#> $bmi
#> term estimate std.error statistic df p.value
#> 1 (Intercept) 27.0037636 2.882558 9.36798555 16.45801 5.297937e-08
#> 2 hyp -0.1502389 2.191507 -0.06855506 18.35948 9.460849e-01
#>
#> $chl
#> term estimate std.error statistic df p.value
#> 1 (Intercept) 157.88698 24.65957 6.402665 20.91373 2.445428e-06
#> 2 hyp 29.06627 19.62684 1.480945 19.90150 1.542804e-01
创建于 2023-03-08 与 reprex v2.0.2