Saya memiliki data pengembalian harian 10 tahun untuk 28 mata uang yang berbeda. Saya ingin mengekstraksi komponen utama pertama, tetapi alih-alih mengoperasikan PCA selama 10 tahun penuh, saya ingin membuka jendela 2 tahun, karena perilaku mata uang berkembang dan saya ingin merefleksikan ini. Namun saya memiliki masalah besar, yaitu bahwa kedua fungsi princomp () dan prcomp () akan sering melompat dari muatan positif ke negatif dalam analisis PCA yang berdekatan (yaitu terpisah 1 hari). Lihatlah grafik pemuatan untuk mata uang EUR:
Jelas saya tidak bisa menggunakan ini karena pemuatan yang berdekatan akan melompat dari positif ke negatif, jadi seri saya yang menggunakannya akan salah. Sekarang lihat nilai absolut dari pemuatan mata uang EUR:
Masalahnya tentu saja saya masih tidak dapat menggunakan ini karena Anda dapat melihat dari grafik atas bahwa pemuatan tidak berubah dari negatif ke positif dan kembali pada waktu, suatu karakteristik yang saya perlu pertahankan.
Apakah ada cara saya bisa mengatasi masalah ini? Bisakah saya memaksakan orientasi vektor eigen untuk selalu sama di PCA yang berdekatan?
By the way masalah ini juga terjadi dengan fungsi FactoMineR PCA (). Kode untuk rollapply ada di sini:
rollapply(retmat, windowl, function(x) summary(princomp(x))$loadings[, 1], by.column = FALSE, align = "right") -> princomproll
EUR -0.2 ZAR +0.8 USD +0.41
danEUR +0.21 ZAR -0.79 USD -0.4
yang sangat sangat mirip. Anda cukup membalikkan masuk salah satu dari dua hasil.Jawaban:
Setiap kali plot melompat terlalu banyak, balikkan orientasinya. Salah satu kriteria yang efektif adalah ini: hitung jumlah total lompatan pada semua komponen. Hitung jumlah total lompatan jika vektor eigen berikutnya dinegasikan. Jika yang terakhir kurang, meniadakan vektor eigen berikutnya.
Inilah implementasi. (Saya tidak terbiasa dengan
zoo
, yang mungkin memungkinkan solusi yang lebih elegan.)Sebagai contoh, mari kita jalankan jalan acak dalam kelompok ortogonal dan sedikit gugup untuk kepentingan:
Inilah PCA bergulir:
Sekarang versi tetap:
sumber
@whuber benar bahwa tidak ada orientasi yang intrinsik dengan data, tetapi Anda masih bisa memastikan bahwa vektor eigen Anda memiliki korelasi positif dengan beberapa vektor referensi.
Misalnya, Anda dapat membuat pemuatan untuk USD positif pada semua vektor eigen Anda (yaitu, jika pemuatan USD negatif, balikkan tanda-tanda seluruh vektor). Arah keseluruhan vektor Anda masih sewenang-wenang (karena Anda bisa menggunakan EUR atau ZAR sebagai referensi Anda sebagai gantinya), tetapi beberapa sumbu pertama PCA Anda mungkin tidak akan melonjak hampir sebanyak - terutama karena jendela bergulir Anda sangat panjang.
sumber
Apa yang saya lakukan adalah menghitung jarak L1 antara vektor eigen berturut-turut. Setelah menormalkan matriks ini, saya memilih ambang skor az misalnya 1, sehingga jika dalam setiap pengguliran baru perubahannya di atas ambang ini, saya membalik vektor eigen, faktor, dan pemuatan agar memiliki konsistensi di jendela penguliran. Secara pribadi saya tidak suka memaksa tanda-tanda yang diberikan dalam beberapa korelasi karena mereka bisa sangat tidak stabil tergantung dari driver makro.
sumber