非常に多数のデータポイントで値の代入を実行する方法は?


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)変数は、代入のプロセスで定量的または定性的(バイナリ)として扱うことができます。唯一の判断は、どれだけうまく予測できるか(精度)です。したがって、1ではなく0.98のような予測は、0対1または-1対1ではなく許容可能です。計算時間と精度の間でトレードオフが必要になる場合があります。

(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
理由なぜデータが欠落しているが、適切な技術の選択に強く負います。たとえば、データがランダムに完全に欠落している場合、値が欠落しているすべてのケースを削除しても損失はほとんどありません(データセットが大きく、欠落している値が比較的少ないため)。しかし、欠落が分析の重要な変数に関連している場合、それらのケースを削除するとバイアスが発生する可能性があります。
whuber

1
@whuber私は同意します。このサイズのデータ​​セットを削除することはできません。すべてのケースが少なくとも1つの変数で欠損値を持っているからです。これにより、データが完全に失われます。
ジョン

4
Johnは、現在の形式では明示的にそうではないと述べているため、質問が大幅に変わります。値の5%だけが欠落していると断言しています。ケースの 5%ではなく、データマトリックスのすべてのエントリに適用される5%を理解したとしても、データの性質を示すものとして例を取り上げる人は、10 * 5%= 50以下であると正当に結論付けます。ケースの%に欠損値があります。そのような質問で説明するのに最も重要な3つのことは、(1)分析の目的、(2)欠損の性質、および(3)欠損の量です。
whuber

回答:


8

状況とデータセットに応じて、大きな変数と小さなサンプル(観測)の問題に対処する2つの方法があります。

(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

データ補完の完全な本があるので、このフレームワークで答えを出すことは困難です。

yバツ

y=fバツ

データセットが非常に大きい場合は、高速アルゴリズムまたはスケーラブルなアルゴリズムを使用してください。


ありがとう、本の提案はありますか?
ジョン

特に何もありません。あなたはデータ代入をグーグル場合がありますが、多くのものを見つけることができます
Donbeo

とにかく、不足している値が少ない場合は、すべての行を削除できます。あなたのデータセットから
Donbeo

3
欠損値のあるケースはいつでも削除できますが、データが欠落している理由によっては、それが適切でない場合があります。
whuber

@whuber私はあなたに完全に同意しますが、多くの場合、これはより安全な選択です。
ドンベオ

5

これは本当に興味深い質問です。私も同じことを探しています。実際には、それに対処するためのさまざまな方法があります。

私の意見では、最初のことは、あなたが持っている欠損データのタイプを決定することです-完全にランダムに欠損(MCAR)、ランダムに欠損(MAR)、またはランダムに欠損(NMAR)これは証明するのが難しく、議論の余地があるが、この論文ははMARデータを見る興味深い方法を示しています。

複数の代入を処理するために、Rにはいくつかのパッケージがあります。

  • MICE (これは非常に使用されているようです)、
  • randomForest
  • Hmisc
  • Amelia
  • mi

これらは、私がこれまでに見つけたパッケージのほんの一部です。

MICE また、ランダムフォレストと、予測平均マッチングなどの他のいくつかの方法を実装しています。

これは大したことではありませんが、いくつかのことを理解するのに役立つかもしれません。結果が出るか、どちらの方法で進めるかを決定したら、すぐに投稿を編集します。

幸運を!


私のデータはMCARです。
ジョン

1
データがMCARの場合、完全なケース分析のみを使用できます。多くの論文は、MCARデータで完全なケース分析を使用することが最良のソリューションであると報告しています。少なくとも、私が見つけた論文の一部であっても、他の帰属の方法と比較したときに、このことを報告
psoares

3

興味深い質問。これの秘trickは、複数の代入を行うために、単なる予測モデル以上のものが必要なことです(これは、たとえば機械学習のアプローチで簡単に入手できます/可能です)。これらのモデルは、確率モデルではないため、シミュレーションモデルと呼びます。

特徴選択の大きな側面(大きな p)シミュレーションモデルをトレーニングすると、ベイジアンアプローチが最適であると思うようになります。これは、これに対する明確なアプローチがないことも意味します。私にとって、最良のアプローチは次のアプローチです。

  1. すべての欠落パターンを特定する
  2. 各パターンについて、ベイジアン特徴選択アプローチを使用して、データ内の完全なケースに事後重みを割り当てます。
  3. 完全なケースをランダムに繰り返しサンプリングして、完全なデータフレームを生成します。

3

あなたの問題は、ある種の低ランクのマトリックス補完に合わせて調整されているようです。パッケージimpute.svd()関数を使用してみてください。小さいランク(引数)を使用することをお勧めします(5など)。bcvk

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.