ARIMA 개입 전달 기능-효과를 시각화하는 방법


11

저는 매월 시계열이 개입되어 있고이 개입이 결과에 미치는 영향을 수량화하고 싶습니다. 나는 시리즈가 다소 짧고 효과가 아직 끝나지 않았다는 것을 알고 있습니다.

자료

cds <- structure(c(2580L, 2263L, 3679L, 3461L, 3645L, 3716L, 3955L, 3362L,
                   2637L, 2524L, 2084L, 2031L, 2256L, 2401L, 3253L, 2881L,
                   2555L, 2585L, 3015L, 2608L, 3676L, 5763L, 4626L, 3848L,
                   4523L, 4186L, 4070L, 4000L, 3498L),
                 .Dim=c(29L, 1L),
                 .Dimnames=list(NULL, "CD"),
                 .Tsp=c(2012, 2014.33333333333, 12), class="ts")

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

방법론

1) 사전 중재 시리즈 (2013 년 10 월까지)가이 auto.arima기능 과 함께 사용되었습니다 . 제안 된 모델은 평균이 0이 아닌 ARIMA (1,0,0)입니다. ACF 줄거리는 좋아 보였다.

pre <- window(cds, start=c(2012, 01), end=c(2013, 09))

mod.pre <- auto.arima(log(pre))

# Coefficients:
#          ar1  intercept
#       0.5821     7.9652
# s.e.  0.1763     0.0810
# 
# sigma^2 estimated as 0.02709:  log likelihood=7.89
# AIC=-9.77   AICc=-8.36   BIC=-6.64

2) 전체 계열의 플롯을 감안할 때 펄스 응답은 T = 2013 년 10 월로 아래에서 선택되었습니다.

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

cryer와 chan에 따르면 arimax 기능으로 다음과 같이 맞출 수 있습니다.

mod.arimax <- arimax(log(cds), order=c(1, 0, 0),
                     seasonal=list(order=c(0, 0, 0), frequency=12),
                     include.mean=TRUE,
                     xtransf=data.frame(Oct13=1 * (seq(cds) == 22)),
                     transfer=list(c(1, 1)))
mod.arimax

# Series: log(cds) 
# ARIMA(1,0,0) with non-zero mean 
# 
# Coefficients:
#          ar1  intercept  Oct13-AR1  Oct13-MA0  Oct13-MA1
#       0.7619     8.0345    -0.4429     0.4261     0.3567
# s.e.  0.1206     0.1090     0.3993     0.1340     0.1557
# 
# sigma^2 estimated as 0.02289:  log likelihood=12.71
# AIC=-15.42   AICc=-11.61   BIC=-7.22

이것의 잔차가 정상으로 나타났습니다.

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

적합치 및 실제도 :

plot(fitted(mod.arimax), col="red", type="b")
lines(window(log(cds), start=c(2012, 02)), type="b")

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

질문들

1)이 방법론이 개입 분석에 올바른가?

2) 전달 함수의 구성 요소에 대한 추정치 / SE를보고 개입의 영향이 크다고 말할 수 있습니까?

3) 전달 함수 효과를 시각화하는 방법은 무엇입니까?

