2017-03-10 2 views
3

J'ai un grand objet XTS qui est le résultat d'un calcul de corrélation en utilisant une fenêtre glissante sur un objet XTS ZOO de 12 x 12 variables pour 1343 points de données dans le temps.Convertir grand objet XTS en tableau pour calculer Eignevalues ​​et vecteurs propres

Mon grand objet XTS est structuré comme suit, les lignes représentent l'heure et les colonnes représentent les combinaisons de corrélation. Un exemple simplifié est illustré ci-dessous:

AA BA CA AB BB CB AC BC CC 
t1 1 .1 -.4 .1 1 .3 -.4 .3 1 
t2 1 .4 .8 .4 1 .2 .8 .2 1 
t3 1 .5 .5 .5 1 .3 .5 .3 1 
t4 1 .6 .1 .6 1 .7 .1 .7 .1 

-moi si je me trompe, mais je crois que la fonction eigen() en R nécessite une matrice carrée pour calculer les valeurs propres de la matrice lambda 1,2 et 3?

Comment est-ce que je peux placer l'objet xts au carré ci-dessus pour trouver les valeurs propres et les vecteurs avec chaque matrice dans le temps?

Je suppose que je vais avoir une matrice pour chaque période de temps (1-4) dans l'objet XTS ci-dessus et la matrice devrait être construite en prenant les 3 premières valeurs (1 .1 -.4) et en mettant eux dans la première colonne, encore une fois les trois prochaines valeurs (.1 1 .3) et cela va dans la deuxième colonne et enfin les trois dernières valeurs de la première rangée (-.4 .3 1) vont dans la dernière colonne pour compenser la matrice 3 x 3 qui est représenté ci-dessous:

matrice

pour t1

A B C 
A 1 .1 -.4 
B .1 1 .3 
C -.4 .3 1 

Peut-être que la transformation de l'objet XTS ne soit pas nécessaire de calculer les valeurs propres mais si je fais un pas à travers elle dans ma tête ce sont les étapes nécessaires pour calculer les valeurs propres pour mon objet XTS.

Idéalement, les valeurs propres de chaque matrice serait alors stockée dans une trame de données ou d'une matrice, dans le cas ci-dessus, j'aurais dataframe de 12 observations de 3 variables ou une matrice de 3 x 4.

Quelqu'un peut-il dire moi si je vais à ce sujet dans le mauvais sens et si eigen() peut prendre l'objet XTS dans sa forme actuelle et calculer les valeurs propres?

dput

Répondre

2

Pour des fins de démonstration, je ne revenir le plus grand de l'ensemble des valeurs propres, mais vous pouvez modifier le code pour renvoyer tout ce dont vous avez besoin.

library(xts) 
dfx <- structure(c(1, 1, 1, 1, 0.1, 0.4, 0.5, 0.6, -0.4, 0.8, 0.5, 0.1, 
0.1, 0.4, 0.5, 0.6, 1, 1, 1, 1, 0.3, 0.2, 0.3, 0.7, -0.4, 0.8, 
0.5, 0.1, 0.3, 0.2, 0.3, 0.7, 1, 1, 1, 1), .Dim = c(4L, 9L), .Dimnames = list(
    NULL, c("AA", "BA", "CA", "AB", "BB", "CB", "AC", "BC", "CC" 
    )), index = structure(c(1167685200, 1167771600, 1167858000, 
1167944400), tzone = "", tclass = c("POSIXct", "POSIXt")), .indexCLASS = c("POSIXct", 
"POSIXt"), tclass = c("POSIXct", "POSIXt"), .indexTZ = "", tzone = "", class = c("xts", 
"zoo")) 

apply.daily(dfx, function(x) eigen(matrix(x, nrow = sqrt(length(x))))$values[1]) 
#    [,1] 
#2007-01-02 1.455287 
#2007-01-03 1.984869 
#2007-01-04 1.872842 
#2007-01-05 1.972804 
+0

merci beaucoup pour la réponse rapide, beaucoup apprécient. Je vois de l'aide dans R qu'il y a un certain nombre de fonctions d'application pour la période de temps distincte hebdomadaire, quotidienne, mensuelle etc. mais mes données sont réellement des données de 15 min, y at-il une autre fonction qui peut manipuler ce genre de granularité? BTW J'ai changé les valeurs [1] en valeurs [1:12] pour retourner les 12 valeurs propres dont j'avais besoin. – TheGoat

+1

@PigWolf Vous pouvez spécifier des périodes arbitraires en utilisant 'period.apply' à la place. Ou utilisez la base 'apply (dfx, 1, ...)', puis convertissez-la en xts. – tonytonov

+0

Merci beaucoup, je suis un peu coincé sur la section pour le nombre de lignes dans la matrice. Si je l'interprète incorrectement, faites le moi savoir. De gauche à droite, pour chaque valeur quotidienne de dfx, vous appliquez une fonction x qui calcule les valeurs propres d'une matrice avec nrows = 6 puisque la longueur de x ou dfx est 36 (4 * 9). Bien que lorsque je lance votre code sur dfx il n'y a que 4 lignes de données, donc je suis confus au sujet de la configuration de matix. BTW mes données ont 144 colonnes et 1343 lignes de sorte que le sqrt ne fonctionne pas pour moi. J'ai également ajouté un commentaire au message original car c'est difficile à transmettre. – TheGoat