入力データの近傍情報の使用またはオフデータの検索(R)


13

最近傍が最適な予測子であるという仮定のデータセットがあります。視覚化された双方向グラデーションの完璧な例

ここに画像の説明を入力してください

欠落している値がほとんどない場合があると仮定すると、近傍と傾向に基づいて簡単に予測できます。

ここに画像の説明を入力してください

Rの対応するデータマトリックス(トレーニングのダミーの例):

miss.mat <- matrix (c(5:11, 6:10, NA,12, 7:13, 8:14, 9:12, NA, 14:15, 10:16),ncol=7, byrow = TRUE)
miss.mat 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    5    6    7    8    9   10   11
[2,]    6    7    8    9   10   NA   12
[3,]    7    8    9   10   11   12   13
[4,]    8    9   10   11   12   13   14
[5,]    9   10   11   12   NA   14   15
[6,]   10   11   12   13   14   15   16

注:(1)欠損値のプロパティはランダムであると想定され、どこでも発生する可能性があります。

(2)すべてのデータポイントは単一の変数からのものですが、それらの値はneighbors、それらに隣接する行と列の影響を受けると想定されます。したがって、マトリックス内の位置は重要であり、他の変数と見なされる場合があります。

いくつかの状況での私の希望は、いくつかのオフバリュー(間違いかもしれません)と正しいバイアス(ちょうど例、ダミーデータでそのようなエラーを生成させます)を予測できることです:

> mat2 <- matrix (c(4:10, 5, 16, 7, 11, 9:11, 6:12, 7:13, 8:14, 9:13, 4,15, 10:11, 2, 13:16),ncol=7, byrow = TRUE)
> mat2

    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    4    5    6    7    8    9   10
[2,]    5   16    7   11    9   10   11
[3,]    6    7    8    9   10   11   12
[4,]    7    8    9   10   11   12   13
[5,]    8    9   10   11   12   13   14
[6,]    9   10   11   12   13    4   15
[7,]   10   11    2   13   14   15   16

上記の例は単なる例です(視覚的に答えられる場合があります)が、実際の例はもっとわかりにくいかもしれません。そのような分析を行うための堅牢な方法があるかどうかを探しています。これは可能だと思う。このタイプの分析を実行するのに適した方法は何でしょうか?このタイプの分析を行うためのRプログラム/パッケージの提案はありますか?

ここに画像の説明を入力してください


失われたデータはMAR(Rubin(1976)の用語では)であると仮定できますか?
user603

はい、値はランダムに欠落していると見なすことができます(MAR)。最近の編集をご覧ください。
rdorlearn

回答:


7

この質問は、局所的な異常値を特定して修正するために、最近傍堅牢な方法で使用する方法を求めています。どうしてそうしないのですか?

手順は、ロバストな局所平滑化を計算し、残差を評価し、大きすぎるものをゼロにすることです。これは、すべての要件を直接満たし、異なるアプリケーションに適応するのに十分な柔軟性があります。これは、局所的な近傍のサイズと外れ値を識別するためのしきい値を変更できるためです。

(なぜ柔軟性がそんなに重要なのでしょうか?そのような手順は、特定のローカライズされた動作を「外れた」ものとして識別する可能性が高いためです。そのため、そのような手順はすべてよりスムーズであると見なすことができます。詳細の保持とローカルの外れ値の検出の失敗とのトレードオフをある程度制御する必要があります。)

この手順のもう1つの利点は、値の長方形のマトリックスが必要ないことです。実際、このようなデータに適したローカルスムーザーを使用することで、不規則なデータにも適用できます。

R、ほとんどのフル機能の統計パッケージと同様に、などの堅牢なローカルスムーザーがいくつか組み込まれていloessます。次の例は、それを使用して処理されました。マトリックスには、行と列(ほぼエントリ)があります。これは、いくつかの局所的な極値と、微分不可能な点の線(「折り目」)を持つ複雑な関数を表します。わずかに超えるにポイント-非常に高い割合が「範囲外」とみなされる-その標準偏差だけでガウス誤差を添加した1 / 20元のデータの標準偏差を。これにより、この合成データセットは、現実的なデータの困難な機能の多くを提示します。49 4000 5 7949400051/20

フィギュア

R慣例により)行列の行は垂直のストリップとして描画されることに注意してください。残差を除くすべての画像は陰影付きで、値のわずかな変動を表示します。これがなければ、ほとんどすべてのローカルの外れ値が見えなくなります!

「実」(オリジナル汚染されていない)画像に「帰属」(アップ固定)を比較することで、外れ値を除去することから実行折り目(の一部、全部ではないが、滑らかたことは明らかであるダウン49 30 ;ライトシアンが「残差」プロット)でストライプを角度付けとしては明白です。0794930

「残差」プロットの斑点は、明らかに孤立した局所的な外れ値を示しています。このプロットには、基礎となるデータに起因する他の構造(その斜めのストライプなど)も表示されます。データの空間モデルを使用することで(地球統計学的手法を介して)この手順を改善できますが、それを説明し、それを説明するには、ここから遠く離れた場所に行く必要があります。

1022003600

#
# Create data.
#
set.seed(17)
rows <- 2:80; cols <- 2:50
y <- outer(rows, cols, 
           function(x,y) 100 * exp((abs(x-y)/50)^(0.9)) * sin(x/10) * cos(y/20))
