VAR 在 Stata 中的模擬、估計和推斷

Source: Ashish RajbhandariVector autoregression—simulation, estimation, and inference in Stata

VAR 是分析多維時間序列動態變化的利器,該模型設定由一組時間序列組成的序列是其自己滯後項的函數。

1. 模擬

首先使用如下設定模擬雙變量 VAR(2) :

其中 y1,ty_{ 1,t } 是在時間 tt 的觀測變量,μ\mu 是一個 2×12\times 1 的截距項向量, A1A_1A2A_2 均爲 2×22\times 2 的參數矩陣,ϵt\epsilon _{ t } 是不與時間相關的擾動項。我假設 ϵt\epsilon _{ t } 服從分佈 N(0,Σ)N(0,\Sigma) ,其中Σ\Sigma 是一個 2×22\times 2 的協方差矩陣。

設定樣本量爲 1000 ,並在 Stata 中生成需要的變量:

 clear all

. set seed 2016

. local T = 1100

. set obs `T'
number of observations (_N) was 0, now 1,100

. gen time = _n

. tsset time
        time variable:  time, 1 to 1100
                delta:  1 unit

. generate y1 = .
(1,100 missing values generated)

. generate y2 = .
(1,100 missing values generated)

. generate eps1 = .
(1,100 missing values generated)

. generate eps2 = .
(1,100 missing values generated)

在第 1-6 行,我設定了隨機種子,將樣本量設爲 1000,並且生成了一個時間變量 time 。接下來,我生成了變量 y1y2eps1eps2 來存放觀測序列和擾動項。

2. 設定係數值

我爲本文的 VAR(2) 模型選擇瞭如下的參數值:

. mata:
------------------------------------------------- mata (type end to exit) -----
: mu = (0.1\0.4)

: A1 = (0.6,-0.3\0.4,0.2)

: A2 = (0.2,0.3\-0.1,0.1)

: Sigma = (1,0.5\0.5,1)

: end
-------------------------------------------------------------------------------

在 Mata 中,我分別創建了矩陣 μ\muA1A_1A2A_2Σ\Sigma 來放置參數值。在模擬得到樣本之前,我檢查了由這些參數值是否會得到一個平穩的 VAR(2) 模型。令:

其中 I2I_22×22\times 2 的識別矩陣,00 是一個每個元素均爲 0 的 2×22\times 2 矩陣。如果矩陣 F 的所有特徵根均小於 1 ,則此 VAR(2) 過程即爲一個平穩過程。下面放上計算特徵根的代碼:

. mata:
------------------------------------------------- mata (type end to exit) -----
: K = p = 2               // K = number of variables; p = number of lags

: F = J(K*p,K*p,0)

: F[1..2,1..2] = A1

: F[1..2,3..4] = A2

: F[3..4,1..2] = I(K)

: X = L = .

: eigensystem(F,X,L)

: L'
                              1
    +----------------------------+
  1 |                .858715598  |
  2 |  -.217760515 + .32727213i  |
  3 |  -.217760515 - .32727213i  |
  4 |                .376805431  |
    +----------------------------+

: end
------------------------------------------------------------------------------

我根據之前的設定創建了矩陣 F 並使用函數 eigensystem( ) 計算其特徵根。 矩陣 X 中存儲了特徵向量,L 中保存特徵根。所有 L 中的特徵根均小於 1 ,因此該 VAR(2) 過程是平穩的。在檢驗過是否平穩之後,接下來生成 VAR(2) 模型的擾動項。

3. 由多維正態分佈中生成擾動項

我從分佈 N(0,Σ)N(0,\Sigma) 中生成兩個隨機正態變量,並將它們分別賦值給變量 eps1eps2

. mata:
------------------------------------------------- mata (type end to exit) -----
: T = strtoreal(st_local("T"))

: u = rnormal(T,2,0,1)*cholesky(Sigma)

: epsmat = .

: st_view(epsmat,.,"eps1 eps2")

: epsmat[1..T,.] = u

: end
-------------------------------------------------------------------------------

我將樣本規模(在 Stata 中定義爲一個局部宏變量 T )賦值給一個 Mata 數值變量,這步將可以簡化之後的工作。在 Mata 中,我使用了兩個函數:st_local( )strtoreal( ) 來存儲樣本大小。第一個函數可以從 Stata 宏中獲取文本值,第二個函數則可以將文本值轉變爲實數值。

第二行生成了一個 1100×21100\times 2 的正態擾動項矩陣,其每個元素都服從分佈 N(0,Σ)N(0,\Sigma) 。我使用函數 st_view( ) 將生成的正態擾動項存放到變量 eps1eps2 中。這個函數會以目前 Stata 中的數據集創建一個矩陣。首先,我創建了一個空矩陣 epsmat ,然後將變量 eps1eps2 填入到該矩陣中。最後,我使用矩陣 epsmat 的前 T 行位置來存儲 u 中的數據。

3. 生成觀測序列

沿用 Lütkepohl(2005) 的做法,我先生成了前兩個觀測值並使得它們的相關性與餘下的樣本一致。我假設前兩項服從一個二維聯合正態分佈,其無條件期望爲 θ=(IKA1A2)1μ\theta = (I_K-A_1-A_2)^{-1}\mu,其協方差矩陣滿足:

vec(Σy)=(I16FF)1vec(Σϵ) vec(\Sigma_{ y })=(I_{ 16 }-F\otimes F)^{ -1 }vec(\Sigma_{ \epsilon })

其中 vec()vec( ) 是一個計算矩陣列數的算子,I16I_{16} 是一個 16×1616\times 16 的識別矩陣,

是一個 4×44\times 4 的矩陣。觀測的前兩項於是被生成爲:

其中 Q 是一個 4×44\times 4 的矩陣,滿足 QQ=ΣyQQ'=\Sigma _{ y }μ\mu4×14\times 1 的矩陣,其每個元素爲服從標準正態分佈的擾動項,

則爲 4×14\times 1 的期望矩陣。

下面的代碼展示瞭如何生成前兩個觀測並給變量 y1y2 賦值的過程:

. mata:
------------------------------------------------- mata (type end to exit) -----
: Sigma_e = J(K*p,K*p,0)

: Sigma_e[1..K,1..K] = Sigma

: Sigma_y = luinv(I((K*p)^2)-F#F)*vec(Sigma_e)

: Sigma_y = rowshape(Sigma_y,K*p)'

: theta = luinv(I(K)-A1-A2)*mu

: Q = cholesky(Sigma_y)*rnormal(K*p,1,0,1)

: data = .

: st_view(data,.,"y1 y2")

: data[1..p,.] = ((Q[3..4],Q[1..2]):+mu)'

: end
-------------------------------------------------------------------------------

生成前兩個觀測後,我們可以使用如下的代碼生成餘下的序列:

. forvalues i=3/`T' {
.         qui {
. replace y1 = 0.1 + 0.6*l.y1 - 0.3*l.y2 + 0.2*l2.y1 + 0.3*l2.y2 + eps1 in `i'
. replace y2 = 0.4 + 0.4*l.y1 + 0.2*l.y2 - 0.1*l2.y1 + 0.1*l2.y2 + eps2 in `i'
.         }
. }
. drop in 1/100
(100 observations deleted)

