诊断为什么 MICE 在尝试估算多级数据时会导致 R 崩溃

机器算法验证 r 缺失数据 多重插补 老鼠
2022-03-26 23:28:55

我以前从未遇到过 R 崩溃的问题。

我正在使用mice包(小鼠 2.13)来执行多重插补。该代码在数据的某些子集上运行良好,但是当我在其他子集上运行它时,R 崩溃(不是立即 - 一段时间后)。从 R 崩溃之前的输出来看,我相信它正在使用我已经运行 update.packages()2l.pan的插补方法(来自包)。pan

我该如何诊断这个问题?

Problem signature:
  Problem Event Name:   APPCRASH
  Application Name: Rgui.exe
  Application Version:  2.151.59607.0
  Application Timestamp:    4fe47a63
  Fault Module Name:    R.dll
  Fault Module Version: 2.151.59607.0
  Fault Module Timestamp:   4fe47a4e
  Exception Code:   c0000005
  Exception Offset: 0000000000032ec8
  OS Version:   6.1.7601.2.1.0.256.4
  Locale ID:    2057
  Additional Information 1: 7782
  Additional Information 2: 77823beb5887f451c3dd7ae4fe931995
  Additional Information 3: 4491
  Additional Information 4: 4491b41bf90894717964f5eef2cccd84

更新

我设法用数据创建了一个可重现的示例:

require(foreign)
require(mice)
require(pan)

dt.fail <- read.csv("http://goo.gl/pg8um")
dt.fail$X <- NULL

dt.fail$out <- as.factor(dt.fail$out )
dt.fail$grp<- as.factor(dt.fail$grp)
dt.fail$v1<- as.factor(dt.fail$v1)
dt.fail$v2<- as.factor(dt.fail$v2)
dt.fail$v3 <- as.factor(dt.fail$v3)
dt.fail$v7<- as.factor(dt.fail$v7)
dt.fail$v8 <- as.factor(dt.fail$v8)
dt.fail$v9 <- as.factor(dt.fail$v9)
dt.fail$v11 <- as.factor(dt.fail$v11)
dt.fail$v12 <- as.factor(dt.fail$v12)


PredMatrix <- quickpred(dt.fail)
PredMatrix['CTP',] <- c(1,-2,0,0,0,0,0,0,0,0,1,0,1,1,0,2)



impute = mice(
data=dt.fail, 
    m = 1, 
    maxit = 1,
    imputationMethod = c(
    "logreg",   # out
    "",      # grp   ----> cluster grouping factor
    "pmm",  # v1
    "polyreg",  # v2
    "logreg",   # v3
    "pmm",  # v4
    "logreg",   # v5
    "logreg",   # v6
    "polyreg",  # v7 ----> auxilliary
    "polyreg",  # v8 ----> auxilliary
    "polyreg",  # v9 ----> auxilliary
    "polyreg",  # v10 ----> auxilliary
    "",     # v11 ----> complete
    "",     # v12 ----> complete
    "2l.pan",   # CTP ----> multilevel imputation
    ""),        # const ----> needed for multilevel impuitation

predictorMatrix = PredMatrix, seed = 101
)

为了完整起见,这里是我使用的预测矩阵:

    .     out grp v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 CTP const
out     0   0  0  0  0  0  1  1  0  0  0   0   0   0   0     0
grp     0   0  0  0  0  0  0  0  0  0  0   0   0   1   0     0
v1      0   0  0  0  0  0  0  0  0  0  0   0   1   1   0     0
v2      0   0  0  0  0  1  1  1  0  1  0   0   1   1   1     0
v3      0   0  0  0  0  1  1  1  0  1  1   0   1   1   1     0
v4      0   0  0  1  1  0  1  1  0  1  1   0   1   1   1     0
v5      1   1  0  0  0  0  0  1  0  1  0   0   1   0   0     0
v6      1   1  0  1  0  1  1  0  0  1  0   0   1   0   0     0
v7      0   0  0  0  0  0  1  1  0  1  0   0   0   1   0     0
v8      0   0  0  0  0  0  1  1  0  0  0   0   1   1   0     0
v9      0   0  0  0  1  1  1  1  0  1  0   0   1   1   1     0
v10     0   0  0  0  0  0  1  1  0  1  0   0   1   1   0     0
v11     0   0  0  0  0  0  0  0  0  0  0   0   0   0   0     0
v12     0   0  0  0  0  0  0  0  0  0  0   0   0   0   0     0
CTP     1  -2  0  0  0  0  0  0  0  0  1   0   1   1   0     2
const   0   0  0  0  0  0  0  0  0  0  0   0   0   0   0     0
2个回答

对于大数据,我偶尔会遇到 2l 方法的问题,但从未见过 R 本身在它上面崩溃。我的猜测是它们与稀疏数据(非常小的集群)有关。相对于集群大小,您有多少个预测变量?

一些建议:

在您的数据中,您有几个协变量具有不完整的数据但未估算。请通过设置和检查检查是否mice在插补前删除它们如果要将这些用作预测变量,则应为它们指定插补方法。maxit = 0imp$log

mice包不使用任何自己的fortranC代码,但pan可能(我不知道)。如果你真的下定决心要找到问题的根源,我建议你查阅 Matloff 的书,其中包含有关高级调试技术的章节。

显而易见的另一条路线是尝试简化模型。去除多余的预测变量,使用以簇分配为固定因素的平面文件(例如pmm),并检查观察数据和估算数据的类内相关性是否相似。

截距项是由“mice.impute.2l.pan”自动添加的,所以你不需要它。

希望这可以帮助。

我找到了导致崩溃的原因 - 有一个缺失值grp(没有被估算)。尽管如此,它崩溃 R 似乎并不完全正确!运行后

dt.fail <- dt.fail[!is.na(dt.fail$grp),]

它不再崩溃,而是生成以下错误:

Error in order(dfr$group) : argument 1 is not a vector

我将发布一个单独的问题。