我想在R
中使用mice
运行150次多重插补。然而,为了保存一些计算时间,我想将进程细分为并行流(正如Stef货车Buuren在“Flexible Importation for Missing Data”中所建议的那样)。
我的问题是:怎么做?
我可以想象两种选择:
选项1:
imp1<-mice(data, m=1, pred=quicktry, maxit=15, seed=1)
imp2<-mice(data, m=1, pred=quicktry, maxit=15, seed=1)
imp...<-mice(data, m=1, pred=quicktry, maxit=15, seed=1)
imp150<-mice(data, m=1, pred=quicktry, maxit=15, seed=1)
字符串
然后使用complete
和as.mids
将插补组合在一起
选项2:
imp1<-mice(data, m=1, pred=quicktry, maxit=15, seed=VAL_1to150)
imp2<-mice(data, m=1, pred=quicktry, maxit=15, seed=VAL_1to150)
imp...<-mice(data, m=1, pred=quicktry, maxit=15, seed=VAL_1to150)
imp150<-mice(data, m=1, pred=quicktry, maxit=15, seed=VAL_1to150)
型
通过添加VAL_1to150
,否则在我看来(我可能错了),如果它们都使用相同的数据集和相同的种子运行,您将获得150倍的相同结果。
还有其他选择吗
谢啦,谢啦
2条答案
按热度按时间ztmd8pv51#
所以主要的问题是组合估算,正如我所看到的,有三种选择,使用
ibind
,complete
,或者试图保持mids结构。我强烈建议使用ibind
解决方案。其他的答案留给那些好奇的人。获取并行结果
在做任何事情之前,我们需要得到平行小鼠的插补。并行部分相当简单,我们需要做的就是使用并行包,并确保使用
clusterSetRNGStream
设置种子:字符串
以上将产生
cores_2_use * 30
插补数据集。使用
ibind
正如@AleksanderBlekh所建议的那样,
mice::ibind
可能是最好,最直接的解决方案:型
使用
foreach
和ibind
也许最简单的替代方案是使用
foreach
:型
使用
complete
使用
complete(..., action="long")
,rbind
提取完整的数据集,然后使用as.mids
其他mice
对象可能工作得很好,但它生成的对象比其他两种方法更苗条:型
给出输出:
型
保持正确的mids-object
下面我的替代方法展示了如何合并填充对象并保留
mids
对象背后的全部功能。自从ibind
解决方案之后,我就把这个留给了那些对探索如何合并复杂列表感兴趣的人。我已经研究了
mice
的mids对象,为了在并行运行后获得至少一个类似的mids对象,你必须采取一些步骤。如果我们检查mids对象并比较两个具有两种不同设置的对象,我们得到:型
其中可以看到调用m、imp、chainMean和chainVar在两次运行之间不同。其中小鬼无疑是最重要的,但它似乎是一个明智的选择,以更新其他组件以及。因此,我们将从构建一个mice合并函数开始:
型
我们现在可以简单地通过以下方式合并上述两个生成的估算:
型
现在看来,我们得到了正确的输出:
型
提供:
型
好了,就这样。玩得开心
cgh8pdjw2#
mice 3.15.0
和更高版本具有提供并行处理的新futuremice()
函数。它取代了旧的parlmice()
方法。