Auto.arima với dữ liệu hàng ngày: làm thế nào để nắm bắt tính thời vụ / tính định kỳ?


21

Tôi đang điều chỉnh mô hình ARIMA trên chuỗi thời gian hàng ngày. Dữ liệu được thu thập hàng ngày từ 02-01-2010 đến 30-07-2011 và về doanh số bán báo. Vì có thể tìm thấy mô hình bán hàng hàng tuần (số lượng bản sao trung bình hàng ngày được bán thường giống nhau từ Thứ Hai đến Thứ Sáu, sau đó tăng vào Thứ Bảy và Chủ Nhật), tôi đang cố gắng nắm bắt "tính thời vụ" này. Đưa ra "dữ liệu" dữ liệu bán hàng, tôi tạo chuỗi thời gian như sau:

salests<-ts(data,start=c(2010,1),frequency=365)

và sau đó tôi sử dụng hàm auto.arima (.) để chọn mô hình ARIMA tốt nhất thông qua tiêu chí AIC. Kết quả luôn là một mô hình ARIMA không theo mùa, nhưng nếu tôi thử một số mô hình SARIMAs với cú pháp sau đây làm ví dụ:

sarima1<-arima(salests, order = c(2,1,2), seasonal = list(order = c(1, 0, 1), period = 7))

Tôi có thể có được kết quả tốt hơn. Có điều gì sai trong đặc tả lệnh ts / arima không? Mẫu hàng tuần rất mạnh nên tôi không mong đợi quá nhiều khó khăn trong việc nắm bắt nó. Bất kỳ trợ giúp sẽ rất hữu ích. Cảm ơn bạn, Giulia Deppieri

Cập nhật:

Tôi đã thay đổi một số đối số. Chính xác hơn, quy trình chọn ARIMA (4,1,3) là mô hình tốt nhất khi tôi đặt D=7, nhưng AIC và các chỉ số phù hợp khác cũng như các chỉ số và dự báo phù hợp) không cải thiện chút nào. Tôi đoán có một số sai lầm do nhầm lẫn giữa tính thời vụ và tính định kỳ ..?!

Cuộc gọi Auto.arima được sử dụng và đầu ra thu được:

modArima<-auto.arima(salests,D=7,max.P = 5, max.Q = 5)



 ARIMA(2,1,2) with drift         : 1e+20
 ARIMA(0,1,0) with drift         : 5265.543
 ARIMA(1,1,0) with drift         : 5182.772
 ARIMA(0,1,1) with drift         : 1e+20
 ARIMA(2,1,0) with drift         : 5137.279
 ARIMA(2,1,1) with drift         : 1e+20
 ARIMA(3,1,1) with drift         : 1e+20
 ARIMA(2,1,0)                    : 5135.382
 ARIMA(1,1,0)                    : 5180.817
 ARIMA(3,1,0)                    : 5117.714
 ARIMA(3,1,1)                    : 1e+20
 ARIMA(4,1,1)                    : 5045.236
 ARIMA(4,1,1) with drift         : 5040.53
 ARIMA(5,1,1) with drift         : 1e+20
 ARIMA(4,1,0) with drift         : 5112.614
 ARIMA(4,1,2) with drift         : 4953.417
 ARIMA(5,1,3) with drift         : 1e+20
 ARIMA(4,1,2)                    : 4960.516
 ARIMA(3,1,2) with drift         : 1e+20
 ARIMA(5,1,2) with drift         : 1e+20
 ARIMA(4,1,3) with drift         : 4868.669
 ARIMA(5,1,4) with drift         : 1e+20
 ARIMA(4,1,3)                    : 4870.92
 ARIMA(3,1,3) with drift         : 1e+20
 ARIMA(4,1,4) with drift         : 4874.095

 Best model: ARIMA(4,1,3) with drift        

Vì vậy, tôi giả sử hàm arima nên được sử dụng như:

bestOrder <- cbind(modArima$arma[1],modArima$arma[5],modArima$arma[2])
sarima1<-arima(salests, order = c(4,1,3))

không có thông số thành phần theo mùa và thông số kỹ thuật thời gian. Dữ liệu và phân tích thăm dò cho thấy rằng mô hình hàng tuần tương tự có thể được xem xét gần đúng cho mỗi tuần, ngoại trừ duy nhất là tháng 8 năm 2010 (khi tăng doanh số bán hàng nhất quán được đăng ký). Thật không may, tôi không có chuyên môn về mô hình hóa thời gian, thực tế tôi đang thử phương pháp này để tìm giải pháp thay thế cho các mô hình phi tham số khác mà tôi đã cố gắng phù hợp với những dữ liệu có vấn đề này. Tôi cũng có nhiều biến số phụ thuộc nhưng chúng đã cho thấy sức mạnh thấp trong việc giải thích biến trả lời: chắc chắn, phần khó nhất để mô hình hóa là thành phần thời gian. Hơn nữa, việc xây dựng các biến giả để thể hiện các tháng và các ngày trong tuần hóa ra không phải là một giải pháp mạnh mẽ.

Câu trả lời:


27

Nếu có tính thời vụ hàng tuần, hãy đặt thời gian theo mùa là 7.

salests <- ts(data,start=2010,frequency=7) 
modArima <- auto.arima(salests)

Lưu ý rằng việc lựa chọn sự khác biệt theo mùa không được tốt auto.arima()cho đến gần đây. Nếu bạn đang sử dụng v2.xx của forecastgói, hãy đặt D=1trong lệnh gọi auto.arima()để buộc phân biệt theo mùa. Nếu bạn đang sử dụng v3.xx của forecastgói, việc chọn tự động Dhoạt động tốt hơn nhiều (sử dụng thử nghiệm OCSB thay vì thử nghiệm CH).

