2016-10-22 2 views
1

arima0()co2으로 작업 중입니다. 내 데이터 위에 arima0() 모델을 음모하고 싶습니다. fitted()curve()을 사용해 보았습니다.CO2 데이터 세트를 사용하여 ARIMA 모델링, 예측 및 플로팅 R

여기 내 코드입니다 : 준비 데이터와

###### Time Series 

# format: time series 
data(co2) 

# format: matrix 
dmn <- list(month.abb, unique(floor(time(co2)))) 
co2.m <- matrix(co2, 12, dimnames = dmn) 

co2.dt <- pracma::detrend(co2.m, tt = 'linear') 
co2.dt <- ts(as.numeric(co2.dt), start = c(1959,1), frequency=12) 

# first diff 
co2.dt.dif <- diff(co2.dt,lag = 12) 

# Second diff 
co2.dt.dif2 <- diff(co2.dt.dif,lag = 1) 

, 나는 다음과 같은 arima0을 실행 :

results <- arima0(co2.dt.dif2, order = c(2,0,0), method = "ML") 
resultspredict <- predict(results, n.ahead = 36) 

내가 모델과 예측을 음모하고 싶습니다. 나는베이스 R에서 이것을 할 수있는 방법이 있기를 바라고 있습니다. 또한 예측을 계획 할 수 있기를 바랍니다.

답변

1

세션 2 :이 세션을 종료하기 위해, 우리는 그 장착 값 co2 플롯 이전 세션에서 시계열 모델링

을위한 더 나은 아이디어를, 우리가 본 것 디 트렌드와 트렌드가없는 시리즈의 모델링을 분리하면 예측에 어려움이 있습니다. 이제 우리는이 두 단계를 한 번에 결합하려고합니다.

co2의 계절 패턴이 정말 강한, 그래서 우리는 어쨌든 계절 차분 필요 :이 계절 차분 후

data(co2) 
co2dt <- diff(co2, lag = 12) 
par(mfrow = c(1,2)); ts.plot(co2dt); acf(co2dt) 

enter image description here

co2dt는 고정 보이지 않는다. 따라서 비 계절별 차이가 더 필요합니다.

co2dt.dif <- diff(co2dt) 
par(mfrow = c(1,2)); ts.plot(co2dt.dif); acf(co2dt.dif) 

enter image description here

시즌 내 시즌 사이의 부정적인 스파이크는 석사 과정이 모두 필요하다는 것을 시사한다. 나는 co2dt.dif와 일하지 않을 것이다; 우리는 직접 co2 작업 할 수 있습니다 :

fit <- arima0(co2, order = c(0,1,1), seasonal = c(0,1,1)) 
acf(fit$residuals) 

enter image description here

지금 잔차가 완벽하게 상관입니다! 따라서 co2 시리즈의 모델은 ARIMA(0,1,1)(0,1,1)[12]입니다.

co2fitted <- co2 - fit$residuals 

예측이 predict에 하나의 호출에 의해 만들어진 :

co2pred <- predict(fit, n.ahead = 36, se.fit = FALSE) 

하는의이 함께 음모 보자

평소처럼


, 장착 값은 데이터에서 잔차를 뺀된다

ts.plot(co2, co2fitted, co2pred, col = 1:3) 

enter image description here

아, 이건 정말 멋지다!

2

세션 1 : 시작하기 ...

는 솔직히 말해서, 나는 모델링 co2 시계열에 당신의 방법에 대해 꽤 많이 걱정입니다. co2의 트렌드를 탈퇴했을 때 이미 문제가 발생했습니다. 왜 tt = "linear"을 사용해야하나요? 각 기간 (즉, 연도) 내에 선형 추세를 맞추고 추가 검사를 위해 잔차를 가져옵니다. 이는 잔여 계열에 인공 효과를 도입하는 경향이 있으므로 권장하지 않는 경우가 많습니다. 나는 tt = "constant"을 할 것입니다. 즉, 단순히 연평균을 버리는 것입니다. 이는 적어도 원본 데이터와 마찬가지로 시즌 간 상관 관계를 유지합니다.

아마도 여기에 몇 가지 증거를보고 싶을 것입니다. 진단에 도움이되는 ACF 사용을 고려하십시오.

enter image description here

모두 드 추세 시리즈

data(co2) 

## de-trend by dropping yearly average (no need to use `pracma::detrend`) 
yearlymean <- ave(co2, gl(39, 12), FUN = mean) 
co2dt <- co2 - yearlymean 

## de-trend by dropping within season linear trend 
co2.m <- matrix(co2, 12) 
co2.dt <- pracma::detrend(co2.m, tt = "linear") 
co2.dt <- ts(as.numeric(co2.dt), start = c(1959, 1), frequency = 12) 

## compare time series and ACF 
par(mfrow = c(2, 2)) 
ts.plot(co2dt); acf(co2dt) 
ts.plot(co2.dt); acf(co2.dt) 

따라서 추가로 계절 차분이 필요하며, 성수기 효과가 있습니다. co2.dt.dif에 대한 ACF

enter image description here

## seasonal differencing 
co2dt.dif <- diff(co2dt, lag = 12) 
co2.dt.dif <- diff(co2.dt, lag = 12) 

