我最近发现R中的MICE包用于多重插补,我目前正在学习我的方法 . 我想尝试对我归咎的一些变量设置限制 . 虽然“灵活插入缺失数据”一书提供了一些简单的例子,但我想要了解一些更为复杂的限制 . 但是,我在确定如何正确指定限制方面遇到了一些麻烦 .

例如,请考虑以下数据集:

#Variables to use for restrictions'     
Var1= c(6, 10, 2, 12, 15, NA, 14, NA, 16, 2, 1, 0, 20, NA,NA,NA, 9, 17, 15,13)' 
 Var2= c(35, NA, 23,22, 33, 45, NA, 34, 12, 32, 33, 18, 18,NA,NA, NA, 22, NA, 19, 35)

  #Testvariable 1 check imputation restrictions
  TestVar1 = c(54, 6000, 56,42, 53, 63, 700, 52, 48, 47, 54, 69, 61,935,675, 456, 42, 912, 59, 55)

  #Variable I want to impute given certain restrictions
  MaininterestVar = c(1, NA, 0, 1, 1, NA, NA ,NA, 0, 0, 0, 0, 1, NA, NA, NA, 0, NA, 0, 1)

  #Overview of the data
   dat=data.frame(Var1 = Var1, Var2 = Var2, TestVar1 = TestVar1,     MaininterestVar = MaininterestVar)
   View(dat)`

我想将MaininterestVar设置为给定Var1和Varlo2值的特定值(无论是被观察还是估算) . 我认为最直接的方法是通过后期处理 . 我可以管理简单的限制,例如如果Var1高于8,则将MaininterestVar设置为1:

library(mice)

base_imputation <- mice(dat, m=0, maxit = 0, seed = 835)
post <-base_imputation$post
methods = base_imputation$meth

post["MaininterestVar"] <- "imp[[j]][p$data$Var1[!r[,j]]>8,i]  <- 1"
Restricted_imputation<- mice(dat, m=2, maxit = 20,method = methods,post=post, seed = 835) 

   #looks ok
completeoverview= complete(Restricted_imputation,1)
View(completeoverview)
completeoverview2= complete(Restricted_imputation,2)
View(completeoverview2)

但是,我遇到了以下问题:

1)如何确保Var1 <8时MaininterestVar设置为0?虽然这在这个例子中似乎是正确的,但这不是一个特定的限制,我想确保这种情况发生 .

2)假设我想要将MaininterestVar设置为TestVar1中列出的值而不是0,而不是0,那么我想将MaininterestVar设置为与推算的MaininterestVar在同一行中的值?例如,第2行中MaininterestValue的插补值将为6000,具体取决于Var 1的观察值或估算值是否小于8 . 我认为这应该是可行的,通过指定被估算的变量的行索引,但我无法正确指定它 .

以下代码:

base_imputation <- mice(dat, m=0, maxit = 0, seed = 835)
post <-base_imputation$post
methods = base_imputation$meth

post["MaininterestVar"] <- "imp[[j]][p$data$Var1[!r[,j]]>8,i]  <- p$data$TestVar1[!r[,j]]"
Restricted_imputation<- mice(dat, m=2, maxit = 20,method = methods,post=post, seed = 835)

给我错误:

iter imp variable
  1   1  Var1  Var2  MaininterestVarError in `[<-.data.frame`(`*tmp*`,     p$data$Var1[!r[, j]] > 8, i, value = c(6000,  : 
  replacement has 8 rows, data has 6

这表明需要一些额外的行索引规范,但我不太清楚如何这样做 .

3)最后,假设我想将MaininterestVar设置为0,如果Var1 <5(这与一般数据模式相反,我用它来检查限制是否有效)和Var2> 28 . 我尝试过如下规格:

base_imputation <- mice(dat, m=0, maxit = 0, seed = 835)
post <-base_imputation$post
methods = base_imputation$meth

post["MaininterestVar"] <- "imp[[j]][(p$data$Var1[!r[,j]]<5)&(p$data$Var2[!r[,j]]>28),i]  <- 1"
Restricted_imputation<- mice(dat, m=2, maxit = 20,method = methods,post=post, seed = 835) 

completeoverview= complete(Restricted_imputation,1)
View(completeoverview)

#Row 2 in completeoverview is 1, despite Var1 being 10.

但是MICE似乎不会同时处理这两个限制(并且不会提供它没有的错误消息),或者问题1)在这里发生 .

提前致谢!