二変量中央値のデータと信頼 "楕円"(領域?)を見つけますか?


7

二変量中央値の周りのデータと信頼楕円を計算する方法について疑問に思っています。たとえば、次のデータの二変量平均のデータ楕円または信頼楕円を簡単に計算できます(ここではデータ楕円のみを示しています)。

library("car")
set.seed(1)
df <- data.frame(x = rnorm(200, mean = 4, sd = 1.5),
                 y = rnorm(200, mean = 1.4, sd = 2.5))
plot(df)
with(df, dataEllipse(x, y, level = 0.68, add = TRUE))

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

しかし、私は二変量中央値に対してこれをどのように行うのかと苦労していますか?単変量の場合、リストラップをブートストラップして必要な間隔を生成することができますが、これを二変量の場合に変換する方法がわかりませんか?

@Andy Wが指摘したように、中央値は一意に定義されていません。この例では、そのポイントでの観測間の距離のL1ノルムを最小化するポイントを見つけることにより、空間中央値を使用しました。観測されたデータポイントから空間中央値を計算するために最適化が使用されました。

さらに、実際のユースケースにおけるx、yデータペアは、非類似度マトリックスの主座標分析の2つの固有ベクトルであるため、特定の攻撃手段を提供する場合、xとyは直交している必要があります。

実際の使用例では、ユークリッド空間の点のグループのデータ/信頼楕円を計算します。例えば:

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

分析は、グループ間の分散の均一性のリーベン検定の多変量類似体です。多変量中心傾向の尺度として空間中央値または標準グループの重心を使用し、空間中央値の場合の上の図のデータ楕円に相当するものを追加します。


4
高次元の中央値は一意に定義されていません。しかし、より高い次元に一般化された箱ひげ図に興味があるかもしれません。たとえば、バグプロット:二変量箱ひげ図(Rousseeuw et al。、1999)。
アンディW

+1ありがとう@AndyW-私はバグプロットについて完全に忘れていました(これは、ここ数年私のEDA講義を教えないことで得られるものだと思います-完全に頭がずれました!) -投稿を更新しますが、データポイントからそのポイントまでの距離のL1ノルムを最小化するポイントである空間中央値を計算しました。
Gavin Simpson

1
方向と方向が直交していることがわかっている場合は、それらの中央値を個別に推定してみませんか?言い換えれば、アプリケーションの中央値について何か特別なことはありますか?xyL1
whuber

2
@whuberああ、私はそこに誤解したかもしれません。実際のユースケースなどの新しいイチジクを追加します。元のデータから計算された非類似度行列は、PCoAを使用してユークリッド空間に埋め込まれます。しかし、私が言及しなかったのは、データポイントのグループに対してこのユークリッド空間の空間中央値を計算することです。したがって、xとyはすべてのグループにわたって直交しますが、1つのグループ内には相関がある場合があります。図については、更新された図を1分後に参照してください。これについてお詫びします。私はQ.を投稿するとき、私は、実際の用途の例特定の側面の重要性を高く評価していなかった
ギャビン・シンプソン

2
1つのアプローチは、ブートストラップに基づくことができると思います。幾何学的中央値の推定値のブートストラップ分布を取得し、推定値の部分を含む領域をマークします。推定値が正規分布に従うと仮定して満足している場合、それは簡単です。2Dガウス分布を当てはめ、対応する楕円を描画します。そうでない場合、たとえば、2d分布のカーネル密度推定を取得し、確率密度のを含む領域を見つけることができます。1α1α
アメーバ

回答:


6

これはいい質問です。

@amoebaの提案に従い、depth::med()with を使用して空間中央値をブートストラップしmethod="Spatial"ます。ただし、少し複雑です。medデータポイントが重複している場合は気に入らないため、簡単なブートストラップは実行できません。代わりに、ブートストラップサンプルを描画し、空間の中央値を計算する前に、各ポイントをわずかな量(元のデータサンプルのと各次元の最小距離未満)だけジッターします。xy

最後に、ブートストラップされた中央値の指定された比率(95%)をカバーする最小の楕円を計算してプロットします。

library(depth)      # for med()
library(MASS)           # for cov.rob()
library(cluster)    # for ellipsoidhull()

# create data
set.seed(1)
df <- data.frame(x = rnorm(200, mean = 4, sd = 1.5),
                 y = rnorm(200, mean = 1.4, sd = 2.5))

# find minimum distances in each dimension for later jittering
foo <- outer(X=df$x,Y=df$x,FUN=function(xx,yy)abs(xx-yy))
delta.x <- min(foo[upper.tri(foo)])/2
foo <- outer(X=df$y,Y=df$y,FUN=function(xx,yy)abs(xx-yy))
delta.y <- min(foo[upper.tri(foo)])/2

# bootstrap spatial medians, using jittering
n.boot <- 1000
pb <- winProgressBar(max=n.boot)
boot.med <- matrix(NA,nrow=n.boot,ncol=2)
for ( ii in 1:n.boot ) {
    setWinProgressBar(pb,ii,paste(ii,"of",n.boot))
    index <- sample(1:nrow(df),nrow(df),replace=TRUE)
    bar <- df[index,] + 
      data.frame(x=runif(nrow(df),-delta.x,delta.x),
                 y=runif(nrow(df),-delta.y,delta.y))
    boot.med[ii,] <- med(bar,method="Spatial")$median
}
close(pb)

# specify confidence level
pp <- 0.95

# find smallest ellipse containing the specified proportion of bootstrapped medians
fit <- cov.rob(boot.med, quantile.used = ceiling(pp*n.boot), method = "mve")
best_ellipse <- ellipsoidhull( boot.med[fit$best,] )

plot(df)
points(boot.med,pch=19,col="grey",cex=0.5)
points(df)
lines(predict(best_ellipse), col="red")
legend("bottomright",bg="white",pch=c(21,19,NA),
    col=c("black","grey","red"),pt.bg=c("white",NA,NA),lwd=c(0,0,1),
    legend=c("Observations","Bootstrapped medians","Confidence ellipse"))

信頼楕円

最後に、2変量の空間中央値は漸近的に正規分布していることに注意してください(Brown、1983、JRSS、Series B。したがって、上記の「ジッターブートストラップ」を省略して、楕円を直接計算し、が「十分に漸近的」であると信頼できます。 」次の日の時間があれば、この投稿を編集して、このパラメトリック信頼楕円を含めることができます。n=200

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