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機能とともに使用されました。提案されたモデルは、平均がゼロでない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

これからの残差はOKのように見えました:

ここに画像の説明を入力してください

フィッティングと実績のプロット:

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)モデルの方程式を操作する方法を尋ねています-これがダミー変数を使用した単純な線形回帰であれば(たとえば)、介入ありとなしのシナリオを実行して影響を測定できます-しかし、私はこのタイプのモデルをどのように操作するかわからないだけです。

追加

要求ごとに、2つのパラメーター化からの残差を以下に示します。

まずはフィットから:

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 14

OK、モデルは最初に提案されたものより少し優れていますが、@ javlacalleに似ています。
予報士

回答:


12

質問で与えられた方程式で定義された介入を持つAR(1)モデルは、以下に示すように近似できます。引数のtransfer定義方法に注意してください。またxtransf、介入ごとに1 つのインジケーター変数が必要です(脈拍と一時的な変化)。

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

係数とのt統計を調べることにより、各介入の有意性をテストできます。便宜上、関数を使用できます。ω 1ω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)および一時的変化(TC)に相当します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

@B_Miner正解です。私の回答を編集しました。
javlacalle 14

2つのモデルのうち、最初のパラメーター化(おそらく重要でないパルスを削除したもの)が最適であることに同意します。2つのパラメーター化が同じモデルを生成しないのはなぜか、私がそうするべきだと私が信じるのは謎です。私はパッケージ開発者にメールを送ります(同等のものについて言及する本も書いています)。
B_Miner 2014

データは、毎月開設された預金証書の数です。介入は、平均金利の上昇であり、10月13日から急上昇しました。金利のレベルは、10月13日から比較的一定に保たれています。スパイク後、製品の需要は減少し始めたように見えます-それが以前の平均値に戻るのか、(以前の)ある高いレベルで落ち着くのかはわかりません。
B_Miner 2014

B_miner、需要が新しい平均に落ち着く場合、実際に結論付けることができないデータに基づいています。
予測者

4

時には少ない方がいいこともあります。30の観測を手に、データをAUTOBOXに提出しました。これは、私が開発を支援したソフトウェアの1つです。+200の報酬を獲得することを期待して、次の分析を提出します(冗談です!)。「最近の活動」の影響を視覚的に示唆する実際の値とクレンジングされた値をプロットしました。ここに画像の説明を入力してください。自動開発されたモデルはこちら。ここに画像の説明を入力してくださいそしてここここに画像の説明を入力してください。このかなり単純なレベルシフトされたシリーズの残差がここに表示されますここに画像の説明を入力してください。モデル統計はこちらここに画像の説明を入力してくださいです。要約すると、経験的に特定できる介入があり、それによりARIMAプロセスがレンダリングされました。2つのパルスと1つのレベルシフトここに画像の説明を入力してください。実際/適合および予測グラフは、分析をさらに強調します。ここに画像の説明を入力してください

私は、以前に指定された、そして私の意見では潜在的に過剰に指定されたモデルからの残差のプロットを見たいと思います。


私はオートボックスに慣れていませんが、モデルのノイズ部分は元々持っていたものと同じですか?非ゼロ平均とAR(1)?
B_Miner 2014

この出力は、10月13日から現在までの期間の唯一の「介入」が10月13日の単一パルスであり、その後シリーズが通常の平均レベルに戻ることを示していますか?
B_Miner 2014

両方のパラメーター化からの残差を追加しました。私の目には、最初にリストしたもの(元々はjavlacalleに適合したもの)の方が良いようです。同意する?
B_Miner 2014

1)ノイズ部分は、平均値がゼロでないAR(1)です
IrishStat 2014

1)ノイズ部分は、平均がゼロでないAR(1)です。2)2つの介入期間22と期間3があり、10月13日後に、9月13日に始まった新しいレベルに戻ります。3)あなたが言及した2つの中からの選択を考えると、私は同意しますが、そのシンプルさと効率性のためにAUTOBOXモデルを好みます。autobox.com/cmsからAUTOBOXの
IrishStat '24

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月に〜2356.3単位の増加があり、標準誤差は〜481.8で、その後は減衰効果があります。関数はAR(1)を自動的に識別しました。私は数回の反復を行い、季節性と非季節性の両方の差異を0にする必要がありました。これは、tso関数のargs.tsmethodに反映されています。

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、3、および4つの質問に対する回答を提供しました。特に、プロットと係数は、この介入の効果と、この介入がないとどうなるかを示しています。

また、他の誰かがRの伝達関数モデリングを使用してこのプロット/分析を複製できることを願っています。これがRで実行できるかどうかはわかりませんが、他の誰かが実際にこれを確認できるかもしれません。


ありがとう。ええ、このプロットは、アリマックスモデルから実行したいものです。Rのフィルター関数は各月の伝達関数値を生成するために使用できる(そしてそれを視覚化するために単にプロットする)と思いますが、任意のパルス介入関数に対してそれを行う方法を理解できません。
B_Miner 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.