使用 MICE 包,如何从变量列表创建模型列表以使用 glm 进行测试

问题描述 投票:0回答:2

我想做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
为自变量。)

r loops imputation r-mice
2个回答
0
投票

对于动态生成模型公式,您可以查看

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))

0
投票

在这种情况下,您实际上不需要乱用

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

© www.soinside.com 2019 - 2024. All rights reserved.