2

我最近在 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) 我怎样才能确保 MaininterestVar 设置为 0 对于 Var1<8?虽然在这个例子中这似乎是正确的,但这不是一个特定的限制,我想确保这种情况发生。

2) 假设我想将 MaininterestVar 设置为与估算的 MaininterestVar 在同一行中的 TestVar1 中列出的值,而不是 0?例如,第 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)在这里发生。

提前致谢!

4

0 回答 0