【发布时间】:2019-03-06 20:21:27
【问题描述】:
去年,我使用来自this question 的信息构建了一个自定义函数,以使用 R 中的 MICE 在简单的逻辑约束下估算缺失数据。以下代码仍然适用于 2.30 版的鼠标,但从 2.46 版起将无法使用(和老鼠现在是3.3)。这是我正在尝试做的事情,包括 MWE 以及对我迄今为止所尝试的内容的完整解释。
鉴于以下数据,(N,Y)组合是不可能的(结构零)。所有其他组合都很好。因此,第 7、9 和 10 行中的缺失数据可以估算为 Y 或 N,但第 8 行中 y4 的缺失值被限制为“N”。
df <- data.frame(U = runif(10),
y4 = factor(c("N", "N", "Y", "Y", "Y", "Y", NA, NA, "Y", "Y")),
y5 = factor(c("N", "N", "Y", "Y", "N", "N", "N", "Y", NA, NA)))
> df
U y4 y5
1 0.49717835 N N
2 0.37466084 N N
3 0.14765796 Y Y
4 0.98469334 Y Y
5 0.33477385 Y N
6 0.96072250 Y N
7 0.47953952 <NA> N
8 0.08374912 <NA> Y
9 0.27682921 Y <NA>
10 0.13180437 Y <NA>
由于 y4 和 y5 是因子,我们使用多头回归模型来生成插补。下面的代码做到了这一点,没有错误。
library(mice)
mice(df, m=2, method=c("", "polyreg", "polyreg"), maxit = 5)
polyreg 函数调用mice.impute.polyreg 函数。在每次迭代中,传递给mice.impute.polyreg 的数据都是从前一次迭代中估算出来的,因此没有丢失数据。对于 MWE,我删除了那些缺少 y5 的行并尝试再次估算。
df.nm5 <- df[1:8,]
> mice.impute.polyreg(y=df.nm5$y4, ry = !is.na(df.nm5$y4), x=df.nm5[,c(1,3)])
[1] "Y" "Y"
现在,对 mice.impute.polyreg 的调用确实会引发一些 na.rm 类型错误,但我认为这与数据的大小/结构有关,与插补函数无关
Warning messages:
1: In mean.default(newX[, i], ...) :
argument is not numeric or logical: returning NA
2: In mean.default(newX[, i], ...) :
argument is not numeric or logical: returning NA
3: In FUN(newX[, i], ...) : NAs introduced by coercion
mice.impute.polyreg 的输出是要估算的值的向量。我想劫持该输出,并进行确定性编辑,以使所有估算值都遵循这些约束。所以我写了自己的函数,mice.impute.polyreg_y4_adv
mice.impute.polyreg_y4_adv <- function(y, ry, x){
vals <- mice.impute.polyreg(y, ry, x) # generate imputed values using polyreg
logic_5 <- x[!ry, "y5"] # extracts y5 fom the data x where y4 is missing
vals[logic_5=="Y"] <- "N" # if y5 is "Y", then change the imputed value for y4 to be "N"
return(vals)
}
如果我将这个新函数传递给mice,我会得到一个关于wy 的参数作为未使用的参数。
> mice(df.nm5, m=2, method=c("", "polyreg_y4_adv", "polyreg"), maxit = 5)
iter imp variable
1 1 y4Error in mice.impute.polyreg_y4_adv(c(1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), :
unused arguments (wy = c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE),
type = c(1, 1))
如果我修改 mice.impute.polyreg_y4_adv 以提供 wy=NULL 参数,
mice.impute.polyreg_y4_adv <- function(y, ry, x, wy=NULL){
vals <- mice.impute.polyreg(y, ry, x)
logic_5 <- x[!ry, "y5"]
vals[logic_5=="Y"] <- "N"
return(vals)
}
iter imp variable
1 1 y4Error in mice.impute.polyreg_y4_adv(c(1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), :
unused argument (type = c(1, 1))
我仍然收到关于未使用参数类型的错误(我在mice.impute.polyreg 的帮助文件中找不到)。不过,如果我也将那个论点设为 NULL..
mice.impute.polyreg_y4_adv <- function(y, ry, x, wy=NULL, type=NULL){
vals <- mice.impute.polyreg(y, ry, x)
logic_5 <- x[!ry, "y5"]
vals[logic_5=="Y"] <- "N"
return(vals)
}
mice(df.nm5, m=2, method=c("", "polyreg_y4_adv", "polyreg"), maxit = 5)
现在我的下标越界错误。
iter imp variable
1 1 y4Error in x[!ry, "y5"] : subscript out of bounds
如果我手动将参数传递给mice.impute.polyreg(y, ry, x),我不会得到x[!ry, "y5"] 的越界错误。
变更日志未提供任何实质性信息。
【问题讨论】:
-
如果某些值是预先确定的,您也可以预先估算这些情况(即单一估算),然后正常运行小鼠。我认为这会更容易、更快,并且会给你同样的结果。
-
同意 - 除非两者都丢失。