Saya tertarik untuk menentukan jumlah pola signifikan yang keluar dari Analisis Komponen Utama (PCA) atau Analisis Fungsi Orthogonal Empiris (EOF). Saya khususnya tertarik menerapkan metode ini pada data iklim. Bidang data adalah matriks MxN dengan M sebagai dimensi waktu (misalnya hari) dan N menjadi dimensi spasial (misalnya lokasi lon / lat). Saya telah membaca tentang metode bootstrap yang mungkin untuk menentukan PC yang signifikan, tetapi tidak dapat menemukan deskripsi yang lebih rinci. Sampai sekarang, saya telah menerapkan Rule of Thumb Utara (North et al ., 1982) untuk menentukan cutoff ini, tapi saya bertanya-tanya apakah metode yang lebih kuat tersedia.
Sebagai contoh:
###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="")
Dan, inilah metode yang telah saya gunakan untuk menentukan signifikansi PC. Pada dasarnya, aturan praktisnya adalah bahwa perbedaan antara Lambda yang berdekatan harus lebih besar daripada kesalahan yang terkait.
###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)
Saya telah menemukan bagian bab oleh Björnsson dan Venegas ( 1997 ) tentang tes signifikansi untuk membantu - mereka merujuk pada tiga kategori tes, di mana varian dominan- jenis mungkin apa yang saya harapkan untuk digunakan. Rujukan ke jenis pendekatan Monte Carlo mengocok dimensi waktu dan mengkomputasi ulang Lambdas melalui banyak permutasi. von Storch dan Zweiers (1999) juga merujuk pada tes yang membandingkan spektrum Lambda dengan referensi "noise". Dalam kedua kasus, saya agak tidak yakin bagaimana ini bisa dilakukan, dan juga bagaimana uji signifikansi dilakukan mengingat interval kepercayaan yang diidentifikasi oleh permutasi.
Terima kasih atas bantuan Anda.
Referensi: Björnsson, H. dan Venegas, SA (1997). "Manual untuk analisis data iklim EOF dan SVD", McGill University, CCGCR Laporan No. 97-1, Montréal, Québec, 52pp. http://andvari.vedur.is/%7Efolk/halldor/PICKUP/eof.pdf
GR Utara, TL Bell, RF Cahalan, dan FJ Moeng. (1982). Kesalahan pengambilan sampel dalam estimasi fungsi ortogonal empiris. Senin Wea. Pdt., 110: 699–706.
von Storch, H, Zwiers, FW (1999). Analisis statistik dalam penelitian iklim. Cambridge University Press.