2016-04-03 5 views
1

Angenommen, wir vierteljährliche BIP-Änderungsdaten wie die folgenden haben:eine monatliche Serie Form aus einer vierteljährlichen Serie

  Country 
1999Q3 0.01 
1999Q4 0.01 
2000Q1 0.02 
2000Q2 0.00 
2000Q3 -0.01 

Nun würde Ich mag diese in eine monatliche Serie drehen, basierend auf z.B. der Mittelwert der beiden vorangegangenen Quartale als ein Maß für die wirtschaftlichen Verhältnisse. I.e. mit den obigen Daten würde Ich mag folgendes erzeugen:

  Country 
2000-01 0.01 
2000-02 0.01 
2000-03 0.01 
2000-04 0.015 
2000-05 0.015 
2000-06 0.015 
2000-07 0.01 
2000-08 0.01 
2000-09 0.01 
2000-10 -0.005 
2000-11 -0.005 
2000-12 -0.005 

Dies ist so, dass ich Regressionen mit anderen monatlichen Reihen laufen kann. Aggregieren von Daten von häufiger zu weniger häufig ist einfach, aber wie würde ich es in die entgegengesetzte Richtung tun?

Bearbeiten. Es scheint, dass die Verwendung von spline der richtige Weg wäre, dies zu tun. Die Frage ist dann, wie behandelt man eine variierende Menge von NA's am Anfang der Länderserie, wenn man spline mit apply macht. Es gibt wie üblich mehrere Länder im Datenrahmen als Spalten und am Anfang der Reihe haben sie eine unterschiedliche Anzahl von NAs.

+0

haben Sie versucht approx() - wird Daten interpolieren –

+0

Danke, das zum Finden von 'splinefun' führen, es scheint, dass kubische Spline-Interpolation der Standard Weg ist, dies in der Wirtschaft zu tun. Das wird zwar zu einer seriellen Korrelation führen, aber dann muss ich nur Newey-West benutzen. – Roope

Antwort

3

In den Zoo mit "yearmon" Klassenindex konvertieren, vorausgesetzt, die Werte sind an den Enden der Viertel. Führen Sie dann das rollende Mittel unter Angabe z.mu. Verschmelzen Sie das nun mit einem Zoo-Objekt mit null Breite, das alle Monate enthält, und verwenden Sie na.spline, um die fehlenden Werte auszufüllen (oder verwenden Sie na.locf oder na.approx für verschiedene Formen der Interpolation). Verwenden Sie optional fortify.zoo, um zurück in einen data.frame zu konvertieren.

library(zoo) 

z <- zoo(coredata(DF), as.yearmon(as.yearqtr(rownames(DF)), frac = 1)) 
z.mu <- rollmeanr(z, 2, partial = TRUE) 
ym <- seq(floor(start(z.mu)), floor(end(z.mu)) + 11/12, 1/12) 
z.ym <- na.spline(merge(z.mu, zoo(, ym))) 

fortify.zoo(z.ym) 

geben:

 Index  Country 
1 Jan 1999 -0.065000000 
2 Feb 1999 -0.052222222 
3 Mar 1999 -0.040555556 
4 Apr 1999 -0.030000000 
5 May 1999 -0.020555556 
6 Jun 1999 -0.012222222 
7 Jul 1999 -0.005000000 
8 Aug 1999 0.001111111 
9 Sep 1999 0.006111111 
10 Oct 1999 0.010000000 
11 Nov 1999 0.012777778 
12 Dec 1999 0.014444444 
13 Jan 2000 0.015000000 
14 Feb 2000 0.014444444 
15 Mar 2000 0.012777778 
16 Apr 2000 0.010000000 
17 May 2000 0.006111111 
18 Jun 2000 0.001111111 
19 Jul 2000 -0.005000000 
20 Aug 2000 -0.012222222 
21 Sep 2000 -0.020555556 
22 Oct 2000 -0.030000000 
23 Nov 2000 -0.040555556 
24 Dec 2000 -0.052222222 

Hinweis: Der Eingang DF in reproduzierbarer Form verwendet wird:

Lines <- "   Country 
1999Q3 0.01 
1999Q4 0.01 
2000Q1 0.02 
2000Q2 0.00 
2000Q3 -0.01" 

DF <- read.table(text = Lines) 

Update: Ursprünglich gestellte Frage vorwärts letzten Wert zu bewegen, aber war geändert, um nach Spline-Interpolation zu fragen, so wurde die Antwort entsprechend geändert. Auch geändert, um in Jan zu beginnen und in Dec zu enden und jetzt anzunehmen, dass Daten für Viertelende sind.