R과 함께 ARIMAX 모델을 맞추는 방법?


33

시간별 측정에는 4 가지 시계열이 있습니다.

  1. 집안의 열 소비
  2. 집 밖 온도
  3. 태양 복사
  4. 풍속

집안의 열 소비량을 예측할 수 있기를 원합니다. 매년 계절과 계절에 따라 뚜렷한 계절 경향이 있습니다. 다른 계열간에 명확한 상관 관계가 있기 때문에 ARIMAX 모델을 사용하여 적합하게 만들고 싶습니다. 패키지 TSA의 arimax 함수를 사용하여 R에서 수행 할 수 있습니다.

이 함수에 대한 문서를 읽고 전송 함수를 읽으려고했지만 지금까지 내 코드는 다음과 같습니다.

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)

나에게 준다 : 여기에 이미지 설명을 입력하십시오

여기서 검은 선은 실제 측정 된 데이터이고 녹색 선은 내 적합 모델입니다. 좋은 모델 일뿐만 아니라 무언가 잘못된 것이 분명합니다.

ARIMAX 모델 및 전달 기능에 대한 지식이 제한적임을 인정합니다. arimax () 함수에서 (내가 이해 한 한) xtransf는 기본 시계열을 예측하기 위해 (전달 함수를 사용하여) 사용하려는 외생 시계열입니다. 그러나 xreg와 xtransf의 차이점은 무엇입니까?

더 일반적으로, 내가 잘못한 것은 무엇입니까? lm (heat ~ temp radi wind * time) 에서 얻은 것보다 더 잘 맞고 싶습니다 .

편집 : 일부 의견에 따라 전송을 제거하고 대신 xreg를 추가했습니다.

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)

여기서 dayy는 "연중 숫자 일"이고 시간은 하루 중 시간입니다. 온도는 다시 외부 온도입니다. 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

어느 것이 더 좋지만, 내가 기대했던 것과는 거의 다릅니다.

답변:


34

ARIMA 모델을 사용하여 계절별 2 단계로 시리즈를 모델링하는 데 약간의 어려움이 있습니다. 이 권리를 얻는 것은 올바르게 설정하는 데 크게 의존합니다. 간단한 선형 모델을 아직 고려하지 않았습니까? ARIMA 모델보다 훨씬 빠르고 적합하며 다른 계절 수준에 더미 변수를 사용하면 종종 매우 정확합니다.

  1. 시간별 데이터가 있다고 가정하므로 TS 개체가 24의 빈도로 설정되어 있는지 확인하십시오.
  2. 더미 변수를 사용하여 다른 수준의 계절성을 모델링 할 수 있습니다. 예를 들어, 연도를 나타내는 0/1 인형 세트를 원할 수 있습니다.
  3. xreg온도와 같은 공변량과 함께 더미 변수를 인수 에 포함시킵니다 .
  4. 기본 R의 arima 함수를 사용하여 모델을 적합시킵니다.이 함수는 xreg인수를 사용하여 ARMAX 모델을 처리 할 수 ​​있습니다 .
  5. 예측 패키지에서 Arimaauto.arima 함수를 사용해보십시오 . auto.arima는 arima 모델에 적합한 매개 변수를 자동으로 찾기 때문에 좋습니다. 그러나 데이터 집합에 적합하려면 영원히 필요합니다.
  6. 각 계절 수준에 더미 변수를 사용하여 arima 패키지에서 tslm 함수를 사용해보십시오. 이것은 Arima 모델보다 훨씬 빠르며 상황에 따라 더 잘 작동 할 수도 있습니다.
  7. 4/5/6이 작동하지 않으면 전송 기능에 대해 걱정하기 시작합니다. 걸 으려면 크롤링해야합니다.
  8. 미래를 예측할 계획이라면 먼저 xreg 변수를 예측해야합니다. 이것은 계절의 인형에게는 쉽지만 좋은 일기 예보를 만드는 방법에 대해 생각해야합니다. 과거 데이터의 중간 값을 사용할 수 있습니까?