4) 'x'개월 후 개입이 산출량을 얼마나 증가 시켰는지 추정 할 수있는 방법이 있습니까? 나는 이것을 (그리고 아마도 # 3) 모델 방정식으로 작업하는 방법을 묻고 있습니다. 이것이 더미 변수를 가진 간단한 선형 회귀라면 (예를 들어) 개입과 함께 또는 간섭없이 시나리오를 실행하고 영향을 측정 할 수 있습니다- 그러나이 유형의 모델을 작동시키는 방법을 잘 모르겠습니다.

더하다

요청에 따라 두 매개 변수의 잔차가 있습니다.

먼저 적합에서 :

fit <- arimax(log(cds), order=c(1, 0, 0),
              xtransf=
              data.frame(Oct13a=1 * (seq_along(cds) == 22),
                         Oct13b=1 * (seq_along(cds) == 22)),
              transfer=list(c(0, 0), c(1, 0)))

plot(resid(fit), type="b")

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

그런 다음이 적합에서

mod.arimax <- arimax(log(cds), order=c(1, 0, 0),
                     seasonal=list(order=c(0, 0, 0), frequency=12),
                     include.mean=TRUE,
                     xtransf=data.frame(Oct13=1 * (seq(cds) == 22)),
                     transfer=list(c(1, 1))) 

mod.arimax
plot(resid(mod.arimax), type="b")

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


SAS 소프트웨어를 사용하여 솔루션을 제공해도 괜찮습니까?
예측 자

물론 더 나은 모델을 생각해 내면 궁금 할 것입니다.
B_Miner

좋습니다.이 모델은 원래 제안 된 것보다 약간 좋지만 @javlacalle과 비슷합니다.
예측 자

답변:


12

문제에 주어진 방정식에 정의 된 중재를 가진 AR (1) 모델은 아래와 같이 적합 할 수 있습니다. 인수 transfer가 어떻게 정의 되는지 주목하십시오 . 또한 xtransf각 개입 (펄스 및 일시적 변화)에 대해 하나의 지표 변수가 필요합니다 .

require(TSA)
cds <- structure(c(2580L, 2263L, 3679L, 3461L, 3645L, 3716L, 3955L, 3362L,
                   2637L, 2524L, 2084L, 2031L, 2256L, 2401L, 3253L, 2881L,
                   2555L, 2585L, 3015L, 2608L, 3676L, 5763L, 4626L, 3848L,
                   4523L, 4186L, 4070L, 4000L, 3498L),
                 .Dim = c(29L, 1L),
                 .Dimnames = list(NULL, "CD"),
                 .Tsp = c(2012, 2014.33333333333, 12),
                 class = "ts")

fit <- arimax(log(cds), order = c(1, 0, 0), 
              xtransf = data.frame(Oct13a = 1 * (seq_along(cds) == 22), 
                                   Oct13b = 1 * (seq_along(cds) == 22)),
              transfer = list(c(0, 0), c(1, 0)))
fit
# Coefficients:
#          ar1  intercept  Oct13a-MA0  Oct13b-AR1  Oct13b-MA0
#       0.5599     7.9643      0.1251      0.9231      0.4332
# s.e.  0.1563     0.0684      0.1911      0.1146      0.2168
# sigma^2 estimated as 0.02131:  log likelihood = 14.47,  aic = -18.94

ω0ω1coeftest

require(lmtest)
coeftest(fit)
#            Estimate Std. Error  z value  Pr(>|z|)    
# ar1        0.559855   0.156334   3.5811 0.0003421 ***
# intercept  7.964324   0.068369 116.4896 < 2.2e-16 ***
# Oct13a-MA0 0.125059   0.191067   0.6545 0.5127720    
# Oct13b-AR1 0.923112   0.114581   8.0564 7.858e-16 ***
# Oct13b-MA0 0.433213   0.216835   1.9979 0.0457281 *  
# ---
# Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

5%

중재 효과는 다음과 같이 수량화 할 수 있습니다.

intv.effect <- 1 * (seq_along(cds) == 22)
intv.effect <- ts(
  intv.effect * 0.1251 + 
  filter(intv.effect, filter = 0.9231, method = "rec", sides = 1) * 0.4332)
intv.effect <- exp(intv.effect)
tsp(intv.effect) <- tsp(cds)

다음과 같이 개입의 영향을 플로팅 할 수 있습니다.

plot(100 * (intv.effect - 1), type = "h", main = "Total intervention effect")

총 중재 효과

ω21ω21

수치 적으로, 이들은 2013 년 10 월의 개입으로 인해 각 시점에서 측정 된 추정 증가량입니다.

window(100 * (intv.effect - 1), start = c(2013, 10))
#           Jan      Feb      Mar      Apr      May Jun Jul Aug Sep      Oct
# 2013                                                              74.76989
# 2014 40.60004 36.96366 33.69046 30.73844 28.07132                         
#           Nov      Dec
# 2013 49.16560 44.64838

75%

stats::arima0.9231

xreg <- cbind(
  I1 = 1 * (seq_along(cds) == 22), 
  I2 = filter(1 * (seq_along(cds) == 22), filter = 0.9231, method = "rec", 
              sides = 1))
arima(log(cds), order = c(1, 0, 0), xreg = xreg)
# Coefficients:
#          ar1  intercept      I1      I2
#       0.5598     7.9643  0.1251  0.4332
# s.e.  0.1562     0.0671  0.1563  0.1620
# sigma^2 estimated as 0.02131:  log likelihood = 14.47,  aic = -20.94

ω20.9231xregω2

이러한 개입은 패키지에 정의 된 AO (additive outlier) 및 TC (transitory change)와 동일합니다 tsoutliers. 이 패키지를 사용하여 @forecaster의 답변에 표시된대로 이러한 효과를 감지하거나 이전에 사용한 회귀자를 빌드 할 수 있습니다. 예를 들어이 경우

require(tsoutliers)
mo <- outliers(c("AO", "TC"), c(22, 22))
oe <- outliers.effects(mo, length(cds), delta = 0.9231)
arima(log(cds), order = c(1, 0, 0), xreg = oe)
# Coefficients:
#          ar1  intercept    AO22    TC22
#       0.5598     7.9643  0.1251  0.4332
# s.e.  0.1562     0.0671  0.1563  0.1620
# sigma^2 estimated as 0.02131:  log likelihood=14.47
# AIC=-20.94   AICc=-18.33   BIC=-14.1

편집 1

나는 당신이 준 방정식이 다음과 같이 다시 쓰여질 수 있음을 보았습니다.

(ω0+ω1)ω0ω2B1ω2BPt

그리고 당신이 사용했던 것처럼 지정할 수 있습니다 transfer=list(c(1, 1)).

아래에 표시된 것처럼이 매개 변수화는이 경우 이전 매개 변수화와 다른 효과가 포함 된 매개 변수 추정값으로 이어집니다. 그것은 맥박과 일시적인 변화가 아닌 혁신적인 이상치의 효과를 상기시킵니다.

fit2 <- arimax(log(cds), order=c(1, 0, 0), include.mean = TRUE, 
  xtransf=data.frame(Oct13 = 1 * (seq(cds) == 22)), transfer = list(c(1, 1)))
fit2
# ARIMA(1,0,0) with non-zero mean 
# Coefficients:
#          ar1  intercept  Oct13-AR1  Oct13-MA0  Oct13-MA1
#       0.7619     8.0345    -0.4429     0.4261     0.3567
# s.e.  0.1206     0.1090     0.3993     0.1340     0.1557
# sigma^2 estimated as 0.02289:  log likelihood=12.71
# AIC=-15.42   AICc=-11.61   BIC=-7.22

패키지 표기법에 익숙 TSA하지는 않지만 이제 개입의 효과를 다음과 같이 수량화 할 수 있다고 생각합니다.

intv.effect <- 1 * (seq_along(cds) == 22)
intv.effect <- ts(intv.effect * 0.4261 + 
  filter(intv.effect, filter = -0.4429, method = "rec", sides = 1) * 0.3567)
tsp(intv.effect) <- tsp(cds)
window(100 * (exp(intv.effect) - 1), start = c(2013, 10))
#              Jan         Feb         Mar         Apr         May Jun Jul Aug
# 2014  -3.0514633   1.3820052  -0.6060551   0.2696013  -0.1191747            
#      Sep         Oct         Nov         Dec
# 2013     118.7588947 -14.6135216   7.2476455

plot(100 * (exp(intv.effect) - 1), type = "h", 
  main = "Intervention effect (parameterization 2)")

중재 효과 매개 변수화 2

이 효과는 이제 2013 년 10 월의 급격한 증가와 반대 방향의 감소로 설명 할 수 있습니다. 그런 다음 중재의 효과는 부패 무게의 긍정적이고 부정적인 영향을 빠르게 번갈아 사라집니다.

이 효과는 다소 독특하지만 실제 데이터에서 가능할 수 있습니다. 이 시점에서 데이터 컨텍스트와 데이터에 영향을 줄 수있는 이벤트를 살펴 보겠습니다. 예를 들어, 2013 년 10 월에 개입을 설명 할 수있는 정책 변경, 마케팅 캠페인, 발견 등이 있었습니까? 그렇다면이 이벤트가 이전에 또는 발견 한 데이터에 영향을 미치는 것이 더 합리적입니까 초기 매개 변수화?

18.9415.42

0.9

편집 2

ω2ω2

omegas <- seq(0.5, 1, by = 0.01)
aics <- rep(NA, length(omegas))
for (i in seq(along = omegas)) {
  tc <- filter(1 * (seq_along(cds) == 22), filter = omegas[i], method = "rec", 
               sides = 1)
  tc <- ts(tc, start = start(cds), frequency = frequency(cds))
  fit <- arima(log(cds), order = c(1, 0, 0), xreg = tc)
  aics[i] <- AIC(fit)
}
omegas[which.min(aics)]
# [1] 0.88

plot(omegas, aics, main = "AIC for different values of the TC parameter")

오메가의 다른 가치를위한 AIC

ω2=0.880.9ω2=1

ω2=0.9

ω2=0.9

tc <- filter(1 * (seq.int(length(cds) + 12) == 22), filter = 0.9, method = "rec", 
             sides = 1)
tc <- ts(tc, start = start(cds), frequency = frequency(cds))
fit <- arima(window(log(cds), end = c(2013, 10)), order = c(1, 0, 0), 
             xreg = window(tc, end = c(2013, 10)))

예측은 다음과 같이 획득하고 표시 할 수 있습니다.

p <- predict(fit, n.ahead = 19, newxreg = window(tc, start = c(2013, 11)))

plot(cbind(window(cds, end = c(2013, 10)), exp(p$pred)), plot.type = "single", 
     ylab = "", type = "n")
lines(window(cds, end = c(2013, 10)), type = "b")
lines(window(cds, start = c(2013, 10)), col = "gray", lty = 2, type = "b")
lines(exp(p$pred), type = "b", col = "blue")
legend("topleft",
       legend = c("observed before the intervention",
           "observed after the intervention", "forecasts"),
       lty = rep(1, 3), col = c("black", "gray", "blue"), bty = "n")

관찰 및 예측 된 값

첫 번째 예측은 관찰 된 값 (회색 점선)과 비교적 잘 일치합니다. 나머지 예측은 계열이 원래 평균에 대한 경로를 어떻게 유지하는지 보여줍니다. 그럼에도 불구하고 불확실성을 반영하여 신뢰 구간이 큽니다. 따라서 새로운 데이터가 기록 될 때주의를 기울이고 모델을 수정해야합니다.

95%

lines(exp(p$pred + 1.96 * p$se), lty = 2, col = "red")
lines(exp(p$pred - 1.96 * p$se), lty = 2, col = "red")

대단합니다, 감사합니다! 마음에 들지 않으면 몇 가지 후속 조치를 받았습니다. 1) 내가 따라온 과정이 정확합니까? 2) 추정값을 사용하여 개입의 영향을 정량화하기 위해 모형의 적합도를 "충분히 잘"고려할 것입니까? 3) 매개 변수, 즉 transfer = list (c (1,1))를 동등한 것으로 사용할 수 없어야하며 가까운 결과를 얻을 수 있습니까? 내가 교과서에서
따랐던

