2014-05-14 5 views
3

Je travaille avec R sur des projets de séries chronologiques. Je suis un débutant et j'ai besoin de votre aide. Maintenant, j'ai des données mensuelles comme:Séries chronologiques en r, changer les données mensuelles en trimestriel

1/1/90 620 

2/1/90,591 

3/1/90,574 

4/1/90,542 

5/1/90,534 

6/1/90,545 

#...etc 

Si j'utilise ts() fonction, il est facile de rendre les données dans la structure des séries chronologiques comme:

  Jan Feb Mar ... Nov Dec 
    1990 620 591 574 ... 493 464 
    1991 100 200 300 ........... 

Y at-il des possibilités de le changer en répétant chaque trimestre comme ceci:

  1st 2nd 3rd 4th 
    1990-Q1 620 591 574 464 
    1990-Q2 100 200 300 400 
    1990-Q3 ... 
    1990-Q4 ... 
    1991-Q1 ... 

J'ai essayé de changer

ts(mydata,start=c(1990,1),frequency=12) 

à

ts(mydata,start=c(as.yearqrt("1990-1",1)),frequency=4) 

mais il ne semble pas fonctionner.

Quelqu'un peut-il m'aider? Merci beaucoup.

+2

Les données trimestrielles signifie que vous avez un point de données par trimestre, mais dans la sortie désirée vous semblez avoir 4 données points par trimestre? –

+1

Avez-vous besoin d'agréger ** vos données mensuelles en données trimestrielles? (c'est-à-dire prendre le quart 'mean' par exemple) – Fernando

+0

Merci beaucoup beginneR, Fernando et Rob .... Mon idée est un peu spéciale je sais. J'essaie vos idées et merci beaucoup! – user2152814

Répondre

7
monthly <- ts(mydata,start=c(1990,1),frequency=12) 
quarterly <- aggregate(monthly, nfrequency=4) 
3

Je ne suis pas d'accord avec Hyndman sur celui-ci. Ce qui est rare car Hyndman ne peut généralement pas se tromper. Cependant, je peux vous montrer que sa solution ne donne pas au PO ce qu'il veut.

test<-c(1:100) 
test_ts <- ts(test, start=c(2000,1), frequency=12) 
test_ts 

    Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
2000 1 2 3 4 5 6 7 8 9 10 11 12 
2001 13 14 15 16 17 18 19 20 21 22 23 24 
2002 25 26 27 28 29 30 31 32 33 34 35 36 
2003 37 38 39 40 41 42 43 44 45 46 47 48 
2004 49 50 51 52 53 54 55 56 57 58 59 60 
2005 61 62 63 64 65 66 67 68 69 70 71 72 
2006 73 74 75 76 77 78 79 80 81 82 83 84 
2007 85 86 87 88 89 90 91 92 93 94 95 96 
2008 97 98 99 100  

test_agg <- aggregate(test_ts, nfrequency=4) 
test_agg 

2000 6 15 24 33 
2001 42 51 60 69 
2002 78 87 96 105 
2003 114 123 132 141 
2004 150 159 168 177 
2005 186 195 204 213 
2006 222 231 240 249 
2007 258 267 276 285 
2008 294 

Eh bien, attendez, ce premier trimestre n'est pas la moyenne des 3 mois, c'est la somme. (1 + 2 + 3 = 6 mais vous voulez qu'il montre la moyenne = 2). Donc vous devrez modifier cela un peu.

test_agg <- aggregate(test_ts, nfrequency=4)/3 
# divisor is (old freq)/(new freq) = 12/4 = 3 
    Qtr1 Qtr2 Qtr3 Qtr4 
2000 2 5 8 11 
2001 14 17 20 23 
2002 26 29 32 35 
2003 38 41 44 47 
2004 50 53 56 59 
2005 62 65 68 71 
2006 74 77 80 83 
2007 86 89 92 95 
2008 98   

Qui affiche maintenant la moyenne des données mensuelles écrites chaque trimestre. Le diviseur est l'astuce ici. Si vous aviez hebdomadaire (freq = 52) et voulu trimestriel (freq = 4) vous diviser par 52/4 = 13.

+1

Vous pouvez simplement définir 'FUN =" mean "' plutôt que 'aggregate'ing en utilisant 'sum' et en divisant par trois. – Barker

+0

2 ans plus tard, j'utilise maintenant library (xls) et 'apply.quarterly (zoo_object, FUN = mean)' qui est tellement moins de maux de tête. –

1

Si vous voulez que la moyenne au lieu de la somme, il suffit d'ajouter « signifie »:

quarterly <- aggregate(monthly, nfrequency=4,mean) 
Questions connexes