Sono interessato a determinare il numero di modelli significativi che emergono da un'analisi della componente principale (PCA) o dell'analisi della funzione ortogonale empirica (EOF). Sono particolarmente interessato ad applicare questo metodo ai dati climatici. Il campo dati è una matrice MxN con M come dimensione temporale (ad esempio giorni) e N come dimensione spaziale (ad esempio posizioni lon / lat). Ho letto di un possibile metodo bootstrap per determinare PC significativi, ma non sono stato in grado di trovare una descrizione più dettagliata. Fino ad ora, ho applicato North's Rule of Thumb (North et al ., 1982) per determinare questo limite, ma mi chiedevo se fosse disponibile un metodo più robusto.
Come esempio:
###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="")
Ed ecco il metodo che ho usato per determinare il significato del PC. Fondamentalmente, la regola empirica è che la differenza tra Lambdas vicini deve essere maggiore del loro errore associato.
###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)
Ho trovato utile la sezione del capitolo di Björnsson e Venegas ( 1997 ) sui test di significatività - si riferiscono a tre categorie di test, di cui il tipo di varianza dominante è probabilmente quello che spero di usare. Si riferiscono a un tipo di approccio Monte Carlo di mescolare la dimensione temporale e ricalcolare le Lambdas su molte permutazioni. von Storch e Zweiers (1999) fanno anche riferimento a un test che confronta lo spettro Lambda con uno spettro di "rumore" di riferimento. In entrambi i casi, sono un po 'incerto su come ciò possa essere fatto, e anche su come viene eseguito il test di significatività alla luce degli intervalli di confidenza identificati dalle permutazioni.
Grazie per l'aiuto.
Riferimenti: Björnsson, H. e Venegas, SA (1997). "Un manuale per analisi EOF e SVD dei dati climatici", McGill University, Rapporto CCGCR n. 97-1, Montréal, Québec, 52pp. http://andvari.vedur.is/%7Efolk/halldor/PICKUP/eof.pdf
GR nord, TL Bell, RF Cahalan e FJ Moeng. (1982). Errori di campionamento nella stima delle funzioni ortogonali empiriche. Mon. Wea. Rev., 110: 699–706.
von Storch, H, Zwiers, FW (1999). Analisi statistiche nella ricerca sul clima. Cambridge University Press.