Phân tích chuỗi thời gian hàng ngày


24

Tôi đang cố gắng phân tích chuỗi thời gian và mới đối với lĩnh vực này. Tôi có số lượng sự kiện hàng ngày từ 2006-2009 và tôi muốn điều chỉnh mô hình chuỗi thời gian cho nó. Đây là tiến bộ mà tôi đã thực hiện:

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
plot.ts(timeSeriesObj)

Cốt truyện tôi nhận được là:

Lô thời gian

Để xác minh xem có tính thời vụ và xu hướng trong dữ liệu hay không, tôi làm theo các bước được đề cập trong bài đăng này :

ets(x)
fit <- tbats(x)
seasonal <- !is.null(fit$seasonal)
seasonal

và trong blog của Rob J Hyndman :

library(fma)
fit1 <- ets(x)
fit2 <- ets(x,model="ANN")

deviance <- 2*c(logLik(fit1) - logLik(fit2))
df <- attributes(logLik(fit1))$df - attributes(logLik(fit2))$df 
#P value
1-pchisq(deviance,df)

Cả hai trường hợp chỉ ra rằng không có tính thời vụ.

Khi tôi vẽ ACF & PACF của loạt bài, đây là những gì tôi nhận được:

ACF PACF

Câu hỏi của tôi là:

  1. Đây có phải là cách để xử lý dữ liệu chuỗi thời gian hàng ngày? Đây trang gợi ý rằng tôi nên nhìn vào cả hai mô hình hàng tuần và hàng năm nhưng phương pháp này là không rõ ràng với tôi.

  2. Tôi không biết cách tiến hành khi tôi có các lô ACF và PACF.

  3. Tôi chỉ có thể sử dụng chức năng auto.arima?

    phù hợp <- arima (myts, order = c (p, d, q)

***** Cập nhật kết quả Auto.Arima ******

Khi tôi thay đổi tần số của dữ liệu thành 7 theo nhận xét của Rob Hyndman tại đây , auto.arima chọn mô hình ARIMA theo mùa và xuất ra:

Series: timeSeriesObj 
ARIMA(1,1,2)(1,0,1)[7]                    

Coefficients:
       ar1      ma1     ma2    sar1     sma1
      0.89  -1.7877  0.7892  0.9870  -0.9278
s.e.   NaN      NaN     NaN  0.0061   0.0162

sigma^2 estimated as 21.72:  log likelihood=-4319.23
AIC=8650.46   AICc=8650.52   BIC=8682.18 

****** Kiểm tra tính thời vụ cập nhật ******

Khi tôi kiểm tra tính thời vụ với tần số 7, nó xuất ra True nhưng với tính thời vụ 365.25, nó cho kết quả sai. Điều này có đủ để kết luận thiếu tính thời vụ hàng năm?

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=7)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

trả về:

True

trong khi

timeSeriesObj = ts(x,start=c(2006,1,1),frequency=365.25)
fit <- tbats(timeSeriesObj)
seasonal <- !is.null(fit$seasonal)
seasonal

trả về:

False

Sản lượng nào không str(x)mang lại?
S. Kolassa - Tái lập Monica

Nó mang lại num [1: 1460] 17 12 12 17 13 14 14 5 12 21 ...
statBeginner

Bạn có thể gửi dữ liệu?
forecaster

Đáng tiếc tôi không thể.
statBeginner

2
OK, tôi sẽ dựa vào kiểm tra trực quan và kiến ​​thức tên miền bên cạnh các bài kiểm tra thống kê để phát hiện tính thời vụ. Đối với câu hỏi của bạn về việc arima có thể xử lý nhiều tính thời vụ hay không - Chắc chắn ARIMA sẽ xử lý bất kỳ loại thời vụ nào, Rđơn giản không có khả năng xử lý nó. Tôi sẽ tìm kiếm các giải pháp thương mại nếu có hàng tồn kho / chi phí sản xuất cao liên quan đến sản phẩm mà bạn đang cố gắng dự báo. Rcó những hạn chế nghiêm trọng đối với nhiệm vụ dự báo như của bạn. Nhìn vào các câu hỏi về dự báo hàng ngày khác ở đâu trong trang web này.
dự báo

Câu trả lời:


25

ACF và PACF của bạn chỉ ra rằng bạn ít nhất có tính thời vụ hàng tuần, được thể hiện bằng các đỉnh ở độ trễ 7, 14, 21 và vv.

Bạn cũng có thể có tính thời vụ hàng năm, mặc dù điều đó không rõ ràng trong chuỗi thời gian của bạn.