我在 replace 命令後加入了 quietly 選項來篩選掉不必要顯示的輸出結果。最後,我刪掉了前 100 個觀測來避免模擬效果受到初值的影響。

4. 估計

我使用 var 命令來擬合 VAR(2) 模型;

. var y1 y2

Vector autoregression

Sample:  103 - 1100                             Number of obs     =        998
Log likelihood =  -2693.949                     AIC               =   5.418735
FPE            =   .7733536                     HQIC              =    5.43742
Det(Sigma_ml)  =   .7580097                     SBIC              =   5.467891

Equation           Parms      RMSE     R-sq      chi2     P>chi2
----------------------------------------------------------------
y1                    5     1.14546   0.5261   1108.039   0.0000
y2                    5     .865602   0.4794   919.1433   0.0000
----------------------------------------------------------------

------------------------------------------------------------------------------
             |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
y1           |
          y1 |
         L1. |   .5510793   .0324494    16.98   0.000     .4874797     .614679
         L2. |   .2749983   .0367192     7.49   0.000       .20303    .3469667
             |
          y2 |
         L1. |  -.3080881    .046611    -6.61   0.000    -.3994439   -.2167323
         L2. |   .2551285   .0425803     5.99   0.000     .1716727    .3385844
             |
       _cons |   .1285357   .0496933     2.59   0.010     .0311387    .2259327
-------------+----------------------------------------------------------------
y2           |
          y1 |
         L1. |   .3890191   .0245214    15.86   0.000      .340958    .4370801
         L2. |  -.0190324    .027748    -0.69   0.493    -.0734175    .0353527
             |
          y2 |
         L1. |   .1944531    .035223     5.52   0.000     .1254172     .263489
         L2. |   .0459445   .0321771     1.43   0.153    -.0171215    .1090106
             |
       _cons |   .4603854   .0375523    12.26   0.000     .3867843    .5339865
