10

I figured out a way to backcast (ie. predicting the past) with a time series. Now I'm just struggling with the programming in R.

I would like to reverse the time series data so that I can forecast the past. How do I do this?

Say the original time series object looks like this:

     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2008 116  99 115 101 112 120 120 110 143 136 147 142
2009 117 114 133 134 139 147 147 131 125 143 136 129

I want it to look like this for the 'backcasting':

     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2008 129 136 143 125 131 147 147 139 134 133 114 117
2009 142 147 136 143 110 120 120 112 101 115  99 116

Note, I didn't forget to change the years - I am basically mirroring/reversing the data and keeping the years, then going to forecast.

I hope this can be done in R? Or should I export and do it in Excel somehow?

OSlOlSO
  • 441
  • 7
  • 14
  • 7
    RAAAAAAAAHHH!!!!! Never **ever** suggest again to export and do 'it' in Excel. That's like having intercourse on the altar of St. Peters church in the Vatican. You go to hell for less than that. – Joris Meys Aug 07 '11 at 22:47
  • @Joris What if you've already sold your soul to the Devil of Globals? http://stackoverflow.com/questions/6955128/object-not-found-error-with-ddply-inside-a-function/6955240#6955240 – Ari B. Friedman Aug 08 '11 at 08:53
  • @OSIOISO All joking aside, Joris is of course right. See http://www.burns-stat.com/pages/Tutor/spreadsheet_addiction.html for more reasons why. – Ari B. Friedman Aug 08 '11 at 08:54

3 Answers3

11

Try this:

tt <- ts(1:24, start = 2008, freq = 12)
tt[] <- rev(tt)

ADDED. This also works and does not modify tt :

replace(tt, TRUE, rev(tt))
G. Grothendieck
  • 254,981
  • 17
  • 203
  • 341
  • Thanks - quicker than @gsk3's method but similar. (So I marked yours correct because it's simpler. Hope this is according to Stackoverflow policy.) – OSlOlSO Aug 07 '11 at 18:48
4

You can just coerce the matrix to a vector, reverse it, and make it a matrix again. Here's an example:

mat <- matrix(seq(24),nrow=2,byrow=TRUE)
> mat

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    1    2    3    4    5    6    7    8    9    10    11    12
[2,]   13   14   15   16   17   18   19   20   21    22    23    24
> matrix( rev(mat), nrow=nrow(mat) )

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]   24   23   22   21   20   19   18   17   16    15    14    13
[2,]   12   11   10    9    8    7    6    5    4     3     2     1
Ari B. Friedman
  • 71,271
  • 35
  • 175
  • 235
  • Thanks @gsk3 :) Although there is a quicker way with `ts` data. See above answer. – OSlOlSO Aug 07 '11 at 18:49
  • @OSIOISO Marking G.G.'s answer as correct was the right thing to do, as his works better with time series objects. For future reference, posting a quick reproducible example with your question will net you better answers. It usually doesn't take so long (see G.G.'s first line), and it makes the problem you're trying to solve much clearer. – Ari B. Friedman Aug 07 '11 at 18:51
  • Thanks for the tip :) I'll remember it for future questions. – OSlOlSO Aug 07 '11 at 19:25
3

I found this post of Hyndman under http://www.r-bloggers.com/backcasting-in-r/ and am basically pasting in his solution, which in my opinion provids a complete answer to you question.

library(forecast)
x <- WWWusage
h <- 20
f <- frequency(x)
# Reverse time
revx <- ts(rev(x), frequency=f)
# Forecast
fc <- forecast(auto.arima(revx), h)
plot(fc)
# Reverse time again
fc$mean <- ts(rev(fc$mean),end=tsp(x)[1] - 1/f, frequency=f)
fc$upper <- fc$upper[h:1,]
fc$lower <- fc$lower[h:1,]
fc$x <- x
# Plot result
plot(fc, xlim=c(tsp(x)[1]-h/f, tsp(x)[2]))
Andreas Dibiasi
  • 261
  • 3
  • 10