【问题标题】:How do I impute missing values only if certain conditions met in MICE?只有在 MICE 中满足某些条件时,我如何估算缺失值?
【发布时间】:2020-10-01 16:18:33
【问题描述】:

我正在努力将 MICE 用于数据集。有一个变量绝对取决于另一个变量,我无法弄清楚如何让 MICE 仅在一个变量中估算 一些 缺失值(而让其他变量真正缺失)。

例如,我有一个关于性别、怀孕状态和结果的数据集。 只有女性可以怀孕,所以如果缺少“怀孕”但主题是男性,那么我不想在那里估算值。

但我确实想为女性赋予怀孕的价值。所有变量(包括性别和结果)都有一些缺失。

我已阅读此处'R', 'mice', missing variable imputation - how to only do one column in sparse matrix 的建议,并尝试在鼠标中使用“where”选项。

但使用“在哪里”似乎并不能估算所有的性结果?

例如;

library(mice)
library(tidyverse)
library(haven)
library(janitor)

# create some data
sex <- c("m","f","m","f","m",NA,NA,"f","f","m","f","f","m","m","f","m")
preg <- c(NA,"not_preg",NA,NA,NA,NA,"preg","not_preg",NA,"not_preg","preg",NA,NA,NA,NA) 
outcome <- c(1,0,1,0,0,NA,NA,0,0,1,0,1,1,0,0)
df <- cbind(sex,preg,outcome) %>% as_tibble() %>% mutate(sex=as_factor(sex)) %>% mutate(preg=as_factor(preg))

# look at what's missing
md.pattern(df)
df %>% tabyl(sex,preg)
df %>% tabyl(preg)

# Try to impute over everything to show mice working
mice_a <- mice(df, m=2, maxit=2, seed=3,method="pmm")
df_imp_a <- complete(mice, action="long", include = FALSE)

df_imp_a %>% filter(.imp==1) %>% tabyl(sex,preg)  # this has imputed that some men are pregnant (understandably,but not what I want!
df_imp_a %>% filter(.imp==1) %>% tabyl(sex) #but everyone has a sex imputed
df_imp_a %>% filter(.imp==1) %>% tabyl(preg)

# Try to use the 'where' option

# b. Using it with a 'blank' where as proof of principle

grid_b <- is.na(df) #this is just default
mice_b <- mice(df, m=2, maxit=2, seed=3,method="pmm",where=grid_b)
df_imp_b <- complete(mice_b, action="long", include = FALSE)
df_imp_b %>% filter(.imp==1) %>% tabyl(sex,preg) #same problem of pregnant men (obviously, haven't changed anything yet)
df_imp_b %>% filter(.imp==1) %>% tabyl(sex) # but at least everyone has a sex imputed
df_imp_b %>% filter(.imp==1) %>% tabyl(preg)

# c. Making a proper grid of data that I do and don't want imputed

grid_c <- df %>%
  mutate(preg=case_when(
    sex=="f" & is.na(preg)==TRUE ~ TRUE,
    TRUE ~ FALSE
  )) %>%
  mutate(sex=is.na(sex)) %>%
  mutate(outcome=is.na(outcome))

grid_c
grid_c %>% tabyl(preg) # so we are looking for 4 imputed values of 'preg' (so I've done it right -- there are 4 females with unknown pregnancy status)

mice_c <- mice(df,m=2,maxit=2,seed=3,method="pmm",where=grid_c)
df_imp_c <- complete(mice_c,action="long",include=FALSE)

df_imp_c %>% filter(.imp==1) %>% tabyl(sex,preg) # now I have no pregnant men -- which is good!
df_imp_c %>% filter(.imp==1) %>% tabyl(sex) # but I am missing sex for one person??
df_imp_c %>% filter(.imp==1) %>% tabyl(preg) # have imputed all the pregnancy data that I wanted through -- only 7 NAs (for the 7 men)

我如何设法告诉老鼠我只想估算某个列中的某些行而不是所有行?但是我确实想要估算另一列的所有行?为什么“where”选项的行为不像我想象的那样?

非常感谢所有帮助!谢谢。

【问题讨论】:

    标签: r r-mice


    【解决方案1】:

    经过大量实验,mice 似乎存在问题,即您不允许对preg 进行插补,其中sex 为 NA。如果您将grid_c 设置如下:

    grid_c <- df %>%
      mutate(preg=case_when(
        (sex=="f"|is.na(sex)) & is.na(preg)==TRUE ~ TRUE,
        TRUE ~ FALSE
      )) %>%
      mutate(sex=is.na(sex)) %>%
      mutate(outcome=is.na(outcome))
    

    注意(sex=="f"|is.na(sex))的变化。

    这样做的缺点是你会得到一些not_preg 的男人。虽然在技术上是正确的,但您可能也希望它们设置为 NA。所以你可以在后期处理中做到这一点。您也可以通过在preg 中添加另一个类别来避免在插补之前出现该问题,该类别在插补之前编码男性无法怀孕(而不是 NA)。

    现在,如果您执行上述操作,您将遇到第二个问题:现在您在outcome 中还有剩余的 NA。这似乎是因为您的测试数据不包含足够的信息来估算所有缺失值。请注意,您的第 6 行根本不包含任何信息,因此 mice 没有该人的数据可用于输入 pmm 算法。
    如果您包含可能包含有关缺失值的信息的更多变量(并且对于相关人员/行不是 NA),您可以解决此问题。如果您没有这些数据,请排除该人,因为您的样本中根本没有他们。

    最后,如果您继续使用像您这样的示例数据测试该过程,请将其设为更长的数据集。在尝试使用它时,我收到了进一步的警告(mice_c$loggedEvents),这是由于您的分类变量的某些组合的案例数量较少。

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题,如果年龄小于 15 岁,我不想在超过 70 列中估算单元格。以下简短代码非常有帮助。

      将 where=miss.infor.data 包含到您的 mice() 代码中。

      #copy your dataset
          df2 <- df 
      
      # Set missing cells to 100 in columns 248 to 320 for those over age 15
          df2[df2$age < 15, 248:320] <- 100 
      
      #create the logical in which those with a value 100 are not set to TRUE so they will not be imputed in the where option.
          miss.infor.data <-as.data.frame(lapply(AddedValuedat2, is.na)) 
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-11
        • 2018-12-21
        • 2021-12-30
        • 1970-01-01
        • 2020-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多