2011-08-07 13 views
10

Tôi đã tìm ra cách để phát lại (ví dụ: dự đoán quá khứ) với chuỗi thời gian. Bây giờ tôi chỉ đang đấu tranh với chương trình trong R.R: Đảo ngược dữ liệu trong đối tượng chuỗi thời gian

Tôi muốn đảo ngược dữ liệu chuỗi thời gian để tôi có thể dự báo quá khứ. Làm thế nào để tôi làm điều này?

Giả sử đối tượng chuỗi thời gian ban đầu trông như thế này:

 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 

Tôi muốn nó trông như thế này cho '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 

Lưu ý, tôi không quên thay đổi những năm - về cơ bản tôi đang phản ánh/đảo ngược dữ liệu và giữ lại những năm, sau đó dự báo.

Tôi hy vọng điều này có thể được thực hiện trong R? Hoặc tôi nên xuất và làm điều đó trong Excel bằng cách nào đó?

+5

RAAAAAAAAHHH !!!!! Không bao giờ ** bao giờ ** đề xuất một lần nữa để xuất và làm 'nó' trong Excel. Điều đó giống như giao hợp trên bàn thờ của nhà thờ St. Peters ở Vatican. Bạn xuống địa ngục ít hơn thế. –

+0

@ Joris Nếu bạn đã bán linh hồn mình cho Quỷ Globals thì sao? http://stackoverflow.com/questions/6955128/object-not-found-error-with-ddply-inside-a-function/6955240#6955240 –

+0

@OSIOISO Tất cả nói đùa, Joris dĩ nhiên là đúng. Xem http://www.burns-stat.com/pages/Tutor/spreadsheet_addiction.html để biết thêm lý do tại sao. –

Trả lời

11

Hãy thử điều này:

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

ADDED. Điều này cũng làm và không sửa đổi tt:

replace(tt, TRUE, rev(tt)) 
+0

Cảm ơn - nhanh hơn phương pháp @ gsk3 nhưng tương tự. (Vì vậy, tôi đánh dấu của bạn chính xác bởi vì nó đơn giản hơn. Hy vọng điều này là theo chính sách Stackoverflow.) – OSlOlSO

4

Bạn chỉ có thể ép ma trận vào một vectơ, đảo ngược nó và làm cho nó trở thành ma trận một lần nữa. Dưới đây là một ví dụ:

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 
+0

Cảm ơn @ gsk3 :) Mặc dù có cách nhanh hơn với dữ liệu 'ts'. Xem câu trả lời ở trên. – OSlOlSO

+0

@OSIOISO Đánh dấu câu trả lời của G.G. là đúng là điều đúng đắn để làm, vì tác phẩm của ông tốt hơn với các đối tượng chuỗi thời gian. Để tham khảo trong tương lai, việc đăng một ví dụ có thể tái sản xuất nhanh với câu hỏi của bạn sẽ giúp bạn trả lời tốt hơn. Nó thường không mất nhiều thời gian (xem dòng đầu tiên của G.G.), và nó làm cho vấn đề bạn đang cố gắng giải quyết rõ ràng hơn nhiều. –

+0

Cảm ơn lời khuyên :) Tôi sẽ nhớ nó cho các câu hỏi trong tương lai. – OSlOlSO

3

tôi thấy bài này của Hyndman dưới http://www.r-bloggers.com/backcasting-in-r/ và đang cơ bản dán trong dung dịch của mình, mà theo ý kiến ​​của tôi provids một câu trả lời hoàn chỉnh cho bạn câu hỏi.

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]))