y.real <- y
#
# Contaminate with iid noise.
#
n.out <- 200
cat(round(100 * n.out / (length(rows)*length(cols)), 2), "% errors\n", sep="")
i.out <- sample.int(length(rows)*length(cols), n.out)
y[i.out] <- y[i.out] + rnorm(n.out, sd=0.05 * sd(y))
#
# Process the data into a data frame for loess.
#
d <- expand.grid(i=1:length(rows), j=1:length(cols))
d$y <- as.vector(y)
#
# Compute the robust local smooth.
# (Adjusting `span` changes the neighborhood size.)
#
fit <- with(d, loess(y ~ i + j, span=min(1/2, 125/(length(rows)*length(cols)))))
#
# Display what happened.
#
require(raster)
show <- function(y, nrows, ncols, hillshade=TRUE, ...) {
  x <- raster(y, xmn=0, xmx=ncols, ymn=0, ymx=nrows)
  crs(x) <- "+proj=lcc +ellps=WGS84"
  if (hillshade) {
    slope <- terrain(x, opt='slope')
    aspect <- terrain(x, opt='aspect')
    hill <- hillShade(slope, aspect, 10, 60)
    plot(hill, col=grey(0:100/100), legend=FALSE, ...)
    alpha <- 0.5; add <- TRUE
  } else {
    alpha <- 1; add <- FALSE
  }
  plot(x, col=rainbow(127, alpha=alpha), add=add, ...)
}

par(mfrow=c(1,4))
show(y, length(rows), length(cols), main="Data")

y.res <- matrix(residuals(fit), nrow=length(rows))
show(y.res, length(rows), length(cols), hillshade=FALSE, main="Residuals")
#hist(y.res, main="Histogram of Residuals", ylab="", xlab="Value")

# Increase the `8` to find fewer local outliers; decrease it to find more.
sigma <- 8 * diff(quantile(y.res, c(1/4, 3/4)))
mu <- median(y.res)
outlier <- abs(y.res - mu) > sigma
cat(sum(outlier), "outliers found.\n")

# Fix up the data (impute the values at the outlying locations).
y.imp <- matrix(predict(fit), nrow=length(rows))
y.imp[outlier] <- y[outlier] - y.res[outlier]

show(y.imp, length(rows), length(cols), main="Imputed")
show(y.real, length(rows), length(cols), main="Real")

whuber:外れ値が孤立したセルであると仮定していることを正しく理解していますか?もしそうなら、この仮定に違反するこのアプローチがどれほど敏感か知っていますか?
user603

@ user603外れ値が孤立しているとは思わない-例ではそれらの多くはそうではない-しかし、私は、任意の局所的な近隣の外れ値の割合が十分に低く、局所的なスムーザーを分解しないと仮定している。おそらく、このような外れ値の割合が非常に大きい近隣がある場合、それらはもはや局所的な外れ値とは見なされません!
whuber

1
@ user603絶対に!しかし、それは「最も近い隣人が最良の予測因子である」と推定される状況から私たちを連れ去るように思われます。その点を考慮して、データを処理するときに行うことはすべて、このローカルな予測可能性を維持する必要があります。1つの列がその隣の列と「大きく異なるスケール」を持っている場合、その状況はこの規定の前提にかなり強く違反します。(列に焦点を当てているのも不思議です。
質問を読み直す

1
p

1
@whuberこれは素晴らしい解決策です、ありがとう-少なくともいくつかの欠損値を導入しようとしていましたが、これは常に実際の状況です-欠損値(たとえば、50欠損値)と外れ値(100外れ値)が混在しています。エキサイティング!
rdorlearn

4

この記事をご覧になることをお勧めします[0]。著者が提案する方法がNN入力よりも少し洗練されていることを除き(それは出発点として類似のものを使用しますが)、それが対処することを目的とする問題は、あなたの説明にかなりよく当てはまるようです。

XXnp

k

各反復の最初のステップは、データ代入ステップです。これは、EMアルゴリズムの場合と同様に行われます。欠落しているセルは、予想される値で埋められます(これがEステップです)。

2ステップの反復手順の2番目の部分では、前のステップで取得した拡張データに(堅牢な)PCAを適合させます。これにより、スペクトル分解が行われますXXttRppkLLkkDDkp

論文を要約すると、彼らが提案する一般的なアルゴリズムは次のとおりです。

  • l=0WW0Xバツ

  • 次に、収束するまで行います。

    a。堅牢なPCAを実行するWWlttlLLlDDl

    l=l+1

    c。使用YYl=LLl1WWl1ttl1LLl1

    WWlWWlNttl1LLl1DDl1LLl1YYl

||WWl1WWl||FttLLDD

ttl1LLl1DDl1

このアプローチは、補完の品質をチェックするための多くの診断ツールも提供します。たとえば、から複数のドローを作成することもできますNttl1LLDDLL

このアプローチの既製のR実装はわかりませんが、サブコンポーネント(主に堅牢なPCAアルゴリズム)から簡単に作成できます。これらはRで適切に実装されてます。rrcovパッケージを参照してください(論文はこの主題についての静かな情報提供)。

  • [0] Serneels S.およびVerdonck、T.(2008)。外れ値と欠損要素を含むデータの主成分分析。Computational Statistics&Data Analysis vol:52 issue:3 pages:1712-1727。

おかげで、私の目的は、外れ値を予測することではなく(分布から離れているという意味で)、パターンに適合しないオフバリュー(外れ値)を予測することではありません。
rdorlearn

あなたは私の答えを誤解したと思います。このアプローチでは、任意の値の予測が生成されますが、外れ値はあまり予測されません。これは、PCA適合に影響を与えることが許可されていないためです。論文を読むことをお勧めします。
user603

おかげで、アプローチは面白そうで、推測もうまくいくかもしれません。しかし、適切なコードがないと実装が困難になります-少なくとも私には高度すぎます!
rdorlearn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.