부트 스트랩 또는 몬테카를로 방식을 사용하여 중요한 주요 구성 요소를 결정하는 방법은 무엇입니까?


40

PCA (Principal Component Analysis) 또는 EOF (Empirical Orthogonal Function) 분석에서 나오는 중요한 패턴의 수를 결정하고 싶습니다. 특히이 방법을 기후 데이터에 적용하는 데 관심이 있습니다. 데이터 필드는 M이 시간 차원 (예 : 일)이고 N이 공간 차원 (예 : lon / lat 위치) 인 MxN 행렬입니다. 중요한 PC를 결정하기 위해 가능한 부트 스트랩 방법을 읽었지만 더 자세한 설명을 찾지 못했습니다. 지금까지, 나는 이 차단 점을 결정하기 위해 North 's Thumb of Thumb (North et al ., 1982)을 적용 해 왔지만 더 강력한 방법이 있는지 궁금했습니다.

예로서:

###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="")

여기에 이미지 설명을 입력하십시오

그리고 여기 제가 PC의 중요성을 판단하기 위해 사용한 방법이 있습니다. 기본적으로 경험상 규칙은 인접한 Lambdas 간의 차이가 관련 오류보다 커야한다는 것입니다.

###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과 Venegas ( 1997 )의 유의성 테스트에 관한 장 섹션이 도움이되었다는 것을 발견했습니다. 세 가지 범주의 테스트를 참조하며, 그 중 지배적 분산 유형은 아마도 제가 사용하기를 희망하는 것입니다. 이는 시간 차원을 뒤섞 고 많은 순열을 통해 Lambdas를 다시 계산하는 Monte Carlo 방식의 유형을 나타냅니다. von Storch와 Zweiers (1999)는 Lambda 스펙트럼을 기준 "잡음"스펙트럼과 비교하는 테스트를 참조합니다. 두 경우 모두, 이것이 어떻게 수행되는지, 그리고 순열로 식별되는 신뢰 구간을 고려하여 유의성 검정이 수행되는 방법에 대해 확신이 없습니다.

당신의 도움을 주셔서 감사합니다.

참고 문헌 : Björnsson, H. and Venegas, SA (1997). "기후 데이터의 EOF 및 SVD 분석을위한 매뉴얼", McGill University, CCGCR 보고서 번호 97-1, Québec, Montréal, 52pp. http://andvari.vedur.is/%7Efolk/halldor/PICKUP/eof.pdf

GR North, TL Bell, RF Cahalan 및 FJ Moeng. (1982). 경험적 직교 함수의 추정에서 샘플링 오류. 월 Wea. 개정판 110 : 699–706.

폰 스토치, H, Zwiers, FW (1999). 기후 연구의 통계 분석. 케임브리지 대학 출판부.


부트 스트랩 접근법에 대한 당신의 참조는 무엇입니까?
Michael Chernick

4
부트 스트랩은 여기서 작동하지 않습니다. 거의 모든 관측치가 다른 관측치와 거의 상관 관계가있는 데이터 세트에서는 작동하지 않습니다. 정당한 데이터 복제를 생성하기 위해서는 독립성 또는 최소한 대략적인 독립성 (예 : 시계열 혼합 조건)이 필요합니다. 물론 이러한 문제를 피할 수있는 와일드 부트 스트랩과 같은 특수 부트 스트랩 체계가 있습니다. 그러나 나는 이것에별로 걸지 않을 것입니다. 그리고 다변량 통계 서적을보고 따라야합니다. 그래서 또 다른 방어 할 수없는 하키 스틱을 답으로 얻지 않아야합니다.
StasK

2
상자에 @Marc는 시계열에 사용되는 다양한 블록 부트 스트랩, MBB (이동 블록 부트 스트랩) CBB (원형 블록 부트 스트랩) 또는 SBB (정지 블록 부트 스트랩)를 사용하여 모델을 추정합니다. 매개 변수.
Michael Chernick

