我正在尝试使用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
答案 0 :(得分:1)
您已经注意到,mice()
产生一个列表,即所有变量及其插补的列表,在您的情况下为两个插补,因为您选择了{{ 1}}。这就是多重插补的工作方式。这是一个m=2
数据包含在nhanes
中的示例:
mice
如果您使用OLS,则标准方法是使模型适合此列表,然后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
# [...]
将结果拟合。 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
中包含一个complete()
函数,该函数会产生一个mice
,您还可以使用它进行汇总计算。但是,应谨慎使用它,即使用"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"
个指标的每个子集计算gwqs
模型。
要立即汇总结果,您必须考虑方差之间和方差之内(请参见Rubin 1987:76)。
但是,要进一步详细说明这对于Stack Overflow来说太过分了。如果您不知道该怎么做,则需要咨询统计学家,或在Cross Validated询问如何做。
至少这是将".imp"
和mice
一起使用的一种方式。