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


12

我的数据集非常大,大约缺少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 vs1。我可能需要在计算时间和准确性之间进行权衡。

(3)我想到的问题是,与变量数量相比,变量数量大时,过度拟合会如何影响结果。

(4)由于缺失值的总数约为5%,并且是随机的(未采取任何措施将其集中在任何变量或样本中,因为采取了谨慎措施以去除缺失值非常高的变量或样本)

(5)使数据完整以进行分析是首要目标,其次是准确性。因此对准确性不太敏感。

r  random-forest  missing-data  data-imputation  multiple-imputation  large-data  definition  moving-window  self-study  categorical-data  econometrics  standard-error  regression-coefficients  normal-distribution  pdf  lognormal  regression  python  scikit-learn  interpolation  r  self-study  poisson-distribution  chi-squared  matlab  matrix  r  modeling  multinomial  mlogit  choice  monte-carlo  indicator-function  r  aic  garch  likelihood  r  regression  repeated-measures  simulation  multilevel-analysis  chi-squared  expected-value  multinomial  yates-correction  classification  regression  self-study  repeated-measures  references  residuals  confidence-interval  bootstrap  normality-assumption  resampling  entropy  cauchy  clustering  k-means  r  clustering  categorical-data  continuous-data  r  hypothesis-testing  nonparametric  probability  bayesian  pdf  distributions  exponential  repeated-measures  random-effects-model  non-independent  regression  error  regression-to-the-mean  correlation  group-differences  post-hoc  neural-networks  r  time-series  t-test  p-value  normalization  probability  moments  mgf  time-series  model  seasonality  r  anova  generalized-linear-model  proportion  percentage  nonparametric  ranks  weighted-regression  variogram  classification  neural-networks  fuzzy  variance  dimensionality-reduction  confidence-interval  proportion  z-test  r  self-study  pdf 

1
究其原因,为什么数据丢失适当技术的选择强烈的熊。例如,如果数据完全随机丢失,那么通过删除所有缺失值的案例,您将损失很少(因为数据集很大,并且缺失的值相对较少);但是,如果缺失与分析中的重要变量有关,则删除这些情况可能会带来偏差。
ub

1
@whuber我同意,无法删除这种大小的数据集,因为每种情况至少在一个变量处都会缺少值。这将导致数据完全丢失。
约翰

4
约翰,这极大地改变了这个问题,因为按照目前的形式,它明确指出了另外的意思:它断言仅丢失了5%的值。即使我们理解将5%应用于数据矩阵中的所有条目(而不是5%的情况),任何以该示例为例来说明您的数据性质的人都将有效地得出结论,即不超过10 * 5%= 50 %的案例缺少值。在此类问题中最需要描述的三件事是:(1)分析的目的;(2)缺失的性质;(3)缺失的数量。
ub

Answers:


8

根据您的情况和数据集,可以采用两种方式处理大变量和小样本(观测)问题。

(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

您可以变通以提高准确性。祝好运 !


5

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

yx

y=f(x)

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


谢谢,您有书建议吗?
约翰

没什么特别的。但是,如果您使用Google数据估算,您会发现很多东西
Donbeo 2014年

无论如何,如果仅缺少几个值,则可以删除所有行。从您的数据集中
Donbeo 2014年

3
尽管您总是可以删除缺失值的个案,但是根据丢失数据的原因,有时这是一个糟糕的选择。
ub

@whuber我完全同意您的看法,但很多时候这只是更安全的选择。
Donbeo 2014年

5

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

我认为,第一件事是确定丢失的数据类型-完全随机丢失(MCAR),随机丢失(MAR)或不随机丢失(NMAR)。这很难证明并且有争议,但是本文显示了一种有趣的方式来查看MAR数据。

为了处理多重插补,R提供了一些软件包:

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

这些只是到目前为止我发现的软件包中的很少。

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

这虽然不多,但是可以帮助您弄清楚一些事情。一旦获得结果或决定采用哪种方法,我将编辑帖子。

祝好运!


我的数据是MCAR。
约翰

1
如果您的数据是MCAR,则只能使用完整的案例分析。许多论文报告说,对MCAR数据使用完整的案例分析是最好的解决方案。至少,一些我发现的论文报告此,即使与其他估算方法比较
psoares

3

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

p

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

3

您的问题似乎是为某种低阶矩阵完成量身定制的。尝试使用软件包中impute.svd()功能。我建议使用小等级(参数)-类似于5。bcvk

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.