@B_Miner 내 대답을 편집 한 것이 맞습니다.
javlacalle

나는 두 모델 중 첫 번째 매개 변수 (아마도 중요하지 않은 펄스가 제거 된 경우)가 가장 적합하다는 데 동의합니다. 내가 생각할 때 두 매개 변수화가 동일한 모델을 산출하지 않는 이유는 미스터리입니다. 패키지 개발자 (동등성을 언급하는 책을 썼음)에게 이메일을 보내겠습니다.
B_Miner

데이터는 한 달에 개설 된 예금 증서 수입니다. 개입은 10 월 13 일부터 급상승 한 평균 이자율 상승이었다. 이자율 수준은 10 월 13 일 이후로 비교적 일정하게 유지되었다. 그것이 이전의 평균으로 돌아갈 지 또는 어느 정도 높은 (이전의) 수준으로 정착할지 확실하지 않습니다.
B_Miner

B_miner는 수요가 새로운 평균에 도달하면 실제로 결론을 내릴 수없는 데이터를 기반으로합니다.
예측 자

4

때로는 더 적은 것이 더 많습니다. 30 건의 관찰 결과를 바탕으로 데이터를 개발하는 데 도움을 준 소프트웨어 인 AUTOBOX에 제출했습니다. 나는 +200 보상을 얻기 위해 다음과 같은 분석을 제출합니다. 나는 "최근 활동"의 영향을 시각적으로 제안하는 실제 값과 정화 된 값을 플로팅했습니다. 여기에 이미지 설명을 입력하십시오. 자동 개발 된 모델이 여기에 표시됩니다. 여기에 이미지 설명을 입력하십시오그리고 여기 여기에 이미지 설명을 입력하십시오. 이 단순한 레벨 시프트 시리즈의 잔차가 여기에 표시됩니다 여기에 이미지 설명을 입력하십시오. 모델 통계는 여기에 있습니다 여기에 이미지 설명을 입력하십시오. 요약하면 ARIMA 프로세스를 렌더링하여 경험적으로 식별 할 수있는 개입이있었습니다. 두 개의 펄스와 1 개의 레벨 시프트 여기에 이미지 설명을 입력하십시오. 실제 / 적합 및 예측 그래프는 분석을 더욱 강조 표시합니다.여기에 이미지 설명을 입력하십시오

