使r输出中的mi输出可重现

时间:2016-07-01 18:56:52

标签: r

我正在使用套餐" mi"在R中做多次插补以填补缺失的数据。我运行了20个链,然后使用这些链获得每个缺失数据的平均估计值。

但是,如果我再次运行代码,即使在函数外部使用set.seed()或/并将seed = MYSEED添加到我的mi调用中,我得到(略微)不同的结果。

我有什么方法可以获得可重现的数据,或者由于多重插补的工作方式,这是不可能的?

示例数据:

DATA
    ID   V1   V2   V3
    107621 11.50171 16.64066 16.65306
    107681 12.76660 17.38262 16.70621
    137411 11.91239 17.11157 17.31341
    157451 11.47981 16.56674 20.06920
    166811 12.18617 17.08419 20.60378
    167771 11.82204       NA 19.46740
    176171 11.78097 16.95551 24.80159
    176591 11.86585 17.02943 17.96875
    186161 12.12046 17.07597 18.19658
    187481 11.38946 16.46817 22.58955    

代码运行1:

MV_DATA<-missing_data.frame(DATA)
imp.DATA<-mi(MV_DATA, n.chains=20, seed=1204688)
MI_RESULTS<-as.data.frame(complete(imp.DATA))

MI_RESULTS_FIRST<-MI_RESULTS[6,1:5]

代码运行2:

MV_DATA<-missing_data.frame(DATA)
imp.DATA<-mi(MV_DATA, n.chains=20, seed=1204688)
MI_RESULTS<-as.data.frame(complete(imp.DATA))

MI_RESULTS_SECOND<-MI_RESULTS[6,1:5]

比较:

MI_RESULTS_FIRST
      chain.1.ID chain.1.V1 chain.1.V2 chain.1.V3 chain.1.missing_V2 
      167771       11.82204       17.23201        19.4674        TRUE

MI_RESULTS_SECOND
      chain.1.ID chain.1.V1 chain.1.V2 chain.1.V3  chain.1.missing_V2 
      167771       11.82204       16.93971        19.4674        TRUE      

所需的输出是输出1 ==输出2,但是这失败了 - 推算值(chain.1.V2)在运行之间不同。

解决方案(下面的信用答案)是在代码中使用parallel = F:

...
imp.DATA<-mi(MV_DATA, n.chains=20, seed=1204688, parallel=F)
...

然而,这只是部分解决方案,因为seed = T,parallel = T无法产生可重现的结果。这可能是一个错误。包装维护人员提出了这个问题[PACKAGE MAINTAINER&#39; S RESPONSE TO FOLLOW]

1 个答案:

答案 0 :(得分:3)

根据mi如何并行化链(默认情况下它),它不可重现。因此,如果设置parallel=FALSEseed参数将起作用(尽管速度成本很高)。

实施例

library(mi)
# Example from ?mi
data(CHAIN, package = "mi")
mdf <- missing_data.frame(CHAIN) # warnings about missingness patterns
mdf <- change(mdf, y = "log_virus", what = "transformation", to = "identity")

imp1 <- mi(mdf, seed=1)
imp2 <- mi(mdf, seed=1)
identical(imp1, imp2)
#[1] FALSE

imp1 <- mi(mdf, parallel=FALSE, seed=1)
imp2 <- mi(mdf, parallel=FALSE, seed=1)

identical(imp1, imp2)
#[1] TRUE

但请看上面的评论。 <击> 1。可能有一种方法以某种方式将种子传递到簇中(我不知道如何) 2.如果没有,它应该被认为是一个bug