Mam 10 lat dziennych danych zwrotów dla 28 różnych walut. Chcę wyodrębnić pierwszy główny składnik, ale zamiast obsługiwać PCA przez całe 10 lat, chcę zastosować dwuletnie okno, ponieważ zachowania walut ewoluują, więc chcę to odzwierciedlić. Mam jednak poważny problem, to znaczy, że zarówno funkcje princomp (), jak i prcomp () często przeskakują od ładunków dodatnich do ujemnych w sąsiednich analizach PCA (tj. W odstępie 1 dnia). Zobacz tabelę ładowania dla waluty EUR:
Oczywiście nie mogę tego użyć, ponieważ sąsiednie ładunki będą przeskakiwać z dodatnich na ujemne, więc moja seria, która ich używa, będzie błędna. Teraz spójrz na wartość bezwzględną ładowania waluty EUR:
Problem polega oczywiście na tym, że nadal nie mogę tego użyć, ponieważ z górnego wykresu widać, że ładowanie zmienia się czasami z ujemnego na dodatnie i z powrotem, co jest cechą, którą muszę zachować.
Czy jest jakiś sposób na obejście tego problemu? Czy mogę wymusić, aby orientacja wektora własnego była zawsze taka sama w sąsiadujących PCA?
Nawiasem mówiąc, ten problem występuje również w funkcji FactoMineR PCA (). Kod rollapply znajduje się tutaj:
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
iEUR +0.21 ZAR -0.79 USD -0.4
są bardzo bardzo podobne. Po prostu odwróć znak w jednym z dwóch wyników.Odpowiedzi:
Ilekroć fabuła przeskakuje za dużo, odwróć orientację. Jednym skutecznym kryterium jest to: oblicz całkowitą liczbę skoków dla wszystkich komponentów. Oblicz całkowitą liczbę skoków, jeśli następny wektor własny jest zanegowany. Jeśli ten ostatni jest mniejszy, zaneguj następny wektor własny.
Oto implementacja. (Nie jestem zaznajomiony
zoo
, co może pozwolić na bardziej eleganckie rozwiązanie).Na przykład, poprowadźmy losowy spacer w grupie ortogonalnej i drżmy go trochę dla zainteresowania:
Oto krocząca PCA:
Teraz poprawiona wersja:
źródło
@ whuber ma rację, że nie ma orientacji właściwej dla danych, ale nadal możesz wymusić, że twoje wektory własne mają dodatnią korelację z jakimś wektorem odniesienia.
Na przykład, możesz sprawić, by ładunki dla USD były dodatnie na wszystkich swoich wektorach własnych (tj. Jeśli ładowanie USD jest ujemne, odwróć znaki całego wektora). Ogólny kierunek wektora jest nadal dowolny (ponieważ zamiast tego mógłbyś użyć EUR lub ZAR jako odniesienia), ale kilka pierwszych osi twojego PCA prawdopodobnie nie będzie przeskakiwać prawie tak bardzo - szczególnie dlatego, że twoje okna są tak zmienne długo.
źródło
To, co zrobiłem, było obliczenie odległości L1 między kolejnymi wektorami własnymi. Po znormalizowaniu tej macierzy wybieram próg wyniku az, np. 1, tak więc jeśli przy każdym nowym toczeniu zmiana jest powyżej tego progu, przerzucam wektor własny, czynniki i obciążenia, aby uzyskać spójność w oknie toczenia. Osobiście nie lubię wymuszać danych znaków w niektórych korelacjach, ponieważ mogą one być bardzo niestabilne w zależności od makropoleceń.
źródło