'R'、'mice'、缺少变量插补 - 如何在稀疏矩阵中只做一列
'R', 'mice', missing variable imputation - how to only do one column in sparse matrix
我有一个半稀疏矩阵。所有单元格的一半是空白的 (na) 所以当我尝试 运行 时 'mice' 它会尝试对所有单元格进行处理。我只对其中的一部分感兴趣。
问题:在下面的代码中,如何让"mice"只对前两列进行操作?有没有一种干净的方法可以使用 row-lag 或 row-lead 来做到这一点,以便前一行的内容可以帮助修补当前行中的漏洞?
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])
我寻找答案的地方:
我不太清楚你的问题。你是说你只想对两列进行操作?在这种情况下 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)
对于你的最后一个问题,"can I use mice
for rolling data imputation?"我认为答案是否定的。但是你应该仔细检查文档。
我想你要找的东西可以通过修改 mice 函数的参数 "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)
代替 where
参数,更快的方法可能是 使用 method
参数 。对于要跳过的 columns/variables,您可以将此参数设置为 ""
。缺点是该方法的自动确定将不起作用。所以:
imp <- mice(data,
method = ifelse(colnames(data) == "your_var", "logreg", ""))
但是你可以从the documentation获得默认方法:
defaultMethod
... By default, the method uses pmm
, predictive mean matching (numeric data) logreg
, logistic regression imputation (binary data, factor with 2 levels) polyreg
, polytomous regression imputation for unordered categorical data (factor > 2 levels) polr
, proportional odds model for (ordered, > 2 levels).
我有一个半稀疏矩阵。所有单元格的一半是空白的 (na) 所以当我尝试 运行 时 'mice' 它会尝试对所有单元格进行处理。我只对其中的一部分感兴趣。
问题:在下面的代码中,如何让"mice"只对前两列进行操作?有没有一种干净的方法可以使用 row-lag 或 row-lead 来做到这一点,以便前一行的内容可以帮助修补当前行中的漏洞?
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])
我寻找答案的地方:
我不太清楚你的问题。你是说你只想对两列进行操作?在这种情况下 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)
对于你的最后一个问题,"can I use mice
for rolling data imputation?"我认为答案是否定的。但是你应该仔细检查文档。
我想你要找的东西可以通过修改 mice 函数的参数 "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)
代替 where
参数,更快的方法可能是 使用 method
参数 。对于要跳过的 columns/variables,您可以将此参数设置为 ""
。缺点是该方法的自动确定将不起作用。所以:
imp <- mice(data,
method = ifelse(colnames(data) == "your_var", "logreg", ""))
但是你可以从the documentation获得默认方法:
defaultMethod
... By default, the method uses
pmm
, predictive mean matching (numeric data)logreg
, logistic regression imputation (binary data, factor with 2 levels)polyreg
, polytomous regression imputation for unordered categorical data (factor > 2 levels)polr
, proportional odds model for (ordered, > 2 levels).