如何使用MICE插补类别变量,但防止其采用某些值?

时间:2019-10-07 11:56:32

标签: categorical-data imputation r-mice

我有一个类别变量var1,它可以采用W,B,A,M,N或P的值。我想使用R中的mouses包来推算一些NA,但我知道缺少的值不能为“ W”或“ B”,因为那些人​​说它们不属于该类别。我想归因于var1,但强迫小鼠只选择B或W以外的所有东西。

以下是供您使用的示例代码:

df=data.frame(age=c(24,37,58,65,70,84, 56, 36, 48,23,15), 
    var1 =c("B","W", NA, "A",NA, "P","N", NA, "M",NA, "B"), 
    var1categ=c(0,0, 1, 1, 1,1,1,1,1,1, 0),
    ht = c(156, 169, 180, 175, 168, 165, 171, 158, 160, 175, 160))

imp=mice(df, remove_collinear = FALSE)

感谢您的帮助,如果您需要更多信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

我认为以下方法应该有效:

  1. 从数据集中完全删除所有“ W”和“ B”案例。
  2. 对小鼠进行归因

由于var1中仅缺少数据(确保没有W和B出现),因此无论如何都不需要“ W”和“ B”的情况。

注意:如果其他列中也缺少数据,则方法会有所不同。

答案 1 :(得分:1)

我认为@ stats0007是正确的,但是您必须在所有m个估算数据集中重新插入已删除的行(在您的情况下,是所有5个估算数据集)。使用您的示例,这就是我的方法。

首先删除所有“ W”和“ B”的情况,并存储在单独的data.frame中。

df=data.frame(age=c(24,37,58,65,70,84, 56, 36, 48,23,15), 
              var1 =c("B","W", NA, "A",NA, "P","N", NA, "M",NA, "B"), 
              var1categ=c(0,0, 1, 1, 1,1,1,1,1,1, 0),
              ht = c(156, 169, 180, 175, 168, 165, 171, 158, 160, 175, 160))

df[which(df$var1 != "B" & df$var1 != "W" | is.na(df$var1)),]  # Keep rows not containing B and W
df3 <- df[df$var1 %in% c("B","W"),] # Store deleted rows 

接下来,在不删除这些个案的情况下估算数据。记录的事件是因为您的变量之一现在是常量。

library(mice)
imp=mice(df2, remove_collinear = FALSE) 

最后,将删除的案例重新插入每个估算的数据集1:5中。也许有更好的方法,但是for循环可以工作。

# Create an empty data frame
data <- data.frame()

# For each imputation 1:5
for(i in unique(comp_imp$.imp)){

  # Create a .imp variable and .id variable in the dataset with the deleted rows
  df3$.imp <- i
  df3$.id <- (max(comp_imp$.id)+1):(max(comp_imp$.id)+nrow(df3))
  df3 <- df3[,c(5,6,1:4)]

  # Bind the new rows to the imputed dataset
  df_temp <- rbind(comp_imp[comp_imp$.imp == i,],df3)
  data <- rbind(data, df_temp)
}

data现在包含所有估算值以及原始的“ B”和“ W”观察值。您可以将其转换回mids对象,以在mice包中进一步使用。

# Transform into a mids object for further use
imp_tot <- as.mids(data)