Temel Bileşen Analizi (PCA) veya Ampirik Ortogonal İşlev (EOF) Analizinden çıkan önemli kalıpların sayısını belirlemekle ilgileniyorum. Özellikle bu yöntemi iklim verilerine uygulamakla ilgileniyorum. Veri alanı, M'nin zaman boyutu (örneğin günler) ve N'nin uzaysal boyut (örneğin, lon / lat konumları) olduğu bir MxN matrisidir. Önemli bilgisayarları belirlemek için olası bir önyükleme yöntemini okudum, ancak daha ayrıntılı bir açıklama bulamadım. Şimdiye dek, bu kesiti belirlemek için Kuzey'in Kuralını (Kuzey ve ark ., 1982) uygulamıştım, ancak daha sağlam bir yöntem olup olmadığını merak ediyordum.
Örnek olarak:
###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="")
Ve işte PC'nin önemini belirlemek için kullandığım yöntem. Temel olarak, temel kural, komşu Lambdalar arasındaki farkın, ilişkili hatalarından daha büyük olması gerektiğidir.
###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 ve Venegas ( 1997 ) tarafından anlamlılık testlerinde yardımcı olacak bölüm bölümünü buldum - bunlar baskın varyans tipinin muhtemelen kullanmayı umduğum gibi olduğu üç test kategorisine atıfta bulunuyorlar . Zaman boyutunun karıştırılması ve Lambdasların birçok permütasyon üzerinde yeniden hesaplanması için bir tür Monte Carlo yaklaşımı. von Storch ve Zweiers (1999) Lambda spektrumunu referans "gürültü" spektrumuyla karşılaştıran bir teste de atıfta bulunur. Her iki durumda da, bunun nasıl yapılabileceğinden ve permütasyonlar tarafından belirlenen güven aralıkları verildiğinde önem testinin nasıl yapıldığından emin değilim.
Yardımınız için teşekkürler.
Kaynaklar: Björnsson, H. ve Venegas, SA (1997). "İklim verilerinin EOF ve SVD analizleri için bir el kitabı", McGill Üniversitesi, CCGCR Rapor No. 97-1, Montréal, Québec, 52pp. http://andvari.vedur.is/%7Efolk/halldor/PICKUP/eof.pdf
GR Kuzey, TL Bell, RF Cahalan ve FJ Moeng. (1982). Ampirik ortogonal fonksiyonların kestirimindeki örnekleme hataları. Pzt Wea. Rev., 110: 699-706.
Storch, H, Zwiers, FW (1999). İklim araştırmalarında istatistiksel analiz. Cambridge Üniversitesi Basını.