28 개의 다른 통화에 대한 10 년 간의 일일 반품 데이터가 있습니다. 첫 번째 주요 구성 요소를 추출하고 싶지만 10 년 전체에 PCA를 운영하는 대신 통화의 동작이 발전하고이를 반영하기 위해 2 년 창을 적용하고 싶습니다. 그러나 중요한 문제가 있습니다. 즉, princomp () 및 prcomp () 함수는 종종 인접한 PCA 분석에서 양수에서 음수로 점프합니다 (즉, 1 일 간격). EUR 통화의 로딩 차트를 살펴보십시오.
인접한 하중이 양에서 음으로 점프하기 때문에 이것을 사용할 수 없으므로 분명히 이것을 사용할 수 있습니다. 이제 EUR 통화 로딩의 절대 값을 살펴보십시오.
문제는 상단 차트에서 로딩이 음수에서 양수로 바뀌고 때로는 되돌아가는 것을 볼 수 있기 때문에 여전히 이것을 사용할 수 없다는 것입니다.
이 문제를 해결할 수있는 방법이 있습니까? 인접한 PCA에서 고유 벡터 방향을 항상 동일하게 유지할 수 있습니까?
그런데이 문제는 FactoMineR PCA () 함수에서도 발생합니다. rollapply의 코드는 다음과 같습니다.
rollapply(retmat, windowl, function(x) summary(princomp(x))$loadings[, 1], by.column = FALSE, align = "right") -> princomproll
답변
플롯이 너무 많이 점프 할 때마다 방향을 반대로 바꿉니다. 효과적인 기준 중 하나는 모든 구성 요소의 총 점프 량을 계산하는 것입니다. 다음 고유 벡터가 부정되면 총 점프 량을 계산합니다. 후자가 적 으면 다음 고유 벡터를 무효화하십시오.
구현은 다음과 같습니다. (나는 익숙하지 않다zoo
더 우아한 솔루션을 허용 할 수있는 .)
require(zoo)
amend <- function(result) {
result.m <- as.matrix(result)
n <- dim(result.m)[1]
delta <- apply(abs(result.m[-1,] - result.m[-n,]), 1, sum)
delta.1 <- apply(abs(result.m[-1,] + result.m[-n,]), 1, sum)
signs <- c(1, cumprod(rep(-1, n-1) ^ (delta.1 <= delta)))
zoo(result * signs)
}
예를 들어, 직교 그룹에서 임의의 보행을 실행하고 관심을 끌기 위해 약간의 지터를 만들어 봅시다.
random.rotation <- function(eps) {
theta <- rnorm(3, sd=eps)
matrix(c(1, theta[1:2], -theta[1], 1, theta[3], -theta[2:3], 1), 3)
}
set.seed(17)
n.times <- 1000
x <- matrix(1., nrow=n.times, ncol=3)
for (i in 2:n.times) {
x[i,] <- random.rotation(.05) %*% x[i-1,]
}
롤링 PCA는 다음과 같습니다.
window <- 31
data <- zoo(x)
result <- rollapply(data, window,
function(x) summary(princomp(x))$loadings[, 1], by.column = FALSE, align = "right")
plot(result)
이제 고정 버전 :
plot(amend(result))
답변
@whuber는 데이터에 본질적인 방향이 없다는 것이 맞지만 고유 벡터가 일부 참조 벡터와 양의 상관 관계를 유지하도록 강제 할 수 있습니다.
예를 들어, 모든 고유 벡터에 대해 USD의 양수를 양수로 만들 수 있습니다 (예 : USD의 양수가 음수이면 전체 벡터의 부호를 뒤집습니다). 벡터의 전반적인 방향은 여전히 임의적이지만 (대신 EUR 또는 ZAR을 참조로 사용할 수 있기 때문에) PCA의 처음 몇 축은 거의 많이 움직이지 않을 것입니다. 특히 롤링 창이 너무 길기 때문에 긴.
답변
내가 한 것은 연속 고유 벡터 사이의 L1 거리를 계산하는 것이 었습니다. 이 행렬을 정규화 한 후 az score threshold (예 : 1)를 선택하여 새로운 롤링에서 변경이이 임계 값보다 높으면 롤링 창에서 일관성을 유지하기 위해 고유 벡터, 요소 및 하중을 뒤집습니다. 개인적으로 나는 매크로 드라이버에 따라 변동성이 매우 높기 때문에 어떤 상관 관계에서 주어진 부호를 강요하지 않습니다.