3
@StasK 시계열에 부트 스트랩을 적용하기 위해 혼합 조건이 필요한 이유를 모르겠습니다. 모델 기반 방법은 시계열 구조를 맞추기 만하면 잔차를 부트 스트랩 할 수 있습니다. 따라서 트렌드 및 계절별 구성 요소가 포함 된 시계열을 보유하고 모델 기반 부트 스트랩을 계속 수행 할 수 있습니다.
Michael Chernick

2
전체 내용을 볼 수는 없지만 "하미드 바바 모 라디 (Hamid Babamoradi), 프란스 반 덴 버그 (Frans van den Berg), Åsmund Rinnan, 주성분 분석의 부트 스트랩 기반 신뢰 한계-사례 연구, 화학 및 지능 실험실 시스템, 볼륨" 2013 년 1 월 15 일, 페이지 97-105, ISSN 0169-7439, 10.1016 / j.chemolab.2012.10.007. ( sciencedirect.com/science/article/pii/S0169743912002171 ) 키워드 : 부트 스트랩; PCA; 신뢰 제한; BC < sub> a </ sub>; 불확실성 "
tomasz74

답변:


19

나는 이것이 내 질문이지만 대화를 조금 진행하려고 노력할 것입니다. 이 질문을 한 지 6 개월이 지났지 만 불행히도 완전한 답변을 얻지 못했습니다. 지금까지 수집 한 내용을 요약하고 누군가가 남은 문제에 대해 자세히 알아볼 수 있는지 확인합니다. 긴 답변을 용서하십시오.하지만 다른 방법은 없습니다 ...

먼저, 더 나은 합성 데이터 세트를 사용하는 몇 가지 접근 방식을 보여 드리겠습니다. 갭피 데이터에 EOF를 수행하기위한 알고리즘의 사용을 설명하는 Beckers and Rixon ( 2003 ) 의 논문에서 나온 것이다 . 누군가 관심이 있다면 R의 알고리즘을 재현했습니다 ( link ).

합성 데이터 세트 :

#color palette
pal <- colorRampPalette(c("blue", "cyan", "yellow", "red"))

#Generate data
m=50
n=100
frac.gaps <- 0.5 # the fraction of data with NaNs
N.S.ratio <- 0.25 # the Noise to Signal ratio for adding noise to data

x <- (seq(m)*2*pi)/m
t <- (seq(n)*2*pi)/n


#True field
Xt <- 
 outer(sin(x), sin(t)) + 
 outer(sin(2.1*x), sin(2.1*t)) + 
 outer(sin(3.1*x), sin(3.1*t)) +
 outer(tanh(x), cos(t)) + 
 outer(tanh(2*x), cos(2.1*t)) + 
 outer(tanh(4*x), cos(0.1*t)) + 
 outer(tanh(2.4*x), cos(1.1*t)) + 
 tanh(outer(x, t, FUN="+")) + 
 tanh(outer(x, 2*t, FUN="+"))

Xt <- t(Xt)
image(Xt, col=pal(100))

#Noise field
set.seed(1)
RAND <- matrix(runif(length(Xt), min=-1, max=1), nrow=nrow(Xt), ncol=ncol(Xt))
R <- RAND * N.S.ratio * Xt

#True field + Noise field
Xp <- Xt + R
image(Xp, col=pal(100))

여기에 이미지 설명을 입력하십시오

따라서 실제 데이터 필드 Xt는 9 개의 신호로 구성되며 관찰 된 필드를 만들기 위해 노이즈를 추가했습니다.이 필드 Xp는 아래 예에서 사용됩니다. EOF는 다음과 같이 결정됩니다.

EOF

#make covariance matrix
C <- t(Xp) %*% Xp #cov(Xp)
image(C)

#Eigen decomposition
E <- svd(C)

#EOFs (U) and associated Lambda (L) 
U <- E$u
L <- E$d

#projection of data onto EOFs (U) to derive principle components (A)
A <- Xp %*% U