------------------------------------------------------------------------------

var 命令在估計模型係數時默認爲兩階滯後,參數估計是顯著的並且與用來生成兩個序列的參數真實值接近。

5. 推斷:脈衝響應函數

脈衝響應函數 (IRF) 可以用來分析 VAR 模型中的內生變量如何對擾動項的衝擊進行反應。比如,在由通脹和利率組成的雙變量 VAR 模型中,脈衝響應函數可以追蹤來自通脹方程的外生衝擊如何對利率造成影響。

考慮最開始提到的雙變量模型,假如我想估計一單位 ϵt\epsilon_t 的變動對系統中的內生變量會造成怎樣的衝擊。我可以將 VAR(2) 過程通過數學變換變形爲 MA(\infty) 過程:

yt=p=0Φpμ+p=0Φpϵtp y_{ t }=\sum _{ p=0 }^{ \infty } \Phi _{ p }\mu +\sum _{ p=0 }^{ \infty } \Phi _{ p }\epsilon _{ t-p }

其中 Φp\Phi _{ p } 是 MA(\infty) 過程係數矩陣的的第 p 階滯後。根據Lütkepohl(2005),MA 係數矩陣與 AR 過程的係數矩陣有如下聯繫:

Φ0=I2Φ1=A1Φ2=Φ1A1+A2=A12+A2Φi=Φi1A1+Φi2A2 \Phi _{ 0 }=I_{ 2 }\\ \Phi _{ 1 }=A_{ 1 }\\ \Phi _{ 2 }=\Phi _{ 1 }A_{ 1 }+A_{ 2 }=A_{ 1 }^{ 2 }+A_{ 2 }\\ \vdots \\ \Phi _{ i }=\Phi _{ i-1 }A_{ 1 }+\Phi _{ i-2 }A_{ 2 }

也就是說,第 ii 個變量在未來 hh 期對第 jj 個方程在時點 tt 的單位衝擊作出的反應爲:

yi,t+hϵj,t={Φh}i,j \frac { \partial y_{ i,t+h } }{ \partial \epsilon _{ j,t } } =\{ \Phi _{ h }\} _{ i,j }

該式意味着第 ii 個變量在未來 hh 期對第 jj 個方程在時點 tt 的單位衝擊作出的反應爲 MA(\infty) 過程係數矩陣中第 iijj 列的元素值。對於 VAR(2) 過程,使用估計 AR 參數得到的前若干個反應值爲:

對於t>2t>2yty_t 的響應使用類似的遞歸即可得到,第一個方程的衝擊對第一個變量的影響爲向量(1,0.5510,0.4588, )(1,0.5510,0.4588,\cdots)。我使用 irf create 命令來得到脈衝影響的結果:

. irf create firstirf, set(myirf)
(file myirf.irf created)
(file myirf.irf now active)
(file myirf.irf updated)

這個命令估計了 firstirf 模型中的脈衝響應函數和其他的統計量,並存儲在文件 myirf.irf 中。選項 set( ) 將文件名爲 myirf.irf 的文件激活。我可以在表格中列示來自同一方程擾動項的外生衝擊對 y1y_1 的影響:

. irf table irf, impulse(y1) response(y1) noci

Results from firstirf

+--------------------+
|        |    (1)    |
|  step  |   irf     |
|--------+-----------|
|0       | 1         |
|1       | .551079   |
|2       | .458835   |
|3       | .42016    |
|4       | .353356   |
|5       | .305343   |
|6       | .263868   |
|7       | .227355   |
|8       | .196142   |
+--------------------+
(1) irfname = firstirf, impulse = y1, and response = y1

默認的期數爲 8 期,我加入 noci 選項選擇不顯示置信區間。注意 Stata 算出的前幾期響應結果與我之前手動算的結果非常接近。帶 95% 置信帶的脈衝響應函數圖如下:

. irf graph irf, impulse(y1) response(y1)

由上圖可知,來自同一方程的一單位衝擊將使 y1y_1 立即增加一個單位,然後在中長期隨着時間逐漸衰減。

6. 正交化的脈衝響應函數

在前面的部分中,我展示了其他條件不變時,來自同一方程的一單位衝擊對 y1y_1 造成的影響。然而,如下表所示,方差-協方差矩陣 Σ^\hat{\Sigma} 顯示了兩個等式之間較強的正相關關係。

