密度图鼠标中的错误 - 缺失数据示例

问题描述

我有以下数据:

dput(example)
structure(list(q1 = c(5,22,16,24,9,20,21,28,25,34,29,NA,13,10,17,35,23,27,5,19,30,18,15,30),q2 = c(5,26,14,11,12,8,6,18),q3 = c(11,33,31,7,32,26),q4 = c(14,q5 = c(5,16),q6 = c(15,38,42,36,11)),class = "data.frame",row.names = c(NA,-60L))

然后我使用鼠标:

*edit: 忘记整行

library(mice)
imp <- mice(example,m=5,maxit=50,meth='pmm',seed=500)
example_i <- complete(imp,1)

但是在尝试获取密度图时出现以下错误

 densityplot(imp)
Error in str2lang(x) : <text>:2:0: unexpected end of input
1: ~
   ^ 

我的问题是:

  1. 我估算缺失数据的方法是否存在根本性错误? (这只是一个小例子)
  2. 我是否正确使用了 MICE 参数?
  3. 密度图有什么问题,因为我已经在我使用的所有其他尺度上得到了它?

解决方法

回答

您需要为 densityplot 提供一个公式,否则它将绘制具有 > 2 个缺失值的所有变量。由于您没有任何具有 2 > 个缺失值的变量,而且 densityplot 不希望出现这种情况,因此会产生这个神秘的错误。


有效示例

example$q4[1:10] <- NA
imp <- mice(example,m = 5,maxit = 50,meth = "pmm",seed = 500)
densityplot(imp) 
# equivalent: densityplot(imp,~ q4)

density plot


基本原理

imp 属于 mids 类,因此您正在调用 densityplot.mids。通常,densityplot.mids 要求您提供公式(data 参数),以便它知道要绘制哪些变量(请参阅 ?densityplot.mids)。如果要绘制 q4,则代码为 densityplot(imp,~ q4)

densityplot.mids 中,我们看到:

if (missing(data)) {
    vnames <- vnames[!allfactors & x$nmis > 2 & x$nmis < 
        nrow(x$data) - 1]
    formula <- as.formula(paste("~",paste(vnames,collapse = "+",sep = ""),sep = ""))
}

如果我们在收到错误后立即使用 traceback(),那么您会看到上面的最后一行是引发错误的行。

在第一行,你可以看到条件xnmis > 2,这意味着它将抓取所有缺失值超过2个的列。当没有列满足条件时,vnames 将计算为 character(0),因此后续行作为输出 ~ 产生,即您在错误中看到的代码。

那么,为什么缺失太少会报错呢?这是因为 densityplot 绘制分布图,而绘制 1 或 2 个点的分布图是不可行的。


建议

包维护者可以通过简单地检查 vnames 是否有任何内容来改善错误,如果没有,他们可以抛出一个提供信息的错误。如果您认为它有用,您可能希望将其添加为 an issue on Github