다음은 내가 어떻게 접근하는지에 대한 예입니다.

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

fit () 함수는 무엇입니까? 그것을 사용하면 predict (model10, newxreg = regParams)보다 더 나은 결과를 얻습니다.
utdiscant

@utdiscant : predict()는 예측에 사용되는 반면 fitted(), 역사적 기간 동안 모형 적합 을 반환합니다. 보다 구체적인 도움이 필요하면 코드를 사용하여 재현 가능한 예제를 게시해야합니다.
Zach

@utdiscant : 또한 dayy를 xreg로 사용하는 경우 하루 24 개의 관측치 만 있으므로 과적 합의 위험이 있습니다. 한 달을 사용하면 더 나은 예측 결과를 얻을 수 있습니다.
Zach

@utdiscant : 또한 시간 기반 xreg는 더미 변수 여야 합니다 . 지금 모델링 한 방법은 heat시간에 따라 선형으로 증가한 다음 시간이 1로 돌아 오면 다시 아래로 건너 뛰는 것입니다. 더미 변수를 사용하면 하루 중 각 시간에 고유 한 효과가 나타납니다. 예제 코드를 살펴보고 xreg 객체를 구성하는 방법에주의를 기울이십시오.
Zach

statsforecast패키지 의 ARIMA 기능의 한 가지 단점은 프로 버 전송 기능에 맞지 않는다는 것입니다. stats::arima함수 의 문서화 상태는 다음과 같습니다. xreg 항이 포함 된 경우 선형 회귀 (include.mean이 true이고 차이가없는 경우 상수 항이 있음)에 오류 항에 대한 ARMA 모델이 적용됩니다. 따라서 실제로 전달 함수를 맞출 필요가 있다면 TSA::arimax함수가 들어가는 것처럼 보입니다 R.
Christoffer

8

나는 R을 사용하여 잠시 동안로드 예측을 수행했으며 forecast패키지와 그 소중한 기능 (예 :) 을 사용하도록 제안 할 수 있습니다 auto.arima.

다음 명령을 사용하여 ARIMA 모델을 구축 할 수 있습니다.

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

함께 y귀하의 predictand (내 생각 dayy), order모델 (고려 계절) 및 순서 exogenous_data등 기능 체온, 태양 방사선은, auto.arima당신이 최적의 모델 순서를 찾는 데 도움이됩니다. `forecast '패키지에 대한 간단한 튜토리얼을 여기에서 찾을 수 있습니다 .


예상되는 것은 열 (집의 열 소비)입니다.
utdiscant

3

나는 개인적으로 전송 기능을 이해하지 않는,하지만 난 당신이있어 생각 xtransfxreg반전. R의베이스 적어도 arima그 것이다 xreg즉 당신의 외생 변수가 포함되어 있습니다. 전송 함수는 지연된 데이터가 what 보다는 미래의 값에 영향을 미치는 방식을 설명한다는 인상을 받았습니다 .

내가 사용하려고 할 것 xreg아마 사용하여 외생 변수의 arima경우 arimax전달 함수를 요구한다. 문제는 모델이 매일이지만 데이터에 일일 및 연간 계절성이 있으며 첫 번째 차이 ( order=(*, 1, *))가 처리 되는지 여부는 확실 하지 않습니다. (일일 계절성 만 고려한 모델에서 연중 내내 놀라운 예측을 얻을 수는 없습니다.)

추신 당신이 무엇 time을 사용 lm합니까? 문자 클럭 시간 또는 1- 업 관측치? 나는 당신이 (혼합 효과 모델을 사용하여 뭔가를 얻을 수 있다고 생각 lmer에서 lme4내가 그 일을하는 것은 제대로 시계열에 발생합니다 자기 상관을 차지하고 여부를 파악하지 않은 있지만, 패키지). 설명 lm하지 않으면 어느 것이 맞지 않더라도 흥미로운 결과를 얻을 수 있지만 예측이 얼마나 정확한지에 대한 개념은 너무 낙관적입니다.


측정 시간과 측정의 "일"이 모두 있습니다.
utdiscant
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.