Đặt cược tốt nhất của bạn, có khả năng nhiều mùa, có thể là một tbatsmô hình, mô hình rõ ràng nhiều loại thời vụ. Tải forecastgói:

library(forecast)

Đầu ra của bạn từ str(x)chỉ ra rằng xchưa mang thông tin về khả năng có nhiều mùa. Nhìn vào ?tbats, và so sánh đầu ra của str(taylor). Chỉ định thời vụ:

x.msts <- msts(x,seasonal.periods=c(7,365.25))

Bây giờ bạn có thể phù hợp với một tbatsmô hình. (Hãy kiên nhẫn, điều này có thể mất một lúc.)

model <- tbats(x.msts)

Cuối cùng, bạn có thể dự báo và cốt truyện:

plot(forecast(model,h=100))

Bạn không nên sử dụng arima()hoặc auto.arima(), vì những chỉ có thể xử lý một loại duy nhất của mùa: một trong hai hàng tuần hoặc hàng năm. Đừng hỏi tôi auto.arima()sẽ làm gì trên dữ liệu của bạn. Nó có thể chọn một trong các tính thời vụ hoặc có thể bỏ qua chúng hoàn toàn.


EDIT để trả lời các câu hỏi bổ sung từ một bình luận:

  1. Làm cách nào để kiểm tra xem dữ liệu có theo mùa hay không? Tôi có thể tạo một chuỗi tổng số sự kiện khác mỗi tháng và sử dụng ACF của nó để quyết định điều này không?

Tính toán một mô hình trên dữ liệu hàng tháng có thể là một khả năng. Sau đó, bạn có thể, ví dụ, so sánh AIC giữa các mô hình có và không có tính thời vụ.

Tuy nhiên, tôi muốn sử dụng một mẫu nắm giữ để đánh giá các mô hình dự báo. Giữ 100 điểm dữ liệu cuối cùng. Điều chỉnh mô hình với tính thời vụ hàng năm hàng tuần với phần còn lại của dữ liệu (như ở trên), sau đó khớp với mô hình chỉ có tính thời vụ hàng tuần, ví dụ: sử dụng auto.arima()trên tsvới frequency=7. Dự báo sử dụng cả hai mô hình vào giai đoạn nắm giữ. Kiểm tra xem cái nào có lỗi thấp hơn, sử dụng MAE, MSE hoặc bất cứ điều gì có liên quan nhất đến chức năng mất của bạn. Nếu có ít sự khác biệt giữa các lỗi, hãy đi với mô hình đơn giản hơn; mặt khác, sử dụng cái có lỗi thấp hơn

Bằng chứng của bánh pudding là trong việc ăn uống, và bằng chứng của mô hình chuỗi thời gian là trong dự báo.

