我想做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
不是常规的数据帧结构。
如何修改代码实现批量输出不同变量的汇总结果?
编辑:我在下面贴出了data_im的结构。
mice()
是对缺失数据进行多元插补的函数。 https://www.rdocumentation.org/packages/mice/versions/3.15.0/topics/mice
对于动态生成模型公式,您可以查看
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))