Пользовательская функция вменения для MICE перестала работать - PullRequest
0 голосов
/ 01 октября 2018

В прошлом году я использовал информацию из этого вопроса для создания пользовательской функции для вменения отсутствующих данных при простом логическом ограничении с использованием 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"].

Журнал изменений не предоставляет никакой существенной информации.

1 Ответ

0 голосов
/ 01 октября 2018

Я думаю, что это проблема преобразования коэффициентов.

Попробуйте установить точку останова для своей пользовательской функции и затем запустить ее:

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, мы можем видеть, как он преобразует x через model.matrix: https://github.com/cran/mice/blob/53f69107bb81f03e98dcdd19e90186043864c670/R/sampler.R#L183-L193

Этот файл был введен в версии 2.46 - возможно, раньше использовалось что-то еще, но я не могу легко найти его в истории.

...