Ich bin daran interessiert, die Anzahl signifikanter Muster zu bestimmen, die aus einer Hauptkomponentenanalyse (PCA) oder einer empirischen Orthogonalfunktionsanalyse (EOF) hervorgehen. Ich bin besonders daran interessiert, diese Methode auf Klimadaten anzuwenden. Das Datenfeld ist eine MxN-Matrix, wobei M die Zeitdimension (z. B. Tage) und N die räumliche Dimension (z. B. Lon / Lat-Standorte) ist. Ich habe von einer möglichen Bootstrap-Methode gelesen, um wichtige PCs zu bestimmen, konnte jedoch keine detailliertere Beschreibung finden. Bisher habe ich die Faustregel von North (North et al ., 1982) angewendet, um diesen Grenzwert zu bestimmen, aber ich habe mich gefragt, ob eine robustere Methode verfügbar ist.
Als Beispiel:
###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="")
Und hier ist die Methode, mit der ich die Bedeutung des PCs ermittelt habe. Grundsätzlich gilt als Faustregel, dass der Unterschied zwischen benachbarten Lambdas größer sein muss als der zugehörige Fehler.
###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)
Ich habe den Kapitelabschnitt von Björnsson und Venegas ( 1997 ) über Signifikanztests als hilfreich empfunden - sie beziehen sich auf drei Kategorien von Tests, von denen der dominante Varianztyp wahrscheinlich das ist, was ich zu verwenden hoffe. Sie beziehen sich auf eine Art Monte-Carlo-Ansatz, bei dem die Zeitdimension gemischt und die Lambdas über viele Permutationen neu berechnet werden. von Storch und Zweiers (1999) verweisen auch auf einen Test, der das Lambda-Spektrum mit einem Referenz- "Rausch" -Spektrum vergleicht. In beiden Fällen bin ich mir etwas unsicher, wie dies getan werden könnte und wie der Signifikanztest angesichts der durch die Permutationen identifizierten Konfidenzintervalle durchgeführt wird.
Danke für Ihre Hilfe.
Referenzen: Björnsson, H. und Venegas, SA (1997). "Ein Handbuch für EOF- und SVD-Analysen von Klimadaten", McGill University, CCGCR-Bericht Nr. 97-1, Montréal, Québec, 52 Seiten. http://andvari.vedur.is/%7Efolk/halldor/PICKUP/eof.pdf
GR Nord, TL Bell, RF Cahalan und FJ Moeng. (1982). Abtastfehler bei der Schätzung empirischer orthogonaler Funktionen. Montag Wea. Rev. 110: 699–706.
von Storch, H., Zwiers, FW (1999). Statistische Analyse in der Klimaforschung. Cambridge University Press.