Tôi quan tâm đến việc xác định số lượng mẫu quan trọng được đưa ra từ Phân tích thành phần chính (PCA) hoặc Phân tích chức năng trực giao thực nghiệm (EOF). Tôi đặc biệt quan tâm đến việc áp dụng phương pháp này vào dữ liệu khí hậu. Trường dữ liệu là ma trận MxN với M là thứ nguyên thời gian (ví dụ: ngày) và N là thứ nguyên không gian (ví dụ: vị trí lon / lat). Tôi đã đọc một phương pháp bootstrap có thể để xác định các PC quan trọng, nhưng không thể tìm thấy một mô tả chi tiết hơn. Cho đến bây giờ, tôi vẫn đang áp dụng Quy tắc ngón tay cái của North (North et al ., 1982) để xác định điểm cắt này, nhưng tôi tự hỏi liệu có phương pháp nào mạnh mẽ hơn không.
Ví dụ:
###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="")
Và, đây là phương pháp mà tôi đã và đang sử dụng để xác định tầm quan trọng của PC. Về cơ bản, nguyên tắc chung là sự khác biệt giữa Lambdas lân cận phải lớn hơn lỗi liên quan của chúng.
###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)
Tôi đã tìm thấy phần chương của Bjornsson và Venegas ( 1997 ) về các bài kiểm tra quan trọng là hữu ích - chúng đề cập đến ba loại bài kiểm tra, trong đó phương sai chiếm ưu thế có lẽ là điều tôi hy vọng sẽ sử dụng. Việc đề cập đến một kiểu tiếp cận Monte Carlo về xáo trộn kích thước thời gian và tính toán lại Lambdas qua nhiều hoán vị. von Storch và Zweiers (1999) cũng đề cập đến một thử nghiệm so sánh phổ Lambda với phổ "nhiễu" tham chiếu. Trong cả hai trường hợp, tôi hơi không chắc chắn về cách thức này có thể được thực hiện và cũng như cách kiểm tra ý nghĩa được thực hiện với các khoảng tin cậy được xác định bởi các hoán vị.
Cảm ơn bạn đã giúp đỡ.
Tài liệu tham khảo: Bjornsson, H. và Venegas, SA (1997). "Hướng dẫn phân tích dữ liệu khí hậu EOF và SVD", Đại học McGill, Báo cáo CCGCR số 97-1, Montréal, Québec, 52pp. http://andvari.vedur.is/%7Efolk/halldor/PICKUP/eof.pdf
GR North, TL Bell, RF Cahalan và FJ Moeng. (1982). Lỗi lấy mẫu trong ước lượng các hàm trực giao theo kinh nghiệm. Thứ Hai Dệt. Rev., 110: 699 Từ706.
von Storch, H, Zwiers, FW (1999). Phân tích thống kê trong nghiên cứu khí hậu. Nhà xuất bản Đại học Cambridge.