나는 이전에 지정된 및 잠재적으로 지나치게 과도하게 지정된 모델의 잔차 그림을보고 싶습니다.


나는 Autobox에 익숙하지 않지만 모델의 노이즈 부분은 원래와 같은 것입니다 : 0이 아닌 평균과 AR (1)?
B_Miner

이 출력은 10 월 13 일부터 현재 시간까지의 유일한 "개입"이 10 월 13 일의 단일 펄스이고 계열이 정상 평균 레벨로 돌아 간다고 말하는가?
B_Miner

두 매개 변수의 잔차를 추가했습니다. 내 눈에, 내가 처음으로 나열 한 것 (원래 javlacalle에 맞는 것)이 더 나은 것 같습니다. 동의하다?
B_Miner

1) 잡음 부분은 평균이 0이 아닌 AR (1)입니다
IrishStat

1) 잡음 부분은 0이 아닌 평균을 갖는 AR (1)이다. 2) 중재 기간 22와 기간 3이 있으며, 10 월 13 일 이후에는 9 월 13 일에 시작된 새로운 수준으로 돌아 간다. 3) 언급 한 두 가지 중 하나를 선택하면 단순성과 효율성 때문에 AUTOBOX 모델을 선호합니다. AUTOBOX에 대한 자세한 내용은 autobox.com/cms에서 확인하십시오
IrishStat