. matrix list e(Sigma)

symmetric e(Sigma)[2,2]
           y1         y2
y1  1.3055041
y2   .4639629  .74551376

兩個等式的估計協方差是正的,這意味着我不能假設一個擾動項變動而另一個擾動項保持不變。來自 y2y_2 方程的衝擊會對 y1y_1 造成同期影響,反之亦然。

正交脈衝響應函數 (OIRF) 通過將估計方差-協方差矩陣 Σ^\hat{\Sigma} 分解爲一個下三角矩陣來解決此問題。這種類型的分解可以將來自同一方程的衝擊對 y1y_1 的同期影響分離出來。然而,來自第一個方程的衝擊依然會同期影響 y2y_2 。比如,如果 y1y_1 是通脹而 y1y_1 是利率,這個分解意味着通脹的衝擊會同時影響通脹和利率,但是來自利率的衝擊則只會影響利率。

爲了估計 OIRFs,令 P 表示 Σ\Sigma 的 Cholesky 分解,即滿足 PP=ΣPP'=\Sigma 。令 utu_t 表示一個 2×12\times 1 的向量使得 Put=ϵtPu_t=\epsilon_t ,也即是 ut=P1ϵtu_t=P^{-1}\epsilon_tutu_t 中的誤差與構造不相關,因爲 E(utut)=P1E(ϵtϵt)P1=I2E(u_tu'_t)=P^{-1}E(\epsilon_t\epsilon'_t)P'^{-1}=I_2。這允許我們將 OIRFs 解讀爲來自 utu_t 的一個標準差的外生衝擊造成的影響。

重寫以 utu_t 向量表示的 MA(\infty) 過程:

yt=p=0Φpμ+p=0Φputp y_t=\sum_{p=0}^{\infty} \Phi_p \mu+\sum_{p=0}^{\infty} \Phi_p u_{t-p}

OIRFs 則爲 MA 過程的係數矩陣與下三角矩陣 P 的積:

yi,t+huj,t={ΦhP}i,j \frac { \partial y_{ i,t+h } }{ \partial u_{ j,t } } =\{ \Phi_{ h } P\} _{ i,j }

通過以下代碼得到 P^\hat{P} 的估計:

. matrix Sigma_hat = e(Sigma)

. matrix P_hat = cholesky(Sigma_hat)

. matrix list P_hat

P_hat[2,2]
           y1         y2
y1  1.1425866          0
y2  .40606367  .76198823

使用這個矩陣,我可以計算前若干期的響應:

我將所有的 OIRFs 列示在一個表格中並畫出了 y1 的脈衝響應圖:

. irf table oirf, noci

                 Results from firstirf

+--------------------------------------------------------+
|        |    (1)    |    (2)    |    (3)    |    (4)    |
|  step  |   oirf    |   oirf    |   oirf    |   oirf    |
|--------+-----------+-----------+-----------+-----------|
|0       | 1.14259   | .406064   | 0         | .761988   |
|1       | .504552   | .523448   | -.23476   | .148171   |
|2       | .534588   | .294977   | .019384   | -.027504  |
|3       | .476019   | .279771   | -.0076    | .013468   |
|4       | .398398   | .242961   | -.010024  | -.00197   |
|5       | .346978   | .206023   | -.003571  | -.003519  |
|6       | .299284   | .178623   | -.004143  | -.001973  |
|7       | .257878   | .154023   | -.003555  | -.002089  |
|8       | .222533   | .13278    | -.002958  | -.001801  |
+--------------------------------------------------------+
(1) irfname = firstirf, impulse = y1, and response = y1
(2) irfname = firstirf, impulse = y1, and response = y2
(3) irfname = firstirf, impulse = y2, and response = y1
(4) irfname = firstirf, impulse = y2, and response = y2

irf table oirf 要求輸出 OIRFs 的結果。注意前三行的估計結果與我們之前手算的結果相同。

. irf graph oirf, impulse(y1) response(y1)

上圖即爲 y1 對來自同一個方程的一個單位的衝擊的脈衝響應圖。

結論

在這篇推文中,我展示了怎麼模擬一個平穩的 VAR(2) 模型,使用 var 命令估計了這個模型的參數,展示瞭如何估計 IRFs 和 OIRFs ,其中 OIRFs 由對協方差矩陣的下三角分解得到。

參考文獻

Lütkepohl, H. 2005. New Introduction to Multiple Time Series Analysis. New York: Springer.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章