'R','老鼠',缺少变量插补 - 如何只在稀疏矩阵中做一列

时间:2017-02-10 14:00:24

标签: r imputation r-mice

我有一个半稀疏的矩阵。所有细胞中有一半是空白的(na)所以当我尝试运行“老鼠”时,它会尝试对所有细胞进行处理。我只对一个子集感兴趣。

问题:在下面的代码中,如何让“鼠标”仅在前两列上运行?有没有一种干净的方法来使用行延迟或行引导,这样前一行的内容可以帮助修补当前行中的空洞?

set.seed(1)

#domain
x <- seq(from=0,to=10,length.out=1000)

#ranges
y <- sin(x) +sin(x/2) + rnorm(n = length(x))
y2 <- sin(x) +sin(x/2) + rnorm(n = length(x))

#kill 50% of cells
idx_na1 <- sample(x=1:length(x),size = length(x)/2)
y[idx_na1] <- NA

#kill more cells
idx_na2 <- sample(x=1:length(x),size = length(x)/2)
y2[idx_na2] <- NA

#assemble base data
my_data <- data.frame(x,y,y2)

#make the rest of the data
for (i in 3:50){


     my_data[,i] <- rnorm(n = length(x))
     idx_na2 <- sample(x=1:length(x),size = length(x)/2)
     my_data[idx_na2,i] <- NA

}

#imputation
est <- mice(my_data)

data2 <- complete(est)

str(data2[,1:3])

我寻找答案的地方:

3 个答案:

答案 0 :(得分:3)

我认为您正在寻找的东西可以通过修改鼠标功能的参数“ where”来完成。参数“ where”等于矩阵(或数据框),其大小与要在其上进行插补的数据集相同。默认情况下,“ where”参数等于is.na(data):当数据集中的值缺失时,单元格等于“ TRUE”的矩阵,否则等于“ FALSE”。这意味着默认情况下,将估算数据集中的每个缺失值。现在,如果您要更改此设置,并且仅将值插补到数据集的特定列(在我的示例中为第2列),则可以执行以下操作:

# Define arbitrary matrix with TRUE values when data is missing and FALSE otherwise
A <- is.na(data)
# Replace all the other columns which are not the one you want to impute (let say column 2)
A[,-2] <- FALSE 
# Run the mice function
imputed_data <- mice(data, where = A)

答案 1 :(得分:2)

代替where参数的一种更快的方法可能是使用method参数。您可以为要跳过的列/变量将此参数设置为""。缺点是无法自动确定方法。所以:

imp <- mice(data,
            method = ifelse(colnames(data) == "your_var", "logreg", ""))

但是您可以从the documentation获取默认方法:

defaultMethod

...默认情况下,该方法使用pmm,预测均值匹配(数字数据)logreg,逻辑回归插补(二进制数据,2级因子)polyreg,多义无序分类数据(因数> 2级)polr的回归归因,(有序,> 2级)的比例赔率模型。

答案 2 :(得分:0)

我的问题并不完全清楚。你是说你希望只在两列上操作吗?在这种情况下,mice(my_data[,1:2])将起作用。或者您想使用所有数据,但只填写某些列的缺失值?为此,我只需沿着以下几行创建一个指标矩阵:

isNA <- data.frame(apply(my_data, 2, is.na))
est <- mice(my_data)

mapply(function(x, isna) {
  x[isNA == 1] <- NA
  return(x)
}, <each MI mice return object column-wise>,  isNA)

对于您的最后一个问题,“我可以使用mice来滚动数据估算吗?”我相信答案是否定的。但是你应该仔细检查文档。