Ich habe 10 Jahre tägliche Rückgabedaten für 28 verschiedene Währungen. Ich möchte die erste Hauptkomponente extrahieren, aber anstatt PCA für die gesamten 10 Jahre zu betreiben, möchte ich ein 2-Jahres-Zeitfenster einhalten, da sich das Verhalten der Währungen verändert und ich dies reflektieren möchte. Ich habe jedoch ein großes Problem: Sowohl die Funktionen princomp () als auch prcomp () springen in benachbarten PCA-Analysen häufig von positiven zu negativen Belastungen (dh im Abstand von einem Tag). Schauen Sie sich die Ladetabelle für die EUR-Währung an:
Dies kann ich natürlich nicht verwenden, da benachbarte Ladungen von positiv nach negativ springen und meine Serien, in denen sie verwendet werden, fehlerhaft sind. Schauen Sie sich nun den absoluten Wert der EUR-Währungsbelastung an:
Das Problem ist natürlich, dass ich dies immer noch nicht verwenden kann, da Sie aus der oberen Tabelle ersehen können, dass die Belastung manchmal von negativ nach positiv und zurück geht, eine Eigenschaft, die ich bewahren muss.
Kann ich dieses Problem irgendwie umgehen? Kann ich erzwingen, dass die Eigenvektororientierung in benachbarten PCAs immer gleich ist?
Dieses Problem tritt übrigens auch bei der Funktion FactoMineR PCA () auf. Der Code für die App ist hier:
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
undEUR +0.21 ZAR -0.79 USD -0.4
sind sehr sehr ähnlich. Sie kehren einfach das Vorzeichen in einem der beiden Ergebnisse um.Antworten:
Wenn die Handlung zu stark springt, kehren Sie die Ausrichtung um. Ein wirksames Kriterium ist: Berechnen Sie die Gesamtanzahl der Sprünge für alle Komponenten. Berechnen Sie die Gesamtanzahl der Sprünge, wenn der nächste Eigenvektor negiert wird. Ist letzterer kleiner, negiere den nächsten Eigenvektor.
Hier ist eine Implementierung. (Ich kenne mich nicht aus
zoo
, was eine elegantere Lösung ermöglichen könnte.)Lassen Sie uns als Beispiel einen zufälligen Spaziergang in einer orthogonalen Gruppe machen und ihn aus Interesse ein wenig zittern:
Hier ist der rollende PCA:
Nun die feste Version:
quelle
@whuber ist richtig, dass es keine Orientierung gibt, die den Daten eigen ist, aber Sie könnten immer noch erzwingen, dass Ihre Eigenvektoren eine positive Korrelation mit einem Referenzvektor haben.
Zum Beispiel könnten Sie die Aufladungen für USD auf allen Ihren Eigenvektoren positiv machen (dh, wenn die Aufladung des USD negativ ist, kippen Sie die Vorzeichen des gesamten Vektors). Die Gesamtrichtung Ihres Vektors ist immer noch willkürlich (da Sie stattdessen EUR oder ZAR als Referenz hätten verwenden können), aber die ersten Achsen Ihres PCA werden wahrscheinlich nicht annähernd so weit springen - insbesondere, weil Ihre rollenden Fenster dies sind lange.
quelle
Ich habe den L1-Abstand zwischen aufeinanderfolgenden Eigenvektoren berechnet. Nach der Normalisierung dieser Matrix wähle ich eine Bewertungsschwelle von z, z. B. 1, so dass ich bei einem neuen Wurf die Eigenvektoren, Faktoren und Belastungen umdrehe, um eine Konsistenz im Wurffenster zu erreichen. Persönlich mag ich es nicht, gegebene Zeichen in einigen Korrelationen zu erzwingen, da sie abhängig von den Makrotreibern sehr flüchtig sein können.
quelle