Je suis intéressé par la détermination du nombre de régularités significatives issues d'une analyse en composantes principales (ACP) ou d'une fonction empirique orthogonale (EOF). Je suis particulièrement intéressé par l'application de cette méthode aux données climatiques. Le champ de données est une matrice MxN, M étant la dimension temporelle (par exemple, les jours) et N étant la dimension spatiale (par exemple, les emplacements lon / lat). J'ai lu une méthode de bootstrap possible pour déterminer les PC significatifs, mais je n'ai pas pu trouver une description plus détaillée. Jusqu'à présent, j'ai appliqué la règle de base de North (North et al ., 1982) pour déterminer ce seuil, mais je me demandais si une méthode plus robuste était disponible.
Par exemple:
###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="")
Et voici la méthode que j’utilise pour déterminer l’importance du PC. Fondamentalement, la règle empirique est que la différence entre les Lambdas voisins doit être supérieure à l'erreur qui leur est associée.
###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)
J'ai trouvé utiles les sections de chapitres de Björnsson et Venegas ( 1997 ) sur les tests de signification. Elles renvoient à trois catégories de tests, dont le type de variance dominant correspond probablement à ce que j'espère utiliser. Le terme fait référence à un type d’approche de Monte Carlo consistant à mélanger la dimension temporelle et à recalculer les Lambdas sur de nombreuses permutations. von Storch et Zweiers (1999) font également référence à un test qui compare le spectre Lambda à un spectre de référence "bruit". Dans les deux cas, je suis un peu incertain de la façon dont cela pourrait être fait et de la manière dont le test de signification est effectué compte tenu des intervalles de confiance identifiés par les permutations.
Merci de votre aide.
Références: Björnsson, H. et Venegas, SA (1997). "Manuel pour l'analyse de données climatiques effectuée par EOF et SVD", Université McGill, Rapport du CCGCR n ° 97-1, Montréal, Québec, 52 p. http://andvari.vedur.is/%7Efolk/halldor/PICKUP/eof.pdf
GR Nord, TL Bell, RF Cahalan et FJ Moeng. (1982). Erreurs d'échantillonnage dans l'estimation des fonctions orthogonales empiriques. Lun. Wea. Rev., 110: 699–706.
von Storch, H. Zwiers, FW (1999). Analyse statistique dans la recherche climatique. La presse de l'Universite de Cambridge.