使用 MICE 来输入分类变量,但限制可能的值

问题描述 投票:0回答:3

我有一个分类变量

var1
,可以采用
"W"
"B"
"A"
"M"
"N"
"P"
的值。我想估算缺失值,但我知道缺失值不能是
"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)

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

r categorical-data imputation r-mice
3个回答
1
投票

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

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

由于您只有 var1 中缺少数据(您确定不存在 W 和 B),因此您无论如何都不需要“W”和“B”情况。

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


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)

0
投票

我和亚历克西娅有同样的问题。但是,我有一个数据集,其中有多个列需要估算,并且其中包含我不希望老鼠用作有效的可估算响应的值(例如,一个人对每个人吸多少支香烟的问题的回答)天被编码为-7,因为他们对较早的项目做出了回应,表明他们不吸烟)。我不希望老鼠将 -7 作为对当前包含 NA 的行/观察值的响应。

因此,如果我从数据集中删除“有多少支香烟?”中包含 -7 的行。列,它可能在我希望估算的不同列中具有 NA。我已经搜索过这个问题的解决方案,但找不到任何东西。我错过了一些明显的东西吗?帮助?谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.