Làm cách nào để khớp mô hình ARIMAX với R?


33

Tôi có bốn chuỗi thời gian đo khác nhau theo giờ:

  1. Tiêu thụ nhiệt trong nhà
  2. Nhiệt độ bên ngoài nhà
  3. Bức xạ mặt trời
  4. Tốc độ gió

Tôi muốn có thể dự đoán mức tiêu thụ nhiệt trong nhà. Có một xu hướng theo mùa rõ ràng, cả trên cơ sở hàng năm và hàng ngày. Vì có một mối tương quan rõ ràng giữa các loạt khác nhau, tôi muốn điều chỉnh chúng bằng mô hình ARIMAX. Điều này có thể được thực hiện trong R, sử dụng hàm arimax từ gói TSA.

Tôi đã cố gắng đọc tài liệu về chức năng này và để đọc các chức năng chuyển giao, nhưng cho đến nay, mã của tôi:

regParams = ts.union(ts(dayy))
transferParams = ts.union(ts(temp))
model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams,xtransf=transferParams,transfer=list(c(1,1))
pred10 = predict(model10, newxreg=regParams)

đưa cho tôi: nhập mô tả hình ảnh ở đây

trong đó đường màu đen là dữ liệu đo thực tế và đường màu xanh là mô hình được trang bị của tôi so sánh. Không chỉ không phải là một mô hình tốt, mà rõ ràng có điều gì đó không ổn.

Tôi sẽ thừa nhận rằng kiến ​​thức của tôi về các mô hình ARIMAX và các chức năng chuyển bị hạn chế. Trong hàm arimax (), (theo như tôi đã hiểu), xtransf là chuỗi thời gian ngoại sinh mà tôi muốn sử dụng (sử dụng các hàm truyền) để dự đoán chuỗi thời gian chính của mình. Nhưng sự khác biệt giữa xreg và xtransf thực sự là gì?

Tổng quát hơn, tôi đã làm gì sai? Tôi muốn có thể có được một sự phù hợp tốt hơn so với cái đạt được từ lm (nhiệt ~ temp radi gió * thời gian).

Chỉnh sửa: Dựa trên một số ý kiến, tôi đã xóa chuyển và thêm xreg thay vào đó:

regParams = ts.union(ts(dayy), ts(temp), ts(time))
model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams)

trong đó dayy là "ngày số trong năm" và thời gian là giờ trong ngày. Nhiệt độ lại là nhiệt độ bên ngoài. Điều này cho tôi kết quả như sau:

nhập mô tả hình ảnh ở đây

đó là tốt hơn, nhưng không gần như những gì tôi mong đợi để xem.

Câu trả lời:


34

Bạn sẽ gặp một chút rắc rối khi lập mô hình một loạt với 2 cấp độ thời vụ bằng mô hình ARIMA. Có được quyền này sẽ phụ thuộc rất nhiều vào việc thiết lập mọi thứ một cách chính xác. Bạn đã xem xét một mô hình tuyến tính đơn giản chưa? Chúng nhanh hơn và dễ phù hợp hơn nhiều so với các mô hình ARIMA và nếu bạn sử dụng các biến giả cho các mức độ thời vụ khác nhau của mình thì chúng thường khá chính xác.

  1. Tôi giả sử bạn có dữ liệu hàng giờ, vì vậy hãy đảm bảo đối tượng TS của bạn được thiết lập với tần suất 24.
  2. Bạn có thể mô hình hóa các mức độ thời vụ khác bằng cách sử dụng các biến giả. Ví dụ: bạn có thể muốn có một bộ các hình nộm 0/1 đại diện cho tháng của năm.
  3. Bao gồm các biến giả trong xregđối số, cùng với bất kỳ hiệp phương sai nào (như nhiệt độ).
  4. Khớp mô hình với hàm arima trong cơ sở R. Hàm này có thể xử lý các mô hình ARMAX thông qua việc sử dụng xregđối số.
  5. Hãy thử các hàm Arimaauto.arima trong gói dự báo. auto.arima là tốt vì nó sẽ tự động tìm các tham số tốt cho mô hình arima của bạn. Tuy nhiên, sẽ mất FOREVER để phù hợp với tập dữ liệu của bạn.
  6. Hãy thử hàm tslm trong gói arima, sử dụng các biến giả cho từng cấp độ thời vụ. Điều này sẽ phù hợp nhanh hơn rất nhiều so với mô hình Arima, và thậm chí có thể hoạt động tốt hơn trong tình huống của bạn.
  7. Nếu 4/5/6 không hoạt động, THÌ bắt đầu lo lắng về các chức năng chuyển. Bạn phải bò trước khi bạn có thể đi bộ.
  8. Nếu bạn đang dự định dự báo trong tương lai, trước tiên bạn sẽ cần dự báo các biến xreg của mình. Điều này rất dễ dàng đối với người giả theo mùa, nhưng bạn sẽ phải suy nghĩ về cách thực hiện dự báo thời tiết tốt. Có thể sử dụng trung bình của dữ liệu lịch sử?

Đây là một ví dụ về cách tôi sẽ tiếp cận điều này:

#Setup a fake time series
set.seed(1)
library(lubridate)
index <- ISOdatetime(2010,1,1,0,0,0)+1:8759*60*60
month <- month(index)
hour <- hour(index)
usage <- 1000+10*rnorm(length(index))-25*(month-6)^2-(hour-12)^2
usage <- ts(usage,frequency=24)

#Create monthly dummies.  Add other xvars to this matrix
xreg <- model.matrix(~as.factor(month))[,2:12]
colnames(xreg) <- c('Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')

