我最近在 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)在这里发生。
提前致谢!