원래 예에서 사용한 예에 따라 North의 경험 법칙을 통해 "유의 한"EOF를 결정합니다.

북쪽의 규칙

Lambda_err <- sqrt(2/dim(Xp)[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
n_sig

plot(L[1:20],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)

여기에 이미지 설명을 입력하십시오

2 : 4의 람다 값은 진폭이 서로 매우 근접하기 때문에 경험적으로 볼 때 그것들은 중요하지 않은 것으로 간주됩니다. 9 개의 신호가 실제로 현장에 존재한다는 것을 알고 있다면 불행한 일입니다.

보다 주관적인 접근법은 로그 변환 된 Lambda 값 ( "Scree plot")을보고 후행 값에 회귀를 맞추는 것입니다. 그러면 람다 값이이 선 위에있는 레벨을 시각적으로 확인할 수 있습니다.

스크린 플롯

ntrail <- 35
tail(L, ntrail)
fit <- lm(log(tail(L, ntrail)) ~ seq(length(L)-ntrail+1, length(L)))
plot(log(L))
abline(fit, col=2)

여기에 이미지 설명을 입력하십시오

따라서 5 개의 주요 EOF가이 선 위에 있습니다. Xp추가 노이즈가 추가되지 않았을 때이 예제를 시도 했으며 결과에 9 개의 원래 신호가 모두 표시됩니다. 따라서 EOF 6 : 9의 중요성은 진폭이 필드의 노이즈보다 낮기 때문입니다.

보다 객관적인 방법은 Overland and Preisendorfer (1982)의 "Rule N"기준입니다. wq패키지 내에 구현이 있으며 아래에 나와 있습니다.

규칙 N

library(wq)
eofNum(Xp, distr = "normal", reps = 99)

RN <- ruleN(nrow(Xp), ncol(Xp), type = "normal", reps = 99)
RN
eigs <- svd(cov(Xp))$d
plot(eigs, log="y")
lines(RN, col=2, lty=2)

여기에 이미지 설명을 입력하십시오

규칙 N은 4 개의 중요한 EOF를 식별했습니다. 개인적으로이 방법을 더 잘 이해해야합니다. 왜 같은 분포를 사용하지 않는 임의의 필드를 기반으로 오류 수준을 측정 할 수 Xp있습니까? 이 방법의 한 가지 변형 Xp은 각 열이 무작위로 재구성되도록 데이터를 다시 샘플링하는 것 입니다. 이러한 방식으로 랜덤 필드의 총 분산이와 동일하다는 것을 보장합니다 Xp. 여러 번 리샘플링하여 분해의 기준 오차를 계산할 수 있습니다.

랜덤 필드를 가진 몬테 카를로 (즉, 널 모델 비교)

iter <- 499
LAMBDA <- matrix(NaN, ncol=iter, nrow=dim(Xp)[2])

set.seed(1)
for(i in seq(iter)){
    #i=1

    #random reorganize dimensions of scaled field
    Xp.tmp <- NaN*Xp
    for(j in seq(dim(Xp.tmp)[2])){
        #j=1
        Xp.tmp[,j] <- Xp[,j][sample(nrow(Xp))]
    }

    #make covariance matrix
    C.tmp <- t(Xp.tmp) %*% Xp.tmp #cov(Xp.tmp)

    #SVD decomposition
    E.tmp <- svd(C.tmp)

    #record Lambda (L) 
    LAMBDA[,i] <- E.tmp$d

    print(paste(round(i/iter*100), "%", " completed", sep=""))
}

boxplot(t(LAMBDA), log="y", col=8, border=2, outpch="")
points(L)

여기에 이미지 설명을 입력하십시오

다시, 4 개의 EOF가 랜덤 필드의 분포보다 높습니다. 이 접근법과 규칙 N에 대한 나의 걱정은 이것들이 실제로 Lambda 값의 신뢰 구간을 다루지 않는다는 것입니다. 예를 들어 첫 번째 Lambda 값이 높을수록 후행 값으로 설명되는 분산의 양이 자동으로 줄어 듭니다. 따라서 임의의 필드에서 계산 된 Lambda는 경사가 항상 가파르고 중요한 EOF를 너무 적게 선택할 수 있습니다. [참고 :이 eofNum()함수는 EOF가 상관 행렬에서 계산 된 것으로 가정합니다. 예를 들어 공분산 행렬 (중심이지만 스케일링되지 않은 데이터)을 사용하는 경우이 숫자가 다를 수 있습니다.]

마지막으로 @ tomasz74는 Babamoradi et al. (2013), 나는 간략하게 살펴 보았다. 매우 흥미롭지 만 Lambda보다는 CI의 EOF 로딩 및 계수 계산에 더 중점을 둔 것으로 보입니다. 그럼에도 불구하고, 나는 동일한 방법론을 사용하여 Lambda 오류를 평가하기 위해 채택 될 수 있다고 생각합니다. 부트 스트랩 리샘플링은 새 필드가 생성 될 때까지 행을 리샘플링하여 데이터 필드에서 수행됩니다. 동일한 행을 두 번 이상 리샘플링 할 수 있습니다. 이는 비모수 적 접근 방식이며 데이터 분포에 대해 가정 할 필요가 없습니다.

Lambda 값의 부트 스트랩

B <- 40 * nrow(Xp)
LAMBDA <- matrix(NaN, nrow=length(L), ncol=B)
for(b in seq(B)){
    samp.b <- NaN*seq(nrow(Xp))
    for(i in seq(nrow(Xp))){
        samp.b[i] <- sample(nrow(Xp), 1)
    }
    Xp.b  <- Xp[samp.b,]
    C.b  <- t(Xp.b) %*% Xp.b 
    E.b  <- svd(C.b)
    LAMBDA[,b] <- E.b$d
    print(paste(round(b/B*100), "%", " completed", sep=""))
}
boxplot(t(LAMBDA), log="y", col=8, outpch="", ylab="Lambda [log-scale]")
points(L, col=4)
legend("topright", legend=c("Original"), pch=1, col=4)

여기에 이미지 설명을 입력하십시오

이것은 Lambda 값의 오류를 계산하는 데있어 North의 경험 법칙보다 더 강력 할 수 있지만 EOF 중요성에 대한 문제는 이것이 의미하는 바에 대해 다른 의견으로 귀결된다고 생각합니다. 북한의 경험 법과 부트 스트랩 방법의 경우, 중요성이 Lambda 값 사이에 겹치는 지 여부에 따라 더 중요한 것으로 보입니다. 있다면, 이들 EOF는 그들의 신호에서 혼합 될 수 있고 "진정한"패턴을 나타내지 않을 수있다. 반면에,이 두 개의 EOF는 (예를 들어 규칙 N과 같은 랜덤 필드의 분해와 비교하여) 상당한 양의 분산을 설명 할 수 있습니다. 따라서 노이즈를 필터링하는 데 관심이있는 경우 (즉, EOF 잘림을 통해) 규칙 N이면 충분합니다. 데이터 세트에서 실제 패턴을 결정하는 데 관심이있는 경우 더 엄격한 Lambda 오버랩 기준이 더 강력 할 수 있습니다.

다시 한 번, 나는이 문제에 대해 전문가가 아니므로 더 많은 경험을 가진 사람이이 설명에 추가 할 수 있기를 희망합니다.

참고 문헌 :

Beckers, Jean-Marie 및 M. Rixen. "불완전한 해양 데이터 세트에서 EOF 계산 및 데이터 채우기." 대기 및 해양 기술 저널 20.12 (2003) : 1839-1856.

Overland, J. 및 R. Preisendorfer, 사이클론 기후학에 적용되는 주요 성분에 대한 유의성 시험, Mon. Wea. 개정판, 110, 1-4, 1982.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.