3

R

코드는 다음과 같습니다.

cds<- structure(c(2580L, 2263L, 3679L, 3461L, 3645L, 3716L, 3955L, 
                  3362L, 2637L, 2524L, 2084L, 2031L, 2256L, 2401L, 3253L, 2881L, 
                  2555L, 2585L, 3015L, 2608L, 3676L, 5763L, 4626L, 3848L, 4523L, 
                  4186L, 4070L, 4000L, 3498L), .Dim = c(29L, 1L), .Dimnames = list(
                    NULL, "CD"), .Tsp = c(2012, 2014.33333333333, 12), class = "ts")
arimatr <- tsoutliers::tso(cds,args.tsmethod=list(d=0,D=0))
plot(arimatr)
arimatr

아래는 추정치이며, 2013 년 10 월 ~ 481.8의 표준 오차로 ~ 2356.3의 단위 증가가 있었으며 그 후에 붕괴 효과가 있습니다. 이 함수는 AR (1)을 자동으로 식별했습니다. 나는 몇 번의 반복을 수행하고 계절 및 비 계절 차를 0으로 만들어야했는데, 이는 tso 함수의 args.ts 메소드에 반영됩니다.

Series: cds 
ARIMA(1,0,0) with non-zero mean 

Coefficients:
         ar1  intercept       TC22
      0.5969  3034.6560  2356.2914
s.e.  0.1495   206.5202   481.7981

sigma^2 estimated as 209494:  log likelihood=-219.03
AIC=446.06   AICc=447.73   BIC=451.53

Outliers:
  type ind    time coefhat tstat
1   TC  22 2013:10    2356 4.891

아래는 플롯이며 tsoutlier는 임시 변경 사항을 플롯으로 멋지게 인쇄 할 수있는 유일한 패키지입니다.

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

이 분석 은 다른 방법론을 사용하더라도 2, 34 질문에 대한 답변을 희망적으로 제공 했습니다. 특히 줄거리와 계수는이 개입의 효과와이 개입이 없다면 어떻게 되었을까요?

또한 다른 사람이 R의 전달 함수 모델링을 사용 하여이 플롯 / 분석을 복제 할 수 있기를 바라고 있습니다 .R 에서이 작업을 수행 할 수 있는지 확실하지 않습니다. 다른 사람이 실제로 이것을 확인할 수 있습니다.


감사. 예,이 줄거리는 내가 arimax 모델에서하고 싶은 것입니다 – 개입 여부와 상관없이 살펴보십시오. R의 필터 함수를 사용하여 매월 전달 함수 값을 생성하고 시각화하기 위해 플롯 할 수 있다고 생각하지만 임의의 펄스 개입 함수에 대해 수행하는 방법을 알 수는 없습니다.
B_Miner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.