R'deki rollapply PCA'da “jumpy” yüklemeleri alıyorum.


20

28 farklı para birimi için 10 yıllık günlük getiri verilerim var. İlk temel bileşeni çıkarmak istiyorum, ancak PCA'yı 10 yıl boyunca çalıştırmak yerine, 2 yıllık bir pencere açmak istiyorum, çünkü para birimlerinin davranışları gelişiyor ve bu yüzden bunu yansıtmak istiyorum. Ancak büyük bir sorunum var, yani hem princomp () hem de prcomp () fonksiyonları bitişik PCA analizlerinde (yani 1 gün arayla) pozitiften negatif yüklemelere atlayacaktır. EUR para birimi için yükleme grafiğine bakınız:

resim açıklamasını buraya girin

Açıkça kullanamıyorum çünkü bitişik yüklemeler pozitiften negatife atlayacaktır, bu yüzden onları kullanan serilerim hatalı olacaktır. Şimdi EUR para birimi yüklemesinin mutlak değerine bir göz atın:

resim açıklamasını buraya girin

Sorun elbette bunu hala kullanamıyorum çünkü üst grafikten yüklemenin negatiften olumluya ve zaman zaman geri döndüğünü, korumam gereken bir özellik olduğunu görebilirsiniz.

Bu sorunun üstesinden gelmenin bir yolu var mı? Özvektör oryantasyonunu bitişik PCA'larda her zaman aynı olmaya zorlayabilir miyim?

Bu arada, bu sorun FactoMineR PCA () işleviyle de oluşur. Rollapply'nin kodu burada:

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

3
Özvektör "yönelim" ile ne demek istediğinizi açıklar mısınız? Bildiğim kadarıyla , verilere özgü hiçbir şey yoktur . (Farklı yazılımların farklı normalize edilmiş özvektörler üretmesinin bir nedeni budur.) Öyleyse, var olmayan ve anlamsız bir şey istiyormuşsunuz gibi geliyor.
whuber

1
Bir gün böyle yükler alacağım: EUR -0.2 ZAR +0.8 USD +0.41 ..... 28 para birimleri. Ve ertesi gün EUR +0.21 ZAR -0.79 USD -0.4 vb. Alacağım. Böylece PCA'nın verileri döndürmeyi seçtiği eksen 2. günde 1. güne göre tam tersi yönde yönlendirilir. Bu yükleme atlar ve ben bir şekilde önlemek istiyorum ...... Benim terminoloji yanıltıcı ise özür dilerim. PCA kodunun, bir gün yüklemelerde tutarlı olduğu sürece eksen yönünü gerçekten umursamadığını anlıyorum , ancak birkaç gün boyunca tutarlı olması gerekiyor.
Thomas Browne

1
bir günden diğerine, günlük veriler üzerinde yuvarlanan 2 yıllık bir pencere verildiğinde, çok, çok benzer bir PCA'ya sahip olmamız gerektiğini unutmayın.
Thomas Browne

Bence bir problemin olmasının sebebi bu toparlanma fikrinin bir anlam ifade etmemesi. Hedeflerinize ulaşabilecek farklı bir şey aramaktan başka çözümüm yok (ne olduklarından emin değilim) ve mantıklı.
Michael R.Chickick

EUR -0.2 ZAR +0.8 USD +0.41ve EUR +0.21 ZAR -0.79 USD -0.4 vardır çok çok benzer. Sadece iki sonuçtan herhangi birinde oturum açın.
ttnphns

Yanıtlar:


22

Çizim çok fazla atladığında, yönü tersine çevirin. Etkili bir kriter şudur: tüm bileşenler üzerindeki toplam atlama miktarını hesaplayın. Bir sonraki özvektör reddedilirse, toplam atlama miktarını hesaplayın. İkincisi daha azsa, bir sonraki özvektörü kaldırın.

İşte bir uygulama. (Bilmiyorum zoo, bu daha zarif bir çözüme izin verebilir.)

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

Örnek olarak, ortogonal bir grupta rastgele bir yürüyüş yapalım ve biraz ilgi için biraz heyecanlandıralı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,]
}

İşte haddeleme PCA:

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

orijinal

Şimdi sabit sürüm:

plot(amend(result))

Değişik


tbenvben+1ben+1vbenben1-1vben+1. Algoritmanız biraz farklı görünüyor. Aynı şekilde çalışır mı?
amip diyor Reinstate Monica

