小鼠插补 - post 处理 R
Imputation in mice - post processing R
我正在使用 mice 包来估算数据,并且我已阅读有关 post 处理以限制估算值的内容。在我的数据集中,我有与数字和类别相同的数据。我想估算这些数据的所有缺失值,但将它们估算在正确的分类中。
我在 mice 文档中发现了类似的方法,但它们只给出了一个范围而不是很多。
对 R 中的小鼠有任何想法吗?
这是您要实现的目标的可重现示例。您可以在 post['ageint']
中使用多行代码来根据年龄类别有条件地压缩年龄整数。这是基于找到的文档 here
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))
"
为了说明,我绘制了没有 post 处理和 post 处理的插补。你可以看看会发生什么:
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)
我正在使用 mice 包来估算数据,并且我已阅读有关 post 处理以限制估算值的内容。在我的数据集中,我有与数字和类别相同的数据。我想估算这些数据的所有缺失值,但将它们估算在正确的分类中。 我在 mice 文档中发现了类似的方法,但它们只给出了一个范围而不是很多。
对 R 中的小鼠有任何想法吗?
这是您要实现的目标的可重现示例。您可以在 post['ageint']
中使用多行代码来根据年龄类别有条件地压缩年龄整数。这是基于找到的文档 here
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))
"
为了说明,我绘制了没有 post 处理和 post 处理的插补。你可以看看会发生什么:
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)