Để cải thiện vấn đề, không sử dụng một mẫu nắm giữ duy nhất (có thể gây hiểu nhầm, đưa ra mức tăng ở cuối chuỗi của bạn), nhưng sử dụng dự báo nguồn gốc cuộn, còn được gọi là "xác thực chéo chuỗi thời gian" . (Tôi rất khuyến nghị rằng toàn bộ sách giáo khoa dự báo trực tuyến miễn phí .

  1. Vì vậy, các mô hình ARIMA theo mùa thường không thể xử lý nhiều mùa? Đây có phải là một thuộc tính của chính mô hình hay nó chỉ là cách các hàm trong R được viết?

Các mô hình ARIMA tiêu chuẩn xử lý tính thời vụ bằng cách phân biệt mùa vụ. Đối với dữ liệu hàng tháng theo mùa, bạn sẽ không mô hình chuỗi thời gian thô, nhưng chuỗi thời gian khác nhau giữa tháng 3 năm 2015 và tháng 3 năm 2014, giữa tháng 2 năm 2015 và tháng 2 năm 2014 trở đi. (Để có được dự báo về quy mô ban đầu, tất nhiên bạn cần phải bỏ qua một lần nữa.)

Không có cách rõ ràng ngay lập tức để mở rộng ý tưởng này cho nhiều mùa.

Tất nhiên, bạn có thể làm một cái gì đó bằng cách sử dụng ARIMAX, ví dụ: bằng cách bao gồm các hình nộm hàng tháng để mô hình hóa tính thời vụ hàng năm, sau đó mô hình số dư sử dụng ARIMA theo mùa hàng tuần. Nếu bạn muốn làm điều này trong R, hãy sử dụng ts(x,frequency=7), tạo một ma trận các hình nộm hàng tháng và đưa dữ liệu đó vào xregtham số của auto.arima().

Tôi không nhớ bất kỳ ấn phẩm nào đặc biệt mở rộng ARIMA theo nhiều mùa, mặc dù tôi chắc chắn rằng ai đó đã làm gì đó trong đoạn trước của tôi.


Dưới đây là một vài câu hỏi mà tôi có dựa trên câu trả lời của bạn: 1. Làm cách nào tôi có thể kiểm tra xem dữ liệu có theo mùa hay không? Tôi có thể tạo một chuỗi tổng số sự kiện khác mỗi tháng và sử dụng acf của nó để quyết định điều này không? 2. Vì vậy, các mô hình ARIMA theo mùa thường có thể xử lý nhiều mùa? Đây có phải là một thuộc tính của chính mô hình hay nó chỉ là cách các hàm trong R được viết?
statBeginner

Bài đăng được cập nhật với kết quả từ Auto.Arima với tính thời vụ hàng tuần
statBeginner

1
@StephanKolassa, tôi đã tìm thấy bài viết này từ AT & T một thời gian trước sử dụng nhiều ARIMA theo mùa. Mô hình như một trong bài viết là không thể R, vì Rkhông có khả năng xử lý ARIMA đa lý.
dự báo

2
@forecaster: tuyệt, cảm ơn! Có vẻ như họ thực hiện phân biệt kép trong phương trình 3.1. Tôi lo lắng về việc mất rất nhiều dữ liệu theo cách đó. Thật không may, họ không so sánh kết quả của họ với một điểm chuẩn đơn giản , ví dụ, nhu cầu của tuần trước. Điều tôi thích là cách họ cũng điều tra các kết hợp dự báo giữa DSARIMA và tbatsmô hình tương tự.
S. Kolassa - Tái lập Monica

2
@StephanKolassa Tôi đồng ý, tôi là người ủng hộ việc sử dụng dự báo ngây thơ làm chuẩn mực như được hỗ trợ trong Nguyên tắc Dự báo của Armstrong và chỉ thêm độ phức tạp nếu cải thiện độ chính xác. Tôi đã kết thúc trong top 2 phần trăm trong một vài cuộc thi kaggle bằng cách sử dụng các phương pháp ngây thơ trong quần thể của tôi.
dự báo

3

Cách tốt nhất để phân tách dữ liệu theo mùa bằng các gói R hiện có là ceemdan () trong Rlibeemd. Kỹ thuật này trích xuất tính thời vụ của nhiều thời kỳ. Mặc định hoạt động tốt. Nó sử dụng biến đổi Hilbert-Huang thay vì biến đổi Fourier. Biến đổi Fourier có một nhược điểm nghiêm trọng ở chỗ nó chỉ có thể xử lý dữ liệu tuyến tính, ổn định khi hầu hết các chuỗi quan tâm đều không có. Ví dụ: đi bộ ngẫu nhiên y_t = y_ {t-1} + e_t là bước đi ngẫu nhiên đơn giản nhất và thường gặp. Các phương pháp khác giữ biên độ của sự thay đổi theo mùa cố định khi nó thường thay đổi trong thực tế.


1
Vui lòng xem hướng dẫn & tham khảo MathJax cơ bản để được trợ giúp về việc đưa toán học vào câu trả lời. Ngoài ra, vui lòng cung cấp một số biện minh cho tuyên bố " tốt nhất " (hoặc xem xét sửa đổi yêu cầu) - ít nhất cũng phải tốt như mọi lựa chọn khác, không chỉ trong số đó.
Glen_b -Reinstate Monica

1
Điều đáng nói là gói này có trên CRAN
Glen_b -Reinstate Monica

2

Các câu hỏi bạn nêu đã được xử lý trong Dự báo chuỗi thời gian R: Các câu hỏi liên quan đến đầu ra của tôi . Vui lòng xem kỹ câu trả lời chi tiết của tôi và tất cả các ý kiến ​​trong cuộc thảo luận bao gồm cả những câu hỏi cho câu hỏi ban đầu vì tôi tin rằng chúng có liên quan đến vấn đề của bạn. Bạn thực sự có thể lấy dữ liệu được cung cấp trong bài và sử dụng nó làm thời điểm giảng dạy cho chính mình. Sử dụng toàn bộ cuộc thảo luận như là một mồi cho những gì bạn nên làm.


1
Cảm ơn rất nhiều! Tôi sẽ sử dụng dữ liệu từ bài đăng đó để thử mọi thứ.
statBeginner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.