有没有办法一起使用 mice 包和 gWQS 包?
Is there any way to use mice package and the gWQS package together?
我正在尝试使用 mice
包来估算大型数据集的 C1-C3 变量的缺失值。到目前为止,这是有效的。当我尝试使用 gWQS
包来进行混合物效应 X1-X4 化学品时,问题就出现了。
我尝试使用 mice
包来估算协变量的缺失值,然后我尝试使用 gWQS
包中的估算数据框来进行 WQS 回归。但是,我的代码不被接受,因为 imp$imp 是一个列表。我也尝试过 miWQS
包,但是该包对我不想使用的插补方法有限制。
原始数据集包含作为连续结果的 Y X1-X4 作为暴露的连续测量值和 C1-C3 作为协变量,这些协变量用 mice
.
估算
使用 mice
的插补模型
imp <- mice::mice(originaldf,m=2, meth=meth, pred=pred,
seed=51162,visitSequence="monotone", pri=FALSE)
toxic_chems=c("X1" , "X2", "X3", "X4")
set.seed(2019)
library("gWQS")
gwqs(Y ~ C1 C2 C3, mix_name=toxic_chems, data=imp$imp,
q=4, validation=0.8, valid_var=NULL, b=10, b1_pos=F, b1_constr=F,
family="gaussian", seed=2019, wqs2=T, plots=T, tables=T)
错误:
Error in .check.function(formula, mix_name, data, q, validation, valid_var, :
data must be a data.frame
正如您已经注意到的那样,mice()
生成一个列表,即所有变量及其插补的列表,在您的情况下为 两个 插补,因为您已选择 m=2
。这就是多重插补的工作原理。这里有一个 nhanes
数据包含在 mice
:
中的例子
imp <- mice::mice(nhanes, m=2)
imp$imp
# $age
# [1] 1 2
# <0 rows> (or 0-length row.names)
#
# $bmi
# 1 2
# 1 30.1 25.5
# 3 27.2 28.7
# 4 20.4 24.9
# [...]
#
# $hyp
# 1 2
# 1 1 1
# 4 1 2
# 6 1 2
# [...]
#
# $chl
# 1 2
# 1 187 187
# 4 131 186
# 10 229 187
# [...]
如果您使用 OLS,标准方法是在此列表上拟合模型,然后 pool
结果。 mice
然后是使用包中包含的 lm.mids
方法。
fit <- with(data=imp, exp=lm(bmi ~ age + hyp + chl))
pool(fit)
pool(fit)$pooled[, 1:5] # shortened
# estimate ubar b t dfcom
# (Intercept) 20.28615169 1.354978e+01 6.556134e+00 2.338398e+01 21
# age -3.01670128 1.081655e+00 1.238383e-03 1.083512e+00 21
# hyp 1.89935232 4.074904e+00 2.092851e+00 7.214181e+00 21
# chl 0.04517373 3.813968e-04 5.113178e-06 3.890666e-04 21
这就是你 运行 遇到问题的地方,因为不存在 gwqs.mids
方法(但有 glm.mids
方法),你可能需要写自己安装,或询问包的作者之一。
但是,mice
中包含一个 complete()
函数,它产生一个 "data.frame"
,您也可以使用它进行合并计算。但是,它应该谨慎使用,即使用 "long"
格式以外的所有格式(即只有一个单一的插补)将是非常错误的。
complete(imp, "long")
# .imp .id age bmi hyp chl
# 1 1 1 1 30.1 1 187
# 2 1 2 2 22.7 1 187
# 3 1 3 1 27.2 1 187
# [...]
# 26 2 1 1 25.5 1 187
# 27 2 2 2 22.7 1 187
# 28 2 3 1 28.7 1 187
# [...]
class(complete(imp, "long"))
# [1] "data.frame"
".imp"
变量现在表示插补的数量,您可以为 ".imp"
指标的每个子集计算您的 gwqs
模型。
现在要汇总结果,您必须考虑方差之间和方差之内(参见 Rubin 1987:76)。
不过,要进一步详细说明这一点,对于 Stack Overflow 来说就太过分了。如果您不知道如何执行此操作,则需要咨询统计学家,或通过 Cross Validated 询问如何执行此操作。
至少这是一种同时使用 mice
和 gWQS
的方法。
我正在尝试使用 mice
包来估算大型数据集的 C1-C3 变量的缺失值。到目前为止,这是有效的。当我尝试使用 gWQS
包来进行混合物效应 X1-X4 化学品时,问题就出现了。
我尝试使用 mice
包来估算协变量的缺失值,然后我尝试使用 gWQS
包中的估算数据框来进行 WQS 回归。但是,我的代码不被接受,因为 imp$imp 是一个列表。我也尝试过 miWQS
包,但是该包对我不想使用的插补方法有限制。
原始数据集包含作为连续结果的 Y X1-X4 作为暴露的连续测量值和 C1-C3 作为协变量,这些协变量用 mice
.
使用 mice
imp <- mice::mice(originaldf,m=2, meth=meth, pred=pred,
seed=51162,visitSequence="monotone", pri=FALSE)
toxic_chems=c("X1" , "X2", "X3", "X4")
set.seed(2019)
library("gWQS")
gwqs(Y ~ C1 C2 C3, mix_name=toxic_chems, data=imp$imp,
q=4, validation=0.8, valid_var=NULL, b=10, b1_pos=F, b1_constr=F,
family="gaussian", seed=2019, wqs2=T, plots=T, tables=T)
错误:
Error in .check.function(formula, mix_name, data, q, validation, valid_var, :
data must be a data.frame
正如您已经注意到的那样,mice()
生成一个列表,即所有变量及其插补的列表,在您的情况下为 两个 插补,因为您已选择 m=2
。这就是多重插补的工作原理。这里有一个 nhanes
数据包含在 mice
:
imp <- mice::mice(nhanes, m=2)
imp$imp
# $age
# [1] 1 2
# <0 rows> (or 0-length row.names)
#
# $bmi
# 1 2
# 1 30.1 25.5
# 3 27.2 28.7
# 4 20.4 24.9
# [...]
#
# $hyp
# 1 2
# 1 1 1
# 4 1 2
# 6 1 2
# [...]
#
# $chl
# 1 2
# 1 187 187
# 4 131 186
# 10 229 187
# [...]
如果您使用 OLS,标准方法是在此列表上拟合模型,然后 pool
结果。 mice
然后是使用包中包含的 lm.mids
方法。
fit <- with(data=imp, exp=lm(bmi ~ age + hyp + chl))
pool(fit)
pool(fit)$pooled[, 1:5] # shortened
# estimate ubar b t dfcom
# (Intercept) 20.28615169 1.354978e+01 6.556134e+00 2.338398e+01 21
# age -3.01670128 1.081655e+00 1.238383e-03 1.083512e+00 21
# hyp 1.89935232 4.074904e+00 2.092851e+00 7.214181e+00 21
# chl 0.04517373 3.813968e-04 5.113178e-06 3.890666e-04 21
这就是你 运行 遇到问题的地方,因为不存在 gwqs.mids
方法(但有 glm.mids
方法),你可能需要写自己安装,或询问包的作者之一。
但是,mice
中包含一个 complete()
函数,它产生一个 "data.frame"
,您也可以使用它进行合并计算。但是,它应该谨慎使用,即使用 "long"
格式以外的所有格式(即只有一个单一的插补)将是非常错误的。
complete(imp, "long")
# .imp .id age bmi hyp chl
# 1 1 1 1 30.1 1 187
# 2 1 2 2 22.7 1 187
# 3 1 3 1 27.2 1 187
# [...]
# 26 2 1 1 25.5 1 187
# 27 2 2 2 22.7 1 187
# 28 2 3 1 28.7 1 187
# [...]
class(complete(imp, "long"))
# [1] "data.frame"
".imp"
变量现在表示插补的数量,您可以为 ".imp"
指标的每个子集计算您的 gwqs
模型。
现在要汇总结果,您必须考虑方差之间和方差之内(参见 Rubin 1987:76)。
不过,要进一步详细说明这一点,对于 Stack Overflow 来说就太过分了。如果您不知道如何执行此操作,则需要咨询统计学家,或通过 Cross Validated 询问如何执行此操作。
至少这是一种同时使用 mice
和 gWQS
的方法。