## compare time series and ACF 
par(mfrow = c(2, 2)) 
ts.plot(co2dt.dif); acf(co2dt.dif) 
ts.plot(co2.dt.dif); acf(co2.dt.dif) 

더 큰 음의 상관 관계를 가지고있다. 이것은 over-de-trending의 표시입니다. 그래서 우리는 co2dt을 선호합니다. co2dt은 이미 고정되어 있으며 더 이상 차이점이 필요하지 않습니다 (그렇지 않은 경우 차이가 너무 많아지고 부정적인 자기 상관 관계가 도입됩니다).

co2dt.dif의 ACF에 대한 지연 1에서의 큰 음수 스파이크는 계절적 MA를 원한다고 제안합니다. 또한 계절에 긍정적 인 영향을 미친다는 것은 전반적으로 가벼운 AR 과정을 의미합니다. 그래서 생각이 모델은 잘하고있다

## we exclude mean because we found estimation of mean is 0 if we include it 
fit <- arima0(co2dt.dif, order = c(1,0,0), seasonal = c(0,0,1), include.mean = FALSE) 

이든, 우리는 잔차의 ACF를 검사해야합니다

acf(fit$residuals) 

enter image description here

가 보이는이 모델은 (실제로 꽤 큰) 괜찮은처럼.

예측 목적으로 co2dt의 계절별 차이를 co2dt.dif의 모델 피팅과 통합하는 것이 더 좋습니다.의이 두 단계의 작업을 위와 같이 AR과 MA 계수 정확히 같은 추정을 줄 것이다,하지만 지금은 예측이 상당히 하나의 predict 호출 처리되어야하기 쉬운

fit <- arima0(co2dt, order = c(1,0,0), seasonal = c(0,1,1), include.mean = FALSE) 

을하자.

## 3 years' ahead prediction (no prediction error; only mean) 
predco2dt <- predict(fit, n.ahead = 36, se.fit = FALSE) 

하자 플롯 co2dt 함께 모델과 예측을 장착는 :

fittedco2dt <- co2dt - fit$residuals 
ts.plot(co2dt, fittedco2dt, predco2dt, col = 1:3) 

enter image description here

결과는 매우 유망한 보인다!

이제 최종 단계는 실제로 원래 co2 시리즈로 다시 매핑하는 것입니다. 장착 값의 경우, 우리가 연간 평균 다시 추가 우리가 내려왔다 :

fittedco2 <- fittedco2dt + yearlymean 

그러나 우리는 미래가 될 것에서 매년 무엇을 의미하는지 알 수 없기 때문에 예측이 더 어렵다. 이와 관련하여 우리의 모델링은 훌륭하게 보이지만 실제적으로 유용하지는 않습니다. 나는 다른 대답에서 더 좋은 아이디어에 대해서 이야기 할 것이다.

ts.plot(co2, fittedco2, col = 1:2) 

enter image description here

1

세션 3 : 이야기는 지금까지 완료해야

모델 선택; 그러나 auto.arima (forecast)과 비교하여 "가장 좋은"모델을 자동으로 결정할 수 있습니다.

library(forecast) 
autofit <- auto.arima(co2) 

#Series: co2 
#ARIMA(1,1,1)(1,1,2)[12]      
# 
#Coefficients: 
#   ar1  ma1  sar1  sma1  sma2 
#  0.2569 -0.5847 -0.5489 -0.2620 -0.5123 
#s.e. 0.1406 0.1204 0.5880 0.5701 0.4819 
# 
#sigma^2 estimated as 0.08576: log likelihood=-84.39 
#AIC=180.78 AICc=180.97 BIC=205.5 

auto.arima

은 계절 차분 및 비 계절 차분을 모두 포함으로 훨씬 더 복잡하다, ARIMA(1,1,1)(1,1,2)[12]을 선택했다. 단계별 조사를 기반으로

우리의 모델은 ARIMA(0,1,1)(0,1,1)[12] 제안 :

fit <- arima0(co2, order = c(0,1,1), seasonal = c(0,1,1)) 

#Call: 
#arima0(x = co2, order = c(0, 1, 1), seasonal = c(0, 1, 1)) 
# 
#Coefficients: 
#  ma1  sma1 
# -0.3495 -0.8515 
#s.e. 0.0497 0.0254 
# 
#sigma^2 estimated as 0.08262: log likelihood = -85.98, aic = 177.96 

AIC 값이 우리의 모델이 더 좋습니다. 그래서 BIC는 않습니다 : 우리는 n <- length(co2) 데이터 및 p <- length(fit$coef) + 1 매개 변수 (sigma2에 대한 추가 하나)가

BIC = -2 * loglik + log(n) * p 

, 따라서 우리의 모델은 BIC

-2 * fit$loglik + log(n) * p 
# [1] 196.5503 

그래서, auto.arima 오버 장착 한 데이터가 있습니다.

실제로 우리가 ARIMA(1,1,1)(1,1,2)[12]을 보는 즉시, 우리는 과도한 피팅에 대해 강한 의혹을 가지고 있습니다. 서로 다른 효과가 서로 "취소"하기 때문입니다. MA가 음수를 도입하는 동안 AR은 양의 자기 상관을 도입하기 때문에 이것은 계절성 MA와 비 계절 AR에 대해 auto.arima에 의해 도입됩니다.