首页 文章

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

提问于
浏览
1

我有一个半稀疏的矩阵 . 所有细胞中有一半是空白的(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])

我寻找答案的地方:

2 回答

  • 0

    我认为你要找的东西可以通过修改鼠标功能的参数“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)
    
  • 2

    你的问题对我来说并不完全清楚 . 你是说你希望只在两列上操作吗?在那种情况下 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 来滚动数据插补吗?”我相信答案是否定的 . 但是你应该仔细检查文档 .

相关问题