Импутация у мышей на основе диапазона возраста, к которому принадлежит человек - постобработка R - PullRequest
0 голосов
/ 25 сентября 2019

Я использую пакет мышей для вменения данных, и я прочитал о постобработке, чтобы ограничить вмененные значения.В моем наборе данных у меня есть данные из двух источников.Среди других распространенных переменных: возраст как категория / диапазон (0-20, 21-40, 41-60, 61-80) из источника 1 и возраст как число (например, 25, 63 и т. Д.) Из источника 2. Когда яя собираю данные вместе, я знаю все возрастные диапазоны, к которым принадлежат люди, но у меня отсутствуют значения в некоторых возрастах / целых числах.То, что я хочу сделать, - это рассчитать возраст на основе других переменных набора данных и ограничить их возрастным диапазоном.

Я нашел похожие подходы в документации по мышам, но они дают только один диапазон, а не много.

Есть идеи о постобработке этого у мышей в R?

1 Ответ

0 голосов
/ 26 сентября 2019

Вот воспроизводимый пример того, чего вы пытаетесь достичь.Вы можете использовать несколько строк кода в post['ageint'], чтобы сжимать целое число возраста условно по возрастной категории.Это основано на документации, найденной здесь

require(tidyverse)
require(mice)

set.seed(315)

getAge <- function(range){
  minAge <- str_extract(range,'[0-9]+')
  maxAge <- str_extract(range,'[0-9]+$')
  sample(minAge:maxAge,1)
}

dat <- nhanes2 %>%
  mutate(ageint = map_int(age,~if_else(sample(c(TRUE,FALSE),1),getAge(.x),as.integer(NA))))

init <- mice(dat,m=1,maxit=1, print = FALSE)

post <- init$post

post["ageint"] <- "
                  imp[[j]][data$age[!r[, j]] == '20-39', i] <- squeeze(imp[[j]][data$age[!r[, j]] == '20-39', i], c(20, 39))
                  imp[[j]][data$age[!r[, j]] == '40-59', i] <- squeeze(imp[[j]][data$age[!r[, j]] == '40-59', i], c(40, 59))
                  imp[[j]][data$age[!r[, j]] == '60-99', i] <- squeeze(imp[[j]][data$age[!r[, j]] == '60-99', i], c(60, 99))
"

.Вы можете видеть, что происходит:

imp1 <- mice(dat,seed = 314, print = FALSE)
imp2 <- mice(dat,post=post,seed = 314, print = FALSE)



mice::complete(imp1, action = 'long') %>% mutate(method = 'default') %>%
  bind_rows(mice::complete(imp2,action = 'long') %>% mutate(method = 'with post')) %>%
  ggplot(aes(x = age, y = ageint, color = factor(.imp))) +
  geom_jitter() +
  scale_y_continuous(limits = c(0,100)) +
  facet_grid(~method)

enter image description here

...