2010-11-09 53 views
4

Je veux classer un ensemble de variables tous les jours (en commençant par une série zoo).R: Classement roulant des séries chronologiques multivariées?

Voici un exemple:

set.seed(1) 
x <- zoo(matrix(rnorm(9), nrow=3), as.Date("2010-01-01") + 0:2) 
colnames(x) <- letters[1:3] 

La seule façon que je sais faire est avec rollapply, mais cela est assez lent.

> rollapply(x, 1, rank, by.column=FALSE) 
      a b c 
2010-01-01 1 3 2 
2010-01-02 1 2 3 
2010-01-03 1 2 3 

D'autres suggestions?

Répondre

2

Tout d'abord, merci d'envoyer un exemple complet et reproductible.

Deuxièmement, j'aime votre solution. Vous pourriez avoir du mal à le rendre beaucoup plus rapide tout en le gardant simple. Une solution consiste à travailler JST sur la matrice sous-jacente (plutôt que l'objet zoo):

> X <- coredata(x) 
> t(apply(X, 1, rank)) 
    a b c 
[1,] 1 3 2 
[2,] 1 2 3 
[3,] 1 2 3 
> 

et puis re-fixer l'indice de temps. Cela peut être plus rapide, mais pas nécessairement plus défensif ou plus facilement lisible.

+0

Merci @Dirk! Bonne suggestion. Je suppose que mon exemple reproductible a des limites en ce sens qu'il ne peut pas reproduire le facteur de vitesse sur un grand ensemble de données. Mais je suppose que cela peut être inféré ... – griffin

+0

Oui, et c'est la deuxième étape - créer des données et un profil plus volumineux. S'il y a des fruits mûrs, choisissez-les. Sinon, il y a toujours du C/C++ si vous avez vraiment besoin de la vitesse. –

+0

Avez-vous des suggestions pour les classes de séries temporelles C++? – griffin

2

Je pense que vous allez dans ce sens. Utiliser order au lieu de rank est un peu plus rapide, mais je ne vois pas comment c'est "assez lent". Peut-être pourriez-vous élaborer un peu sur votre problème actuel?

> system.time(for(i in 1:1000) rollapply(z, 1, order, by.column=FALSE)) 
    user system elapsed 
     1  0  1 
> system.time(for(i in 1:1000) rollapply(z, 1, rank, by.column=FALSE)) 
    user system elapsed 
    1.34 0.00 1.34 
+0

Merci @Joshua! Oui, le problème est que je travaille avec de très longues et longues séries chronologiques. Cela ne veut pas dire que cette approche est lente par rapport à quoi que ce soit; juste que je passe du temps à compter les moutons pendant qu'il court et espérait une approche plus "vectorisée". – griffin