Đừng cố so sánh AIC cho các mô hình với các mức độ khác nhau khác nhau. Họ không thể so sánh trực tiếp. Bạn chỉ có thể so sánh đáng tin cậy AIC với các mô hình có cùng thứ tự khác nhau.

Bạn không cần phải lắp lại mô hình sau khi gọi auto.arima(). Nó sẽ trả về một đối tượng Arima, giống như bạn đã gọi arima()với thứ tự mô hình đã chọn.


cảm ơn vì đã chỉ ra sai lầm ngu ngốc của tôi Tôi sẽ rút lại câu trả lời của mình.
mpiktas

1
Hơn bạn rất nhiều cho những gợi ý rất hữu ích của bạn. Tôi đang sử dụng phiên bản 2.19 của gói dự báo vì vậy tôi đã làm theo lời khuyên của bạn và đặt tham số D bằng 1 trong lệnh gọi auto.arima (). Bây giờ, mô hình tốt nhất được chọn cho loạt salest là ARIMA (1,0,0) với giá trị trung bình khác không. Tôi có nên mong đợi đặc điểm kỹ thuật của phần thời vụ cho mô hình tốt nhất được trả về không, ý tôi là các giá trị của P, D, Q hoặc ít nhất là cho D?
Giulia

2
Miễn là dữ liệu của bạn có tần số khác 1, các mô hình ARIMA theo mùa sẽ được xem xét. Nếu một mô hình không theo mùa đang được trả về, thì tính thời vụ rất yếu hoặc dữ liệu không nằm trong đối tượng ts có tần số> 1.
Rob Hyndman

14

Vấn đề với việc khớp ARIMA theo mùa với dữ liệu hàng ngày là "thành phần theo mùa" chỉ có thể hoạt động vào cuối tuần hoặc có thể chỉ là các ngày trong tuần, do đó, nói chung có một "thành phần theo mùa" không đáng kể. Bây giờ, những gì bạn phải làm là tăng dữ liệu của bạn với 6 hình nộm đại diện cho các ngày trong tuần và có lẽ các chỉ số hàng tháng để thể hiện các hiệu ứng hàng năm. Bây giờ hãy xem xét kết hợp các sự kiện như ngày lễ và bao gồm bất kỳ hiệu ứng khách hàng tiềm năng, đương thời hoặc độ trễ nào xung quanh các biến đã biết này. Không có giá trị bất thường (xung) hoặc dịch chuyển mức hoặc xu hướng thời gian cục bộ trong dữ liệu. Hơn nữa, các hiệu ứng trong tuần có thể đã thay đổi theo thời gian, ví dụ như không có hiệu ứng thứ bảy trong 20 tuần đầu tiên mà là hiệu ứng thứ bảy trong 50 tuần qua.


Trong trường hợp đó (IrishStat), đó sẽ không phải là Kỹ thuật mô hình hỗn hợp thay vì ARIMA. Độ trễ không được thực hiện ở bất cứ đâu trong ARIMA, ngoại trừ Box Jlung Test. Auto.arima (gần đây) sửa mọi thứ, bao gồm Thu nhỏ dữ liệu, biến động theo mùa (đó là lý do tại sao tôi tìm thấy các tham số p, d, q tốt nhất).
wackyanil

Nó được gọi là Hàm chuyển và phản ánh cách tiếp cận hiệp đồng, xem autobox.com/pdfs/capable.pd bắt đầu với slide 42. Auto.arima có thể hoạt động cho các trường hợp đơn giản nhưng theo tôi thì không đủ chung chung. Nếu bạn có một bộ dữ liệu trong đầu, hãy đặt một câu hỏi mới và đưa nó vào.
IrishStat

@IrishStat ý bạn là ARIMA có can thiệp không? ngày trong tuần là biến giả? và các biến giả tương tự cho ngày lễ?
Nhiệt tình

Vâng .. đó sẽ là cách tiếp cận dữ liệu hàng ngày của tôi
IrishStat

0

Để xác định thứ tự thời vụ trong ts của tôi (dữ liệu hàng ngày trong 3 năm) tôi đã sử dụng mã này trong Matlab:

s = 0; min = 1e + 07; n = chiều dài (x); cho i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = tổng (abs (khác)); nếu (s (i)

Nó cho tôi 365 cái hợp lý.


1
Chào mừng đến với trang web. Tôi không rõ làm thế nào điều này trả lời câu hỏi ban đầu và tôi không rõ mã mà bạn đã đăng chỉ là gì khi nhìn vào nó. Có lẽ bạn có thể mở rộng câu trả lời một chút?
einar

1
Giải pháp của bạn đối phó với các hiệu ứng cố định trong tuần như thế nào, hiệu ứng ngày cố định trong tháng, hiệu ứng trong tuần, hiệu ứng trong ngày, hiệu ứng chì và độ trễ của ngày lễ , thứ hai - sau kỳ nghỉ thứ sáu, thứ sáu trước ngày nghỉ thứ hai, hiệu ứng hàng tháng, hiệu ứng hàng tuần, thay đổi hiệu ứng ngày nghỉ trong tuần theo thời gian, nhịp đập, mức độ / bước thay đổi?
IrishStat

mã Matlab s = 0; min = 1e + 07; n = length (x); cho i = 1: 400 diff = x (i + 1: n) -x (1: ni); s (i) = tổng (abs (khác)); if (s (i) <min) min = s (i); i end end
nkabouche
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.