J'ai 10 ans de données de retours quotidiens pour 28 devises différentes. Je souhaite extraire le premier composant principal, mais plutôt que d'exploiter PCA sur l'ensemble des 10 ans, je souhaite recaler une fenêtre de 2 ans, car les comportements des devises évoluent et je souhaite donc en tenir compte. Cependant, j'ai un problème majeur, c'est que les fonctions princomp () et prcomp () passeront souvent de charges positives à négatives dans les analyses PCA adjacentes (c'est-à-dire à 1 jour d'intervalle). Jetez un œil au tableau de chargement de la devise EUR:
De toute évidence, je ne peux pas l'utiliser car les chargements adjacents passeront du positif au négatif, donc ma série qui les utilise sera erronée. Jetez maintenant un œil à la valeur absolue du chargement de la devise EUR:
Le problème est bien sûr que je ne peux toujours pas l'utiliser car vous pouvez voir sur le graphique du haut que le chargement passe du négatif au positif et vice versa, une caractéristique que je dois préserver.
Existe-t-il un moyen de contourner ce problème? Puis-je forcer l'orientation du vecteur propre à être toujours la même dans les PCA adjacentes?
Par ailleurs, ce problème se produit également avec la fonction FactoMineR PCA (). Le code pour le rollapply est ici:
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
etEUR +0.21 ZAR -0.79 USD -0.4
sont très très similaires. Vous inversez simplement le signe dans l'un des deux résultats.Réponses:
Chaque fois que l'intrigue saute trop, inversez l'orientation. Un critère efficace est le suivant: calculer le nombre total de sauts sur tous les composants. Calculez le nombre total de sauts si le vecteur propre suivant est annulé. Si ce dernier est inférieur, annulez le vecteur propre suivant.
Voici une implémentation. (Je ne connais pas
zoo
, ce qui pourrait permettre une solution plus élégante.)Par exemple, exécutons une marche aléatoire dans un groupe orthogonal et agitons-le un peu par intérêt:
Voici le PCA roulant:
Maintenant, la version fixe:
la source
@whuber a raison de dire qu'il n'y a pas d'orientation intrinsèque aux données, mais vous pouvez toujours faire en sorte que vos vecteurs propres aient une corrélation positive avec un vecteur de référence.
Par exemple, vous pouvez rendre les chargements pour l'USD positifs sur tous vos vecteurs propres (c.-à-d., Si le chargement de l'USD est négatif, inversez les signes du vecteur entier). La direction générale de votre vecteur est toujours arbitraire (puisque vous auriez pu utiliser EUR ou ZAR comme référence à la place), mais les premiers axes de votre PCA ne sauteront probablement pas autant - en particulier parce que vos fenêtres roulantes sont si longue.
la source
Ce que j'ai fait était de calculer la distance L1 entre les vecteurs propres successifs. Après normalisation de cette matrice, je choisis un seuil de score az, par exemple 1, de sorte que si dans tout nouveau roulement le changement est supérieur à ce seuil, je retourne le vecteur propre, les facteurs et les charges afin d'avoir une cohérence dans la fenêtre de roulement. Personnellement, je n'aime pas forcer les signes donnés dans certaines corrélations car ils peuvent être très volatils en fonction des macro-moteurs.
la source