Недавно я впервые начал использовать пакет 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.
Почему это происходит?