Tôi đang nhận được các phần mềm tải nhanh chóng trong PCA trong PC. Tôi có thể sửa nó không?


20

Tôi có 10 năm dữ liệu trả về hàng ngày cho 28 loại tiền tệ khác nhau. Tôi muốn trích xuất thành phần chính đầu tiên, nhưng thay vì vận hành PCA trong toàn bộ 10 năm, tôi muốn nhanh chóng mở cửa sổ 2 năm, vì các hành vi của tiền tệ phát triển và vì vậy tôi muốn phản ánh điều này. Tuy nhiên, tôi có một vấn đề lớn, đó là cả hai hàm Princeomp () và prcomp () thường sẽ chuyển từ tải tích cực sang tải âm trong các phân tích PCA liền kề (tức là cách nhau 1 ngày). Hãy nhìn vào biểu đồ nạp tiền tệ EUR:

nhập mô tả hình ảnh ở đây

Rõ ràng tôi không thể sử dụng điều này bởi vì các tải liền kề sẽ chuyển từ dương sang âm, vì vậy chuỗi của tôi sử dụng chúng sẽ bị lỗi. Bây giờ hãy xem giá trị tuyệt đối của việc nạp tiền EUR:

nhập mô tả hình ảnh ở đây

Vấn đề tất nhiên là tôi vẫn không thể sử dụng điều này bởi vì bạn có thể thấy từ biểu đồ hàng đầu rằng việc tải không chuyển từ tiêu cực sang tích cực và đôi khi trở lại, một đặc điểm mà tôi cần phải bảo tồn.

Có cách nào tôi có thể khắc phục vấn đề này không? Tôi có thể buộc định hướng eigenvector luôn giống nhau trong các PCA liền kề không?

Nhân tiện, vấn đề này cũng xảy ra với hàm FactoMineR PCA (). Mã cho rollapply là ở đây:

rollapply(retmat, windowl, function(x) summary(princomp(x))$loadings[, 1], by.column = FALSE, align = "right") -> princomproll

3
Bạn có thể giải thích những gì bạn có nghĩa là "định hướng" eigenvector? Theo như tôi biết, không có thứ gì là nội tại đối với dữ liệu. (Đó là một lý do tại sao các phần mềm khác nhau sẽ tạo ra các trình phát sinh chuẩn hóa khác nhau.) Vì vậy, có vẻ như bạn đang yêu cầu một thứ không tồn tại và là vô nghĩa.
whuber

1
Vâng vào một ngày nào đó tôi sẽ nhận được tải như thế này: EUR -0,2 ZAR +0,8 USD +0,41 ..... 28 loại tiền tệ. Và ngày hôm sau tôi sẽ nhận được EUR +0,21 ZAR -0,79 USD -0,4, v.v. Vì vậy, trục mà PCA đã chọn để xoay dữ liệu được định hướng chính xác theo cách ngược lại vào ngày 2, so với ngày 1. Điều đó gây ra những bước tải này và tôi muốn tránh nó, bằng cách nào đó ...... Xin lỗi nếu thuật ngữ của tôi là sai lệch. Tôi hiểu rằng mã PCA không thực sự quan tâm đến hướng trục miễn là nó nhất quán trong các lần tải trong một ngày , nhưng tôi cần nó nhất quán trong nhiều ngày.
Thomas Browne

1
Hãy nhớ rằng từ ngày này sang ngày khác, với một cửa sổ 2 năm cho dữ liệu hàng ngày, chúng ta nên có PCA rất, rất giống nhau.
Thomas Browne

Tôi nghĩ lý do mà bạn gặp vấn đề là ý tưởng lộn xộn này không có ý nghĩa. Tôi không có giải pháp nào khác ngoài việc tìm kiếm thứ gì đó khác biệt có thể đạt được mục tiêu của bạn (không chắc chúng là gì) và hợp lý.
Michael R. Chernick

EUR -0.2 ZAR +0.8 USD +0.41EUR +0.21 ZAR -0.79 USD -0.4 đang rất rất giống nhau. Bạn chỉ cần đảo ngược dấu hiệu trong bất kỳ hai kết quả.
ttnphns

Câu trả lời:


22

Bất cứ khi nào cốt truyện nhảy quá nhiều, đảo ngược hướng. Một tiêu chí hiệu quả là: tính tổng số lần nhảy trên tất cả các thành phần. Tính tổng số lần nhảy nếu hàm riêng tiếp theo bị phủ định. Nếu cái sau ít hơn, phủ định eigenvector tiếp theo.

Đây là một triển khai. (Tôi không quen thuộc zoo, có thể cho phép một giải pháp thanh lịch hơn.)

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)
}

Ví dụ: chúng ta hãy đi bộ ngẫu nhiên trong một nhóm trực giao và điều chỉnh nó một chút để quan tâm:

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,]
}

Đây là PCA cán:

window <- 31
data <- zoo(x)
result <- rollapply(data, window, 
  function(x) summary(princomp(x))$loadings[, 1], by.column = FALSE, align = "right")
plot(result)

Nguyên

Bây giờ là phiên bản cố định:

plot(amend(result))

Sửa đổi


