В прошлом году я использовал информацию из этого вопроса для создания пользовательской функции для вменения отсутствующих данных при простом логическом ограничении с использованием MICE в R. Следующий код все еще работает на мышах версии 2.30, но не будетработа с 2,46 (и мыши сейчас на 3,3).Вот то, что я пытаюсь сделать, в комплекте с MWE и полным объяснением того, что я пробовал до сих пор.
Учитывая данные ниже, комбинация (N, Y) невозможна (структурный ноль),Все остальные комбо в порядке.Таким образом, отсутствующие данные в строках 7, 9 и 10 могут быть вменены как Y или N, но отсутствующее значение для y4 в строке 8 ограничено значением «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>
Поскольку у4 и у5 являются факторами, мы используем модели политомной регрессии для генерации вменений.Код ниже делает это без ошибок.
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
).Тем не менее, если я также обнулю этот аргумент ..
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"]
.
Журнал изменений не предоставляет никакой существенной информации.