0

我正在尝试对具有交叉分类嵌套的数据集执行多重插补(即,数据嵌套在两个不相互嵌套的不同分组变量中;下面代码中的 group1 和 group2)。为了解释多级结构,我在miceadds 包中使用了method="2l.pmm"。但是,当我运行代码时,我收到一条错误消息:

“z0* u[index_clus, 1:NR, drop = FALSE] 中的错误:不一致的数组

我想知道为什么我会收到这条消息。

我试图估算的完整数据集有 279 行和 188 列。因为我在研究中采用了计划缺失,所以其中大约 120 列需要插补。为了缩小错误代码的原因,我尝试将数据集大大减少为两个分组变量和几个其他变量。当我添加第二个分组变量(group2)作为预测变量时,似乎出现了问题。

library(mice)
library(miceadds)

#Partial dataset
dat <- data.frame(
     group1 = #Grouping variable 1
c(44,17,12,3,19,28,28,16,47,33,28,42,50,38,22,33,15,44,33,28,7,47,38,16,49,23,11,17,28,50,49,17,38,31,28,49,17,22,26,11,45,10,26,7,60,7,17,37,44,16),
     group2 = #Grouping variable 2
c(34,26,40,6,40,9,11,40,36,36,9,39,36,36,36,36,36,36,36,7,3,40,4,40,7,36,36,26,11,36,7,40,36,11,9,7,26,40,36,36,36,31,36,19,31,19,36,7,36,11),
     VarA = #Response to a survey item
c(3,2,3,NA,NA,5,4,4,NA,2,3,NA,NA,4,4,3,NA,3,3,NA,2,NA,NA,2,NA,4,NA,NA,5,NA,NA,4,4,NA,4,5,2,4,1,NA,2,3,NA,NA,4,3,NA,2,2,NA),
     VarB = #Response to another survey item
c(4,NA,NA,3,2,3,1,NA,3,2,NA,5,2,NA,2,NA,1,2,NA,2,NA,NA,NA,3,4,NA,2,NA,NA,NA,2,3,4,4,4,4,2,NA,NA,2,1,3,2,2,3,3,NA,NA,1,4))

#Imputation method
medat <- make.method(dat)
medat[c("group1","group2","VarA","VarB")] <- c("","","2l.pmm","2l.pmm")

#Predictor matrix
mepred <- make.predictorMatrix(dat)
mepred[c("VarA","VarB"),c("group1","group2")] <- -2
mepred[c("group1","group2")] <- 0

#Imputation
impdat <- mice(dat,method=medat,predictorMatrix=mepred,m=5,maxit=5,seed=5000)

我怀疑错误可能是由于某些组的样本量仅为 1;但是,当包含的变量只有 group1、VarA 和 VarB 时,代码会运行。group1 的某些级别的样本大小仅为 1,因此这似乎不是问题。

可能导致错误的代码或数据集有哪些潜在问题?任何输入将不胜感激!

4

1 回答 1

0

在解决了同样的问题之后,我找到了一个可能也可以帮助您(和其他人)的解决方案。就我而言,问题出在预测矩阵中。我已将我的集群变量定义如下:

mepred [,"group1"] <- -2 

但是,我忘记将对角线设置为 0:

mepred ["group1", "group1"] <- 0

在您的情况下,您似乎没有正确定义集群变量。您的示例中的以下代码:

mepred[c("VarA","VarB"),c("group1","group2")] <- -2
mepred[c("group1","group2")] <- 0

强制 mepred 从矩阵到数值变量。除非我误解了您的数据是如何聚集的,否则您应该将 group1 和 group2 设置为 -2,然后将对角线设置为 0。所以:

mepred <- make.predictorMatrix(dat)
mepred[c("VarA","VarB"),c("group1","group2")] <- -2
mepred[c("group1","group2")] <- 0

但是,当我使用您的数据执行此操作时,它也会出错。您是否检查过应用 2l.pmm 是否可以识别 2 个不同的集群变量?如果我只识别 1(即 group1),则脚本会运行并工作。也许您可以将 group1 和 group2 中的信息组合在一个变量中?

于 2020-01-08T09:08:34.703 回答