ttôivtôi+1tôi+1vtôitôi1-1vtôi+1. Thuật toán của bạn có vẻ hơi khác một chút. Nó sẽ làm việc theo cùng một cách?
amip nói rằng Phục hồi Monica

@amoeba Mặc dù tôi không chắc chắn chính xác những gì bạn đang làm, nhưng có vẻ như một số ý tưởng được thảo luận trong câu trả lời của David J. Harris và các ý kiến ​​theo sau nó. Đặc biệt, hãy xem nhận xét của tôi tại stats.stackexchange.com/questions 432394 / .
whuber

2
@Art, vì vậy theo tôi hiểu, bạn muốn sửa dấu hiệu của thành phần dựa trên một số tùy chọn bên ngoài (bên ngoài PCA). Điều này là tốt, nhưng đó là cách bạn nên tiếp cận nó. Đầu tiên làm điều PCA trượt, đảm bảo rằng các dấu hiệu phù hợp. Và sau đó quyết định, dựa trên một số tiêu chí bổ sung, có nên lật toàn bộ thành phần hay không. Ví dụ, bạn có thể tương quan nó với xu hướng đồng euro và nếu tương quan là âm, hãy lật thành phần. Hoặc điều tương tự. Điều này hoàn toàn phụ thuộc vào ứng dụng cụ thể của bạn và kiến ​​thức tên miền của bạn.
amip nói phục hồi Monica

1
Tôi đồng ý với giải thích và khuyến nghị của @ amoeba.
whuber

1
@amoeba: vâng, bạn đúng về điều này, mặc dù, tôi ngây thơ nghĩ rằng có thể có một giải pháp chung không phụ thuộc vào chuỗi thời gian cụ thể, giống như "định hướng thực sự của vectơ" :) dù sao, cảm ơn bạn đã giúp đỡ và đề xuất
Ẩn danh

8

@whuber nói đúng rằng không có định hướng nào là nội tại đối với dữ liệu, nhưng bạn vẫn có thể thực thi rằng các hàm riêng của bạn có mối tương quan dương với một số vectơ tham chiếu.

Chẳng hạn, bạn có thể làm cho các tải cho USD dương trên tất cả các hàm riêng của bạn (nghĩa là, nếu tải của USD là âm, hãy lật các dấu hiệu của toàn bộ vectơ). Hướng chung của vectơ của bạn vẫn là tùy ý (vì bạn có thể đã sử dụng EUR hoặc ZAR làm tài liệu tham khảo thay thế), nhưng một vài trục đầu tiên của PCA của bạn có thể sẽ không nhảy xung quanh nhiều - đặc biệt là vì các cửa sổ cuộn của bạn quá Dài.


7
Ý tưởng tốt. Tôi đã thử điều này đầu tiên (có lẽ trong khi bạn đang đăng câu trả lời này :-). Vấn đề là các tải trọng khác có thể nhảy xung quanh. Để khắc phục điều này, hãy lựa chọn dấu hiệu trên tải lớn nhất. Vẫn không có xúc xắc: các tải vẫn có thể nhảy. Bí quyết là mỗi lần chọn hướng tạo ra ít nhiễu nhất trong vectơ tải từ lần trước.
whuber

4
@whuber Làm tốt lắm.
David J. Harris

1
Đúng, dấu hiệu của tải không quan trọng (định hướng). Một điều không được giải quyết là nếu bạn thực hiện điều này trên các gói phần mềm khác nhau, sự khác biệt giữa các gói là một chương trình có thể dẫn đến các dấu hiệu âm (dương) trên các tải cụ thể trong khi một kết quả khác có dấu dương (âm) cho cùng tải. Do đó, các dấu hiệu của kết quả cuối cùng trong âm mưu 3 loạt ở trên có thể được đảo ngược khi sử dụng gói khác. Các tải vectơ tham chiếu cũng có thể có thay đổi dấu - và giải pháp này sẽ không chính xác.
JoleT

@LEP: Tôi gặp phải vấn đề tương tự với nghịch đảo, có thể bạn đã tìm ra giải pháp cho vấn đề này - làm thế nào để tìm ra vectơ đầu tiên là chính xác và đảm bảo rằng phần còn lại sẽ được căn chỉnh theo đúng cách - quant.stackexchange.com/questions / 3094 / Lát ?
Ẩn danh

Miễn là ma trận không phải là số ít và không có giá trị riêng nào bằng 0, hầu hết các kết quả thuật toán đều giống nhau, ngoại trừ thay đổi 180 độ trong các dấu hiệu - không được đảm bảo.
JoleT

1

Những gì tôi đã làm là tính khoảng cách L1 giữa các hàm riêng liên tiếp. Sau khi bình thường hóa ma trận này, tôi chọn ngưỡng điểm az, ví dụ 1, để nếu trong bất kỳ lần lăn mới nào, sự thay đổi vượt quá ngưỡng này, tôi lật eigenvector, các yếu tố và tải trọng để có sự thống nhất trong cửa sổ cuộn. Cá nhân tôi không muốn buộc các dấu hiệu đã cho trong một số tương quan vì chúng có thể rất dễ bay hơi tùy thuộc vào các trình điều khiển vĩ mô.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.