ブートストラップまたはモンテカルロアプローチを使用して重要な主成分を決定する方法は?


40

主成分分析(PCA)または経験的直交関数(EOF)分析から得られる重要なパターンの数を特定することに興味があります。この方法を気候データに適用することに特に興味があります。データフィールドはMxN行列で、Mは時間次元(例:日)、Nは空間次元(例:経度/緯度)です。重要なPCを判別するための可能なブートストラップ方法を読みましたが、より詳細な説明を見つけることができませんでした。これまで、私はこのカットオフを決定するために、Northの経験則(North et al

例として:

###Generate data
x <- -10:10
y <- -10:10
grd <- expand.grid(x=x, y=y)

#3 spatial patterns
sp1 <- grd$x^3+grd$y^2
tmp1 <- matrix(sp1, length(x), length(y))
image(x,y,tmp1)

sp2 <- grd$x^2+grd$y^2
tmp2 <- matrix(sp2, length(x), length(y))
image(x,y,tmp2)

sp3 <- 10*grd$y
tmp3 <- matrix(sp3, length(x), length(y))
image(x,y,tmp3)


#3 respective temporal patterns
T <- 1:1000

tp1 <- scale(sin(seq(0,5*pi,,length(T))))
plot(tp1, t="l")

tp2 <- scale(sin(seq(0,3*pi,,length(T))) + cos(seq(1,6*pi,,length(T))))
plot(tp2, t="l")

tp3 <- scale(sin(seq(0,pi,,length(T))) - 0.2*cos(seq(1,10*pi,,length(T))))
plot(tp3, t="l")


#make data field - time series for each spatial grid (spatial pattern multiplied by temporal pattern plus error)
set.seed(1)
F <- as.matrix(tp1) %*% t(as.matrix(sp1)) + 
as.matrix(tp2) %*% t(as.matrix(sp2)) + 
as.matrix(tp3) %*% t(as.matrix(sp3)) +
matrix(rnorm(length(T)*dim(grd)[1], mean=0, sd=200), nrow=length(T), ncol=dim(grd)[1]) # error term

dim(F)
image(F)


###Empirical Orthogonal Function (EOF) Analysis 
#scale field
Fsc <- scale(F, center=TRUE, scale=FALSE)

#make covariance matrix
C <- cov(Fsc)
image(C)

#Eigen decomposition
E <- eigen(C)

#EOFs (U) and associated Lambda (L) 
U <- E$vectors
L <- E$values

#projection of data onto EOFs (U) to derive principle components (A)
A <- Fsc %*% U

dim(U)
dim(A)

#plot of top 10 Lambda
plot(L[1:10], log="y")

#plot of explained variance (explvar, %) by each EOF
explvar <- L/sum(L) * 100
plot(explvar[1:20], log="y")


#plot original patterns versus those identified by EOF
layout(matrix(1:12, nrow=4, ncol=3, byrow=TRUE), widths=c(1,1,1), heights=c(1,0.5,1,0.5))
layout.show(12)

par(mar=c(4,4,3,1))
image(tmp1, main="pattern 1")
image(tmp2, main="pattern 2")
image(tmp3, main="pattern 3")

par(mar=c(4,4,0,1)) 
plot(T, tp1, t="l", xlab="", ylab="")
plot(T, tp2, t="l", xlab="", ylab="")
plot(T, tp3, t="l", xlab="", ylab="")

par(mar=c(4,4,3,1))
image(matrix(U[,1], length(x), length(y)), main="eof 1") 
image(matrix(U[,2], length(x), length(y)), main="eof 2")
image(matrix(U[,3], length(x), length(y)), main="eof 3")

par(mar=c(4,4,0,1)) 
plot(T, A[,1], t="l", xlab="", ylab="")
plot(T, A[,2], t="l", xlab="", ylab="")
plot(T, A[,3], t="l", xlab="", ylab="")

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

そして、これが私がPCの重要性を判断するために使用してきた方法です。基本的に、経験則では、隣接するラムダ間の差は関連するエラーよりも大きくなければなりません。

###Determine significant EOFs

#North's Rule of Thumb
Lambda_err <- sqrt(2/dim(F)[2])*L
upper.lim <- L+Lambda_err
lower.lim <- L-Lambda_err
NORTHok=0*L
for(i in seq(L)){
    Lambdas <- L
    Lambdas[i] <- NaN
    nearest <- which.min(abs(L[i]-Lambdas))
    if(nearest > i){
        if(lower.lim[i] > upper.lim[nearest]) NORTHok[i] <- 1
    }
    if(nearest < i){
        if(upper.lim[i] < lower.lim[nearest]) NORTHok[i] <- 1
    }
}
n_sig <- min(which(NORTHok==0))-1

plot(L[1:10],log="y", ylab="Lambda (dots) and error (vertical lines)", xlab="EOF")
segments(x0=seq(L), y0=L-Lambda_err, x1=seq(L), y1=L+Lambda_err)
abline(v=n_sig+0.5, col=2, lty=2)
text(x=n_sig, y=mean(L[1:10]), labels="North's Rule of Thumb", srt=90, col=2)

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

私はBjörnssonとVenegasで(でチャプター区間を発見した1997年有用であることが重要テストに) -彼らはそのテストの三つのカテゴリーを参照してください支配的な分散型は、私が使用することに期待していますおそらく何です。時間ディメンションをシャッフルし、多くの順列でラムダを再計算するタイプのモンテカルロアプローチを指します。von Storch and Zweiers(1999)は、ラムダスペクトルを参照「ノイズ」スペクトルと比較するテストについても言及しています。どちらの場合も、これがどのように行われるのか、また順列によって識別された信頼区間が与えられた場合に有意性テストがどのように行われるのかについて、私は少し確信が持てません。

ご協力いただきありがとうございます。

参照:Björnsson、H. and Venegas、SA(1997)。「気候データのEOFおよびSVD分析のマニュアル」、マギル大学、CCGCRレポートNo. 97-1、モントリオール、ケベック、52pp。http://andvari.vedur.is/%7Efolk/halldor/PICKUP/eof.pdf

GR North、TL Bell、RF Cahalan、およびFJ Moeng。(1982)。経験的直交関数の推定におけるサンプリング誤差。月 ちょっと。改訂、110:699–706。

フォン・ストーチ、H、Zwiers、FW(1999)。気候研究における統計分析。ケンブリッジ大学出版局。


ブートストラップアプローチに関する参考文献は何ですか?
マイケルチャーニック

4
ブートストラップはここでは機能しません。ほとんどすべての観測値が他のほとんどの観測値と相関しているデータセットでは機能しません。データの正当な複製を作成するには、独立性、または少なくとも近似的な独立性(時系列の混合条件など)が必要です。もちろん、ワイルドブートストラップのような、これらの問題を回避できる特別なブートストラップスキームがあります。しかし、私はこれにあまり賭けません。そして、あなたは多変量統計の本を見て、それらに従う必要があります。そうすれば、答えとしてもう一つの防御できないホッケースティックを取得しません。
StasK

2
ボックス内の@Marcは、時系列に使用されるさまざまなブロックブートストラップ、MBB(移動ブロックブートストラップ)CBB(円形ブロックブートストラップ)、またはデータの時間ブロックを使用してモデルを推定するSBB(静止ブロックブートストラップ)を指している場合がありますパラメーター。
マイケルチャーニック

3
@StasK時系列にブートストラップを適用するためにミキシング条件が必要だと思う理由がわかりません。モデルベースの方法では、時系列構造に適合させるだけで、残差をブートストラップできます。そのため、トレンドと季節性コンポーネントを含む時系列を作成し、それでもモデルベースのブートストラップを実行できます。
マイケルチャーニック

2
全文にアクセスすることはできませんが、見てみることができます。「ハミドババモラディ、フランスファンデンバーグ、ÅsmundRinnan、主成分分析におけるブートストラップベースの信頼限界—ケーススタディ、ケモメトリックスとインテリジェントラボシステム、ボリューム120、2013年1月15日、ページ97-105、ISSN 0169-7439、10.1016 / j.chemolab.2012.10.007。(sciencedirect.com/science/article/pii/S0169743912002171)キーワード:ブートストラップ、PCA、信頼限界、BC <サブ> A </サブ>;不確実性」を
tomasz74

回答:


19

これは私の質問ですが、ここで対話を少し進めてみます。質問してから6か月が経ちましたが、残念ながら完全な答えは得られていません。これまでに収集した内容を要約し、残りの問題について詳しく説明できるかどうかを確認します。長い答えを言い訳してください、しかし、私は他の方法を見ません...

最初に、おそらくより良い合成データセットを使用したいくつかのアプローチを示します。これは、Beckers and Rixon(2003)による論文で、ギャップのあるデータに対してEOFを実行するためのアルゴリズムの使用について説明しています。誰かが興味がある場合は、Rでアルゴリズムを再現しました(リンク)。

合成データセット:

#color palette
pal <- colorRampPalette(c("blue", "cyan", "yellow", "red"))

#Generate data
m=50
n=100
frac.gaps <- 0.5 # the fraction of data with NaNs
N.S.ratio <- 0.25 # the Noise to Signal ratio for adding noise to data

x <- (seq(m)*2*pi)/m
t <- (seq(n)*2*pi)/n


#True field
Xt <- 
 outer(sin(x), sin(t)) + 
 outer(sin(2.1*x), sin(2.1*t)) + 
 outer(sin(3.1*x), sin(3.1*t)) +
 outer(tanh(x), cos(t)) + 
 outer(tanh(2*x), cos(2.1*t)) + 
 outer(tanh(4*x), cos(0.1*t)) + 
 outer(tanh(2.4*x), cos(1.1*t)) + 
 tanh(outer(x, t, FUN="+")) + 
 tanh(outer(x, 2*t, FUN="+"))

Xt <- t(Xt)
image(Xt, col=pal(100))

#Noise field
set.seed(1)
RAND <- matrix(runif(length(Xt), min=-1, max=1), nrow=nrow(Xt), ncol=ncol(Xt))
R <- RAND * N.S.ratio * Xt

#True field + Noise field
Xp <- Xt + R
image(Xp, col=pal(100))

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

したがって、真のデータフィールドXtは9つの信号で構成されており、ノイズを追加して観測フィールドを作成しましたXp。これは以下の例で使用します。EOFは次のように決定されます。

EOF

#make covariance matrix
C <- t(Xp) %*% Xp #cov(Xp)
image(C)

#Eigen decomposition
E <- svd(C)

#EOFs (U) and associated Lambda (L) 
U <- E$u
L <- E$d

#projection of data onto EOFs (U) to derive principle components (A)
A <- Xp %*% U

元の例で使用した例に従って、Northの経験則を使用して「重要な」EOFを決定します。

ノースの経験則

Lambda_err <- sqrt(2/dim(Xp)[2])*L
upper.lim <- L+Lambda_err
lower.lim <- L-Lambda_err
NORTHok=0*L
for(i in seq(L)){
    Lambdas <- L
    Lambdas[i] <- NaN
    nearest <- which.min(abs(L[i]-Lambdas))
    if(nearest > i){
        if(lower.lim[i] > upper.lim[nearest]) NORTHok[i] <- 1
    }
    if(nearest < i){
        if(upper.lim[i] < lower.lim[nearest]) NORTHok[i] <- 1
    }
}
n_sig <- min(which(NORTHok==0))-1
n_sig

plot(L[1:20],log="y", ylab="Lambda (dots) and error (vertical lines)", xlab="EOF")
segments(x0=seq(L), y0=L-Lambda_err, x1=seq(L), y1=L+Lambda_err)
abline(v=n_sig+0.5, col=2, lty=2)
text(x=n_sig, y=mean(L[1:10]), labels="North's Rule of Thumb", srt=90, col=2)

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

2:4のラムダ値は振幅が互いに非常に近いため、これらは経験則では重要ではないと見なされます。つまり、それぞれのEOFパターンは、同様の振幅でオーバーラップして混合する可能性があります。これは、フィールドに実際に9つの信号が存在することがわかっているため、残念です。

より主観的なアプローチは、対数変換されたラムダ値(「スクリードプロット」)を表示し、その後、トレーリング値に回帰を適合させることです。次に、ラムダ値がこの線の上にあるレベルを視覚的に判断できます。

スクリープロット

ntrail <- 35
tail(L, ntrail)
fit <- lm(log(tail(L, ntrail)) ~ seq(length(L)-ntrail+1, length(L)))
plot(log(L))
abline(fit, col=2)

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

したがって、5つの主要なEOFはこの線の上にあります。Xp追加のノイズが追加されず、9つのすべての元の信号が結果に現れる場合に、この例を試しました。そのため、EOF 6:9の重要性は、その振幅がフィールドのノイズよりも低いという事実によるものです。

より客観的な方法は、Overland and Preisendorfer(1982)による「Rule N」基準です。wqパッケージ内に実装があります。これを以下に示します。

ルールN

library(wq)
eofNum(Xp, distr = "normal", reps = 99)

RN <- ruleN(nrow(Xp), ncol(Xp), type = "normal", reps = 99)
RN
eigs <- svd(cov(Xp))$d
plot(eigs, log="y")
lines(RN, col=2, lty=2)

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

ルールNは4つの重要なEOFを特定しました。個人的には、この方法をよりよく理解する必要があります。なぜそれと同じ分布を使用しないランダムフィールドに基づいてエラーのレベルを測定することが可能Xpですか?このメソッドの1つのバリエーションXpは、各列がランダムにシャッフルされるようにデータをリサンプリングすることです。このようにして、ランダムフィールドの合計分散がと同じになるようにしXpます。何回もリサンプリングすることで、分解のベースラインエラーを計算できます。

ランダムフィールドを使用したモンテカルロ(つまり、ヌルモデルの比較)

iter <- 499
LAMBDA <- matrix(NaN, ncol=iter, nrow=dim(Xp)[2])

set.seed(1)
for(i in seq(iter)){
    #i=1

    #random reorganize dimensions of scaled field
    Xp.tmp <- NaN*Xp
    for(j in seq(dim(Xp.tmp)[2])){
        #j=1
        Xp.tmp[,j] <- Xp[,j][sample(nrow(Xp))]
    }

    #make covariance matrix
    C.tmp <- t(Xp.tmp) %*% Xp.tmp #cov(Xp.tmp)

    #SVD decomposition
    E.tmp <- svd(C.tmp)

    #record Lambda (L) 
    LAMBDA[,i] <- E.tmp$d

    print(paste(round(i/iter*100), "%", " completed", sep=""))
}

boxplot(t(LAMBDA), log="y", col=8, border=2, outpch="")
points(L)

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

繰り返しますが、4つのEOFはランダムフィールドの分布の上にあります。このアプローチ、およびルールNのアプローチに関する私の心配は、これらがLambda値の信頼区間に真に対応していないことです。たとえば、最初のLambda値が高いと、後続の分散によって説明される分散の量が自動的に少なくなります。したがって、ランダムフィールドから計算されたラムダは、常に緩やかな勾配を持ち、重要なEOFの選択が少なすぎる可能性があります。[注:このeofNum()関数は、EOFが相関行列から計算されることを前提としています。この数は、たとえば共分散行列を使用している場合は異なる場合があります(中心にあるがスケーリングされていないデータ)。]

最後に、@ tomasz74はBabamoradiらによる論文に言及しました。(2013)、私は簡単に見てきました。非常に興味深いですが、ラムダではなくEOF負荷と係数のCIの計算により重点を置いているようです。それでも、同じ方法論を使用してラムダ誤差を評価するために採用される可能性があると思います。新しいフィールドが作成されるまで行をリサンプリングすることにより、データフィールドのブートストラップのリサンプリングが行われます。同じ行を複数回リサンプリングすることができますが、これはノンパラメトリックなアプローチであり、データの分布について推測する必要はありません。

Lambda値のブートストラップ

B <- 40 * nrow(Xp)
LAMBDA <- matrix(NaN, nrow=length(L), ncol=B)
for(b in seq(B)){
    samp.b <- NaN*seq(nrow(Xp))
    for(i in seq(nrow(Xp))){
        samp.b[i] <- sample(nrow(Xp), 1)
    }
    Xp.b  <- Xp[samp.b,]
    C.b  <- t(Xp.b) %*% Xp.b 
    E.b  <- svd(C.b)
    LAMBDA[,b] <- E.b$d
    print(paste(round(b/B*100), "%", " completed", sep=""))
}
boxplot(t(LAMBDA), log="y", col=8, outpch="", ylab="Lambda [log-scale]")
points(L, col=4)
legend("topright", legend=c("Original"), pch=1, col=4)

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

これは、ラムダ値の誤差を計算するための北朝鮮の経験則よりも堅牢であるかもしれませんが、EOFの重要性の問題は、これが何を意味するかについての異なる意見に帰着すると考えています。北朝鮮の経験則とブートストラップ法では、重要度は、TeereがLambda値間で重複しているかどうかに基づいているようです。存在する場合、これらのEOFは信号に混在し、「真の」パターンを表さない可能性があります。一方、これらの2つのEOFは、かなりの量の分散を記述する場合があります(ランダムフィールドの分解と比較して-ルールNなど)。したがって、ノイズを除去することに関心がある場合(つまり、EOF切り捨てを使用)、ルールNで十分です。データセットの実際のパターンを決定することに関心がある場合、Lambdaオーバーラップのより厳格な基準はより堅牢になる可能性があります。

繰り返しますが、私はこれらの問題の専門家ではないので、より多くの経験を持つ人がこの説明に追加できることを望んでいます。

参照:

ベッカーズ、ジャン=マリー、M。リクセン。「不完全な海洋データセットからのEOF計算とデータ入力。」Journal of Atmospheric and Oceanic Technology 20.12(2003):1839-1856。

Overland、J。、およびR. ちょっと。Rev.、110、1-4、1982。

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