MICE в R: Почему на результат пассивного вменения влияет положение столбца? - PullRequest
1 голос
/ 08 мая 2020

Недавно я впервые начал использовать пакет mice и получил ряд суммированных баллов по различным показателям, которые мне нужно было пассивно вменять.

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

Я буду использовать nhanes для иллюстрации.

library(tidyverse)
library(mice)

>head(nhanes)
  age  bmi hyp chl
1   1   NA  NA  NA
2   2 22.7   1 187
3   1   NA   1 187
4   3   NA  NA  NA
5   1 20.4   1 113
6   3   NA  NA 184

Теперь, чтобы было проще проверить, работает ли он, давайте создадим столбец с именем sum, добавив hyp + col:

nhanes_sum <- nhanes %>%
  mutate(sum = hyp+chl)

> head(nhanes_sum)
  age  bmi hyp chl sum
1   1   NA  NA  NA  NA
2   2 22.7   1 187 188
3   1   NA   1 187 188
4   3   NA  NA  NA  NA
5   1 20.4   1 113 114
6   3   NA  NA 184  NA

Затем я хочу использовать мышей для вменения недостающих значений hyp и chl, а затем создать сумму.

imp0 <- mice(nhanes_sum, maxit = 0)

meth <- imp0$method
pred <- imp0$pred

# set the method for sum
meth["sum"] <- "~I(hyp+chl)"
>meth
          age           bmi           hyp           chl           sum 
           ""         "pmm"         "pmm"         "pmm" "~I(hyp+chl)" 

# use hyp and chl to impute sum
pred["sum", c("hyp", "chl")] <- 1

>pred
    age bmi hyp chl sum
age   0   1   1   1   0
bmi   1   0   1   1   0
hyp   1   1   0   1   0
chl   1   1   1   0   0
sum   0   0   1   1   0

# run imputation with 1 iteration
imp <- mice(nhanes_sum, maxit = 1, meth = meth, pred = pred, seed = 2)

> head(complete(imp))
  age  bmi hyp chl sum
1   1 27.2   1 238 239
2   2 22.7   1 187 188
3   1 22.0   1 187 188
4   3 21.7   1 186 187
5   1 20.4   1 113 114
6   3 25.5   2 184 186

Мы видим, что это сработало, как и ожидалось. например, sum в строке 1 равно hyp + chl, хотя раньше это было NA.

Но что произойдет, если мы поместим сумму в начало фрейма данных?

nhanes_sum2 <- nhanes_sum %>%
  select(sum, everything())

> head(nhanes_sum2)
  sum age  bmi hyp chl
1  NA   1   NA  NA  NA
2 188   2 22.7   1 187
3 188   1   NA   1 187
4  NA   3   NA  NA  NA
5 114   1 20.4   1 113
6  NA   3   NA  NA 184

# repeat same process as above:

imp0.2 <- mice(nhanes_sum2, maxit = 0)

meth2 <- imp0.2$method
pred2 <- imp0.2$pred

meth2["sum"] <- "~I(hyp+chl)"
> meth2
          sum           age           bmi           hyp           chl 
"~I(hyp+chl)"            ""         "pmm"         "pmm"         "pmm" 

pred2["sum", c("hyp", "chl")] <- 1
> pred2
    sum age bmi hyp chl
sum   0   0   0   1   1
age   0   0   1   1   1
bmi   0   1   0   1   1
hyp   0   1   1   0   1
chl   0   1   1   1   0

imp2 <- mice(nhanes_sum2, maxit = 1, meth = meth2, pred = pred2, seed = 2)

# check result
>head(complete(imp2))
  sum age  bmi hyp chl
1 230   1 27.2   1 131
2 188   2 22.7   1 187
3 188   1 20.4   1 187
4 189   3 20.4   1 184
5 114   1 20.4   1 113
6 185   3 22.7   1 184

Теперь в строке 1 (которая раньше была NA) sum = 230, хотя hyp = 1 и chl = 131.

Почему это происходит?

...