我最近在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值的特定值(无论是观察还是估算)。我认为 最直接的方法是通过后处理。我可以管理简单的限制,例如设置MaininterestVar 如果Var1高于8,则为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&lt; 8的MaininterestVar设置为0?虽然这似乎在这个例子中是正确的,但这不是一个特定的限制,我想确保这种情况发生。
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)在这里发生。
提前致谢!