如何在大量数据点中执行值的插补?

机器算法验证 r 随机森林 缺失数据 数据插补 多重插补
2022-03-25 23:44:20

我有一个非常大的数据集,并且丢失了大约 5% 的随机值。这些变量相互关联。以下示例 R 数据集只是一个带有虚拟相关数据的玩具示例。

set.seed(123)

# matrix of X variable 
xmat <- matrix(sample(-1:1, 2000000, replace = TRUE), ncol = 10000)
colnames(xmat) <- paste ("M", 1:10000, sep ="")
rownames(xmat) <- paste("sample", 1:200, sep = "")
#M variables are correlated 

N <- 2000000*0.05 # 5% random missing values 
inds <- round ( runif(N, 1, length(xmat)) )
xmat[inds] <- NA 
> xmat[1:10,1:10]
         M1 M2 M3 M4 M5 M6 M7 M8 M9 M10
sample1  -1 -1  1 NA  0 -1  1 -1  0  -1
sample2   1  1 -1  1  0  0  1 -1 -1   1
sample3   0  0  1 -1 -1 -1  0 -1 -1  -1
sample4   1  0  0 -1 -1  1  1  0  1   1
sample5  NA  0  0 -1 -1  1  0 NA  1  NA
sample6  -1  1  0  1  1  0  1  1 -1  -1
sample7  NA  0  1 -1  0  1 -1  0  1  NA
sample8   1 -1 -1  1  0 -1 -1  1 -1   0
sample9   0 -1  0 -1  1 -1  1 NA  0   1
sample10  0 -1  1  0  1  0  0  1 NA   0

在这种情况下是否有(最好的)方法来估算缺失值?随机森林算法有用吗?R 中的任何工作解决方案将不胜感激。

编辑:

(1) 缺失值随机分布在变量和样本之间。由于变量的数量非常(示例中为 10000),而上述虚拟示例中的样本数量较少,约为 200。所以当我们查看所有变量(10000)的任何样本,由于大量变量,某些变量很可能会出现缺失值。因此,仅删除样本不是选项。

(2) 在插补过程中,变量既可以是定量的,也可以是定性的(二元)。唯一的判断是我们可以预测它有多好(准确性)。因此,像 0.98 而不是 1 这样的预测可能是可以接受的,而不是 0 vs 1 或 -1 vs 1。我可能需要在计算时间和准确性之间进行权衡。

(3) 我一直在思考过拟合如何影响结果的问题,因为与样本数量相比,变量的数量很大。

(4)由于缺失值的总量约为5%且是随机的(未集中在任何变量或样本中,已采取预防措施去除缺失值非常高的变量或样本)

(5) 使数据完整分析是第一目标,准确性是第二。所以对准确性不太敏感。

4个回答

根据您的情况和数据集,可以有两种方法来处理大变量和小样本(观察)问题。

(1)只要跨变量的分数相同或标准化,只需使用样本(观察)作为变量。

(2) 使用变量作为变量,但在插补时做一些随机抽样,使数字变量小于样本数,最后合并数据。

以下是锻炼,您可以根据自己的需要进行调整。我假设变量是连续的,但您对离散变量进行类似的锻炼。在这里,我给出一个快速检查的小例子。

首先,对于生成相关数据的锻炼,这里的观察(样本)是相关的,在假设变量独立而观察相关的情况下可能是现实的。但在其他情况下,观察值和变量都相关。

# example correlated data, correlated by observations 
# number of observations 
nobs = 200
nvars = 100
# number of variables 
# covariance matrix matrixCR to create correlated data 
matrixCR <- matrix(NA, nrow = nobs, ncol = nobs)
diag(matrixCR) <- 1
matrixCR[upper.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[lower.tri (matrixCR, diag = FALSE)] <- 0.5
matrixCR[1:10,1:10]
L = chol(matrixCR)# Cholesky decomposition
nvars = dim(L)[1]
set.seed(123)
rM = t(L) %*% matrix(rnorm(nvars*nobs), nrow=nvars, ncol=nobs)
rownames(rM) <- paste("V", 1:nvars, sep = "") 
colnames(rM) <- paste("O", 1:nobs, sep = "")
rM[1:10,1:10]



# introduce missing values in random places 
N <- round(nobs*nvars*0.05,0) # 5% random missing values 
set.seed(123)
inds <- round ( runif(N, 1, length(rM)) )
rM1 <- rM
rM1[inds] <- NA

我正在使用missForest包进行估算,这取决于randomForest包来执行此操作。如果您有大量数据点要估算,您可以进行并行计算。

# now use the rM1 matrix in imputation. 
require(missForest)
out.m <- missForest(rM1, maxiter = 10, ntree = 300)
# imputed 
imp.rM1 <- out.m$ximp

由于这是模拟数据集,我们可以通过将引入的原始缺失值与估算值进行比较来估计估算的准确性。

# actual values that were made missing 
aval <- rM[inds]
impv <- imp.rM1[inds]

# accuracy - defined as correlation between actual (before na introduction) and imputed values 
cor(aval,impv)
[1] 0.6759404

您可以解决问题以提高准确性。祝你好运 !

有完整的数据插补书籍,因此很难在这个框架中给出答案。

在这种情况下,最简单的做法是选择其中一列 (y) 并在矩阵中收集另一个x.

一个模型y=f(x)被训练并且缺失值被我们的模型预测的值替换。您的数据似乎是分类的,因此随机森林可能是一个不错的选择。

如果您的数据集非常大,请确保使用快速算法或可扩展的算法。

这是一个非常有趣的问题。我也在寻找同样的东西。实际上,有很多不同的方法来处理它。

在我看来,第一件事是确定您拥有哪种类型的缺失数据 - 完全随机缺失 (MCAR)、随机缺失 (MAR) 或非随机缺失 (NMAR)。这很难证明且有争议,但本文展示了一种查看 MAR 数据的有趣方式。

为了处理多重插补,R 有几个包:

  • MICE(这似乎很常用),
  • randomForest,
  • Hmisc
  • Amelia
  • mi

这些只是我到目前为止找到的几个包。

MICE还实现了随机森林和其他一些方法,例如预测均值匹配。

这并不多,但可以帮助您弄清楚一些事情。一旦我有结果或决定我将继续使用哪种方法,我将编辑帖子。

祝你好运!

有趣的问题。这样做的诀窍是,为了进行多重插补,您需要的不仅仅是一个预测模型(可以/将很容易在机器学习方法中获得)。我们将这些模型称为模拟模型,因为它们不是概率模型。

特征选择的综合方面(大p) 并且训练一个模拟模型让我认为贝叶斯方法是最好的。这也意味着对此没有明确的方法。对我来说,最好的方法是采用以下方法:

  1. 识别所有缺失模式
  2. 对于每个模式,使用贝叶斯特征选择方法为数据中的完整案例分配后验权重。
  3. 迭代随机抽样完整的案例以生成完整的数据帧。