@amoeba Tam olarak ne yaptığınızı tam olarak bilmememe rağmen, David J. Harris'in cevabında ve sonrasında gelen yorumlarda tartışılan bazı fikirler gibi geliyor. Özellikle stats.stackexchange.com/questions/34396/… adresindeki yorumuma bakın .
whuber

2
@Art, anladığım kadarıyla, bileşen işaretini bazı harici (PCA'dan harici) tercihlere göre düzeltmek istiyorsunuz. Bu iyi, ama ona böyle yaklaşmalısınız. Öncelikle, işaretlerin tutarlı olduğundan emin olarak kayan PCA şeyi yapın. Ve sonra, bazı ek kriterlere dayanarak, tüm bileşeni çevirip çevirmeyeceğinize karar verin. Örneğin, bunu euro trendi ile ilişkilendirebilirsiniz ve korelasyon negatifse bileşeni çevirin. Ya da böyle bir şey. Bu tamamen sizin uygulamanıza ve alan adı bilginize bağlıdır.
amip diyor Reinstate Monica

1
@ Amoeba'nın yorum ve tavsiyelerine katılıyorum.
whuber

1
@amoeba: evet, bu konuda haklısın, ancak, naif olarak, belirli bir zaman serisine bağlı olmayan, "vektörün gerçek yönelimi" gibi bir şey olan genel bir çözüm olabileceğini düşündüm, yine de, yardım için teşekkürler ve önerileri
Anonim

8

@whuber, verilere özgü bir yönelim olmadığı konusunda haklıdır, ancak özvektörlerinizin bazı referans vektörlerle pozitif korelasyona sahip olduklarını hala zorlayabilirsiniz.

Örneğin, USD için yüklemeleri tüm özvektörlerinizde pozitif yapabilirsiniz (yani, USD'nin yüklemesi negatifse, tüm vektörün işaretlerini çevirin). Vektörünüzün genel yönü hala keyfidir (bunun yerine referans olarak EUR veya ZAR kullanmış olabilirsiniz), ancak PCA'nızın ilk birkaç ekseni muhtemelen neredeyse o kadar fazla atlamayacaktır - özellikle de yuvarlanan pencereleriniz uzun.


7
İyi bir fikir. Bunu ilk denedim (muhtemelen bu cevabı gönderirken :-). Sorun, diğer yüklemelerin atlayabilmesidir. Bunu düzeltmek için, işaret seçimini en büyük yüklemeye dayandırın. Hala zar yok: yüklemeler hala atlayabilir. Hile her seferinde bir önceki zamandan yükleme vektöründe en az rahatsızlığı yaratan yönlendirmeyi seçmek içindir .
whuber

4
@whuber İyi iş çıkardın.
David J. Harris

1
Doğru, yükleme işareti önemli değil (yönlendirme). Ele alınmayan bir şey, bunu farklı yazılım paketlerinde gerçekleştirirseniz, paketler arası farklılıklar, bir programın belirli yüklemelerde negatif (pozitif) işaretlere, diğerlerinin de aynı yüklemeler için pozitif (negatif) işaretlere yol açmasıdır. Bu nedenle, yukarıdaki 3 serisi çizimdeki nihai sonuçların işaretleri başka bir paket kullanılırken ters çevrilebilir. Referans vektör yüklemelerinde ayrıca bir işaret değişikliği olabilir - ve bu çözüm yanlış olmaz.
JoleT

@LEP: Tersine çevirme ile aynı problemle karşılaştım, belki de bu sorun için zaten bir çözüm buldunuz - ilk vektörün doğru olduğunu nasıl öğrenirsiniz ve gerisini ona doğru hizalayacağınızdan emin olabilirsiniz - quant.stackexchange.com/questions / 3094 /… ?
İsimsiz

Matris tekil olmadığı ve özdeğerlerin hiçbiri sıfır olmadığı sürece, işaretlerde 180 derecelik bir değişiklik haricinde çoğu garanti sonucu aynı olmalıdır - ki bu garanti edilmez.
JoleT

1

Yaptığım şey, ardışık özvektörler arasındaki L1 mesafesini hesaplamaktı. Bu matrisi normalleştirdikten sonra az puan eşiğini seçiyorum, örneğin 1 Herhangi bir yeni haddelemede değişiklik bu eşiğin üzerindeyse, haddeleme penceresinde tutarlılık sağlamak için özvektörü, faktörleri ve yükleri çeviriyorum. Şahsen bazı korelasyonlarda verilen işaretleri zorlamaktan hoşlanmam çünkü makro sürücülerine bağlı olarak çok değişken olabilirler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.