#Fit a model
library(forecast)
model <- Arima(usage, order=c(0,0,0), seasonal=list(order=c(1,0,0), period=24), xreg=xreg)
plot(usage)
lines(fitted(model),col=2)

#Benchmark against other models
model2 <- tslm(usage~as.factor(month)+as.factor(hour))
model3 <- tslm(usage~as.factor(month))
model4 <- rep(mean(usage),length(usage))

#Compare the 4 models
library(plyr) #for rbind.fill
ACC <- rbind.fill(  data.frame(t(accuracy(model))),
                    data.frame(t(accuracy(model2))),
                    data.frame(t(accuracy(model3))),
                    data.frame(t(accuracy(model4,usage)))
                )
ACC <- round(ACC,2)
ACC <- cbind(Type=c('Arima','LM1','Monthly Mean','Mean'),ACC)
ACC[order(ACC$MAE),]

Hàm được trang bị () là gì. Nếu tôi sử dụng điều đó, tôi sẽ nhận được kết quả tốt hơn so với dự đoán (model10, newxreg = regParams).
utdiscant

@utdiscant: predict()được sử dụng để dự báo, trong khi fitted()trả về mô hình phù hợp trong giai đoạn lịch sử. Nếu bạn muốn trợ giúp cụ thể hơn, bạn nên đăng một ví dụ có thể lặp lại với một số mã.
Zach

@utdiscant: cũng vậy, nếu bạn sử dụng dayy như một xreg, bạn có nguy cơ bị thừa, vì bạn chỉ có 24 quan sát mỗi ngày. Bạn có thể nhận được kết quả dự báo tốt hơn nếu bạn sử dụng tháng trong năm.
Zach

@utdiscant: Hơn nữa, xregs dựa trên thời gian của bạn cần phải là biến giả . Cách bạn mô hình hóa bây giờ là bạn dự kiến ​​sẽ heattăng tuyến tính theo giờ trong ngày, và sau đó nhảy xuống khi giờ trở về 1. Nếu bạn sử dụng các biến giả, mỗi giờ trong ngày sẽ có hiệu lực riêng. Chạy qua mã ví dụ của tôi và chú ý cẩn thận đến cách tôi xây dựng đối tượng xreg của mình.
Zach

Một nhược điểm của các chức năng ARIMA trong statsforecastcác gói là chúng không phù hợp với các chức năng chuyển prober. Tài liệu về stats::arimahàm trạng thái như sau: Nếu bao gồm một thuật ngữ xreg, hồi quy tuyến tính (với một thuật ngữ không đổi nếu include.mean là đúng và không có sự khác biệt) được gắn với mô hình ARMA cho thuật ngữ lỗi. Vì vậy, nếu bạn thực sự cần phải phù hợp với các chức năng chuyển giao thì có vẻ như TSA::arimaxchức năng là cách để đi vào R.
Christoffer

8

Tôi đã sử dụng R để thực hiện dự báo tải trong một thời gian và tôi có thể đề nghị bạn sử dụng forecastgói và các chức năng vô giá của nó (như auto.arima).

Bạn có thể xây dựng mô hình ARIMA bằng lệnh sau:

model = arima(y, order, xreg = exogenous_data)

với ydự đoán của bạn (tôi cho là dayy), orderthứ tự mô hình của bạn (xem xét tính thời vụ) và exogenous_datanhiệt độ, bức xạ mặt trời, v.v ... Chức năng auto.arimanày giúp bạn tìm ra thứ tự mô hình tối ưu. Bạn có thể tìm thấy một hướng dẫn ngắn gọn về gói 'dự báo' ở đây .


Những gì được dự đoán là nhiệt (mức tiêu thụ nhiệt của ngôi nhà).
utdiscant

3

Cá nhân tôi không hiểu chức năng chuyển, nhưng tôi nghĩ rằng bạn đã nhận xtransfxregđảo ngược. Ít nhất trong cơ sở của R, arimaxregchứa các biến ngoại sinh của bạn. Tôi ấn tượng rằng một hàm truyền mô tả cách thức (dữ liệu bị trễ ảnh hưởng đến các giá trị trong tương lai) chứ không phải là .

Tôi sẽ thử sử dụng xregcho các biến ngoại sinh của bạn, có lẽ sử dụng arimanếu arimaxcần một hàm truyền. Vấn đề là mô hình của bạn là hàng ngày, nhưng dữ liệu của bạn có cả tính thời vụ hàng ngày và hàng năm và tôi không chắc chắn ngay bây giờ nếu một sự khác biệt đầu tiên (cái order=(*, 1, *)) sẽ quan tâm đến điều đó hay không. (Bạn chắc chắn sẽ không nhận được dự báo quanh năm kỳ diệu từ một mô hình chỉ xem xét tính thời vụ hàng ngày.)

PS timemà bạn sử dụng trong của bạn là lmgì? Đồng hồ thời gian theo nghĩa đen hoặc số quan sát 1-up? Tôi nghĩ rằng bạn có thể nhận được một cái gì đó bằng cách sử dụng một mô hình hiệu ứng hỗn hợp ( lmertrong lme4gói), mặc dù tôi đã không biết liệu việc đó có giải thích chính xác cho sự tự tương quan sẽ xảy ra trong một chuỗi thời gian hay không. Nếu không được tính đến, điều lmnày không có, bạn có thể có một sự phù hợp thú vị, nhưng khái niệm của bạn về mức độ chính xác của dự đoán của bạn sẽ quá lạc quan.


Tôi có cả giờ đo và "ngày trong năm" của phép đo.
utdiscant
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.