去年,我使用this question中的信息来构建自定义函数,以在R中使用MICE在简单的逻辑约束下估算丢失的数据。以下代码仍适用于2.30版的鼠标,但从2000年起将无法使用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"
现在,对mouse.impute.polyreg的调用确实会引发一些na.rm类型错误,但我认为这与数据的大小/结构有关,与插补函数无关 < / p>
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"]
不会出现超出范围的错误。
变更日志未提供任何实质性信息。
答案 0 :(得分:0)
我认为这是一个因素转换问题。
尝试在自定义函数上设置一个断点,然后运行它:
debugonce(mice.impute.polyreg_y4_adv)
mice(df.nm5, m=2, method=c("", "polyreg_y4_adv", "polyreg"), maxit = 5)
Browse[2]> str(x)
num [1:10, 1:2] 0.158 0.169 0.243 0.534 0.815 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:10] "1" "2" "3" "4" ...
..$ : chr [1:2] "U" "y5Y"
该列现在已命名为y5Y
。我将继续寻找导致此问题的原因,它可能是依赖关系而不是鼠标本身。
编辑:
在sampler.R中,我们可以看到它通过model.matrix转换了x: https://github.com/cran/mice/blob/53f69107bb81f03e98dcdd19e90186043864c670/R/sampler.R#L183-L193
该文件是在2.46版中引入的-大概在此之前就使用了其他文件,但在历史记录中我很难找到它。