联立方程模型的方法扩展

作者

胡华平

发布于

2025年12月19日

三阶段最小二乘法(3SLS)

如果扰动项存在同期相关性,两阶段最小二乘估计的可行广义最小二乘(FGLS)版本可以得到一致且渐近更有效的估计量。这种估计程序通常被称为”三阶段最小二乘法”(3SLS,Zellner and Theil 1962)。标准3SLS估计量及其协方差矩阵通过方程10和12得到,其中\(\widehat{\Omega}\)等于\(\widehat{\Sigma} \otimes I_{T}\),\(\widehat{\Sigma}\)是扰动项的估计协方差矩阵。

虽然无偏的2SLS或W2SLS估计只需要每个单方程的工具变量与扰动项不相关\(\left(\mathrm{E}\left[u_{i}^{\top} Z_{i}\right]=0 \forall i\right)\),但Schmidt (1990)指出,3SLS估计量只有在所有扰动项和所有工具变量都不相关\(\left(\mathrm{E}\left[u_{i}^{\top} Z_{j}\right]=0 \forall i, j\right)\)时才是一致的。由于可能存在无法避免这种情况的场合,Schmidt (1990)分析了获得3SLS估计量的其他方法。

其中一种基于工具变量估计的方法(3SLS-IV)是:

\[ \begin{equation*} \hat{\beta}_{3 \text { SLS-IV }}=\left(\hat{X}^{\top} \widehat{\Omega}^{-1} X\right)^{-1} \widehat{X}^{\top} \widehat{\Omega}^{-1} y \tag{13} \end{equation*} \]

3SLS-IV系数估计量的协方差矩阵估计量为:

\[ \begin{equation*} \widehat{\operatorname{COV}}\left[\hat{\beta}_{3 \text { SLS-IV }}\right]=\left(\hat{X}^{\top} \widehat{\Omega}^{-1} X\right)^{-1} \tag{14} \end{equation*} \]

另一种基于广义矩估计(GMM)的方法(3SLS-GMM)是:

\[ \begin{equation*} \hat{\beta}_{3 \mathrm{SLS}-\mathrm{GMM}}=\left(X^{\top} Z\left(Z^{\top} \widehat{\Omega} Z\right)^{-1} Z^{\top} X\right)^{-1} X^{\top} Z\left(Z^{\top} \widehat{\Omega} Z\right)^{-1} Z^{\top} y \tag{15} \end{equation*} \]

其中

\[ Z=\left[\begin{array}{cccc} Z_{1} & 0 & \cdots & 0 \tag{16}\\ 0 & Z_{2} & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & Z_{G} \end{array}\right] \]

3SLS-GMM系数估计量的协方差矩阵估计量为:

\[ \begin{equation*} \widehat{\operatorname{COV}}\left[\hat{\beta}_{3 S L S-G M M}\right]=\left(X^{\top} Z\left(Z^{\top} \widehat{\Omega} Z\right)^{-1} Z^{\top} X\right)^{-1} \tag{17} \end{equation*} \]

Schmidt (1990)本人开发的第四种方法是:

\[ \begin{equation*} \hat{\beta}_{3 \text { SLS-Schmidt }}=\left(\widehat{X}^{\top} \widehat{\Omega}^{-1} \widehat{X}\right)^{-1} \widehat{X}^{\top} \widehat{\Omega}^{-1} Z\left(Z^{\top} Z\right)^{-1} Z^{\top} y \tag{18} \end{equation*} \]

这些系数估计量的协方差矩阵估计量为:

\[ \begin{align*} \widehat{\operatorname{COV}}\left[\hat{\beta}_{\text {3SLS-Schmidt }}\right]= & \left(\hat{X}^{\top} \widehat{\Omega}^{-1} \widehat{X}\right)^{-1} \widehat{X}^{\top} \widehat{\Omega}^{-1} Z\left(Z^{\top} Z\right)^{-1} Z^{\top} \widehat{\Omega} Z \tag{19}\\ & \left(Z^{\top} Z\right)^{-1} Z^{\top} \widehat{\Omega}^{-1} \widehat{X}\left(\widehat{X}^{\top} \widehat{\Omega}^{-1} \widehat{X}\right)^{-1} \end{align*} \]

计量经济学软件EViews使用:

\[ \begin{equation*} \hat{\beta}_{3 \mathrm{SLS}-\mathrm{EViews}}=\hat{\beta}_{2 \mathrm{SLS}}+\left(\widehat{X}^{\top} \widehat{\Omega}^{-1} \widehat{X}\right)^{-1} \widehat{X}^{\top} \widehat{\Omega}^{-1}\left(y-X \hat{\beta}_{2 \mathrm{SLS}}\right) \tag{20} \end{equation*} \]

其中\(\hat{\beta}_{\text {2SLS }}\)是如上定义的两阶段最小二乘估计量。EViews使用标准3SLS公式(方程12)来计算系数估计量的协方差矩阵估计量。

如果在所有方程中使用相同的工具变量(\(Z_{1}=Z_{2}=\ldots=Z_{G}\)),上述所有方法都会得到相同的估计结果。然而,如果不是这种情况,结果取决于所使用的方法(Schmidt 1990)。对不同方程使用不同工具变量的唯一原因是一个方程的工具变量与另一个方程的扰动项存在相关性。否则,可以简单地在每个方程中使用所有工具变量(Schmidt 1990)。在这种情况下,只有3SLS-GMM(方程15)和Schmidt (1990)开发的3SLS估计量(方程18)是一致的。

案例说明Greene (2003): Example 15.1 (Klein’s model I)

复现Greene (2003) 表10.8的估计结果:Greene, W. H. Econometric analysis[M]. Boston: Prentice Hall, 2018. page 364-365.

接下来,我们尝试复制 Klein 的”模型 I”(Klein 1950),该模型在 Greene (2003, p. 381) 中有描述。数据可从 Greene (2003) 的在线补充材料中获取,表 F15.1 (http://pages.stern.nyu.edu/~wgreene/Text/tables/TableF15-1.txt),估计结果见表 15.3 (p. 412)。

理论模型的方程系统为:

\[ \begin{align} C_{t}&=\alpha_{0}+\alpha_{1} P_{t}+\alpha_{2} P_{t-1}+\alpha_{3}\left(W_{t}^{p}+W_{t}^{g}\right)&+\epsilon_{1 t} & \quad \text { (Consumption) } \\ I_{t}&=\beta_{0}+\beta_{1} P_{t}+\beta_{2} P_{t-1}+\beta_{3} K_{t-1}&+\epsilon_{2 t} & \quad\text { (Investment) } \\ W_{t}^{p}&=\gamma_{0}+\gamma_{1} X_{t}+\gamma_{2} X_{t-1}+\gamma_{3} A_{t}&+\epsilon_{3 t} & \quad\text { (Private wages) } \\ X_{t}&=C_{t}+I_{t}+G_{t}& & \quad\text { (Equilibrium demand) } \\ P_{t}&=X_{t}-T_{t}-W_{t}^{p}& & \quad\text { (Private profits) } \\ K_{t}&=K_{t-1}+I_{t}& & \quad\text { (Capital stock) } \\ \end{align} \]

具体变量定义如下:

  • \(C_t\) = 消费
  • \(P_t\) = 私人利润
  • \(P_{t-1}\) = 私人利润滞后一期
  • \(W_t^p\) = 私人工资
  • \(W_t^g\) = 政府工资
  • \(I_t\) = 投资
  • \(K_t\) = 资本存量
  • \(K_{t-1}\) = 资本存量滞后一期
  • \(X_t\) = 国民生产总值
  • \(X_{t-1}\) = 国民生产总值滞后一期
  • \(A_t\) = 以1931年为起点的年份时间趋势
  • \(G_t\) = 政府非工资支出
  • \(T_t\) = 间接商业税加净出口

简单概括一下理论模型系统的特点:

  • 内生变量(Endogenous variables)都在方程的左边,并在右边标注。
  • 外生变量(Exogenous variables)是 \(G_t\) = 政府非工资支出,\(T_t\) = 间接商业税加净出口,\(W_t^g\) = 政府工资支出,\(A_t\) = 以1931年为起点的年份时间趋势,以及常数项。
  • 还有三个前定变量(Predetermined variables):资本存量、私人利润和总需求的滞后值。
  • 该模型包含三个行为方程(消费、投资、私人工资方程)、一个均衡条件(国民收入均衡方程)和两个会计恒等式(私人利润恒等式、资本存量恒等式)。
  • 这个模型为小型动态经济模型提供了一个很好的例子。
  • Klein使用1921年至1941年美国年度汇总数据估计了参数。

下面我们尝试复现Klein模型I的估计结果。主要工作包括:

  • 首先,加载数据并设定三个方程以及工具变量(使用相同的工具变量)。

  • 方程系统通过依次采用 OLS、2SLS、3SLS 和迭代 3SLS 方法进行估计。

  • 最后,比较不同方法的估计结果。

变量定义和数据集

Show the code
# pkgs
library(tidyverse)
library(magrittr)
library(DT)
library(systemfit)
library(here)

# 加载数据
data( "KleinI" )

以下是变量集的定义:

变量_代码 变量_方程变量 变量_中文 说明
year 年份 年份标识变量
consump \(C_t\) 消费 内生变量
corpProf \(P_t\) 私人利润 内生变量
corpProfLag \(P_{t-1}\) 私人利润滞后一期 前定变量
privWage \(W_t^p\) 私人工资 内生变量
invest \(I_t\) 投资 内生变量
capitalLag \(K_{t-1}\) 资本存量滞后一期 前定变量
gnp \(X_t\) 国民生产总值 内生变量
gnpLag \(X_{t-1}\) 国民生产总值滞后一期 前定变量
govWage \(W_t^g\) 政府工资 外生变量
govExp \(G_t\) 政府非工资支出 外生变量
taxes \(T_t\) 税收 外生变量
wages \(W_t^p + W_t^g\) 工资总额
trend \(A_t\) 时间趋势 外生变量

以下是KleinI 的数据集:

方程设定和估计

下面我们依次设定三个方程、工具变量和方程系统。

Show the code
# 三个行为方程
eqConsump <- consump ~ corpProf + corpProfLag + wages
eqInvest <- invest ~ corpProf + corpProfLag + capitalLag
eqPrivWage <- privWage ~ gnp + gnpLag + trend
# 工具变量
inst <- ~ govExp + taxes + govWage + trend + capitalLag + corpProfLag + gnpLag
# 方程系统
system <- list( Consumption = eqConsump, Investment = eqInvest,
    PrivateWages = eqPrivWage )

OLS 估计

Show the code
kleinOls <- systemfit( system, data = KleinI )

OLS估计结果(summary):

OLS估计结果(coef):

term estimate std.error statistic p.value conf.low conf.high
Consumption_(Intercept) 16.2366 1.3027 12.4638 0.0000 13.4881 18.9851
Consumption_corpProf 0.1929 0.0912 2.1153 0.0495 0.0005 0.3854
Consumption_corpProfLag 0.0899 0.0906 0.9916 0.3353 -0.1014 0.2811
Consumption_wages 0.7962 0.0399 19.9334 0.0000 0.7119 0.8805
Investment_(Intercept) 10.1258 5.4655 1.8527 0.0814 -1.4055 21.6571
Investment_corpProf 0.4796 0.0971 4.9389 0.0001 0.2747 0.6845
Investment_corpProfLag 0.3330 0.1009 3.3020 0.0042 0.1202 0.5458
Investment_capitalLag -0.1118 0.0267 -4.1827 0.0006 -0.1682 -0.0554
PrivateWages_(Intercept) 1.4970 1.2700 1.1787 0.2547 -1.1825 4.1766
PrivateWages_gnp 0.4395 0.0324 13.5609 0.0000 0.3711 0.5079
PrivateWages_gnpLag 0.1461 0.0374 3.9037 0.0011 0.0671 0.2250
PrivateWages_trend 0.1302 0.0319 4.0816 0.0008 0.0629 0.1976

2SLS 估计

                         Estimate Std. Error t value Pr(>|t|)
Consumption_(Intercept)    16.555      1.321  12.534    0.000
Consumption_corpProf        0.017      0.118   0.147    0.885
Consumption_corpProfLag     0.216      0.107   2.016    0.060
Consumption_wages           0.810      0.040  20.129    0.000
Investment_(Intercept)     20.278      7.543   2.688    0.016
Investment_corpProf         0.150      0.173   0.867    0.398
Investment_corpProfLag      0.616      0.163   3.784    0.001
Investment_capitalLag      -0.158      0.036  -4.368    0.000
PrivateWages_(Intercept)    1.500      1.148   1.307    0.209
PrivateWages_gnp            0.439      0.036  12.316    0.000
PrivateWages_gnpLag         0.147      0.039   3.777    0.002
PrivateWages_trend          0.130      0.029   4.475    0.000

2SLS估计结果(summary):

Show the code
summary( klein2sls )

2SLS估计结果(coef):

Show the code
broom::tidy( klein2sls ) %>%
  kableExtra::kbl(escape = FALSE, digits = 4) %>%
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "condensed"))

3SLS 估计

Show the code
klein3sls <- systemfit( system, method = "3SLS", inst = inst, data = KleinI,
    methodResidCov = "noDfCor" )

3SLS估计结果(summary):

Show the code
summary( klein3sls )

3SLS估计结果(coef):

Show the code
broom::tidy( klein3sls ) %>%
  kableExtra::kbl(escape = FALSE, digits = 4) %>%
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "condensed"))

迭代 3SLS 估计

Show the code
kleinI3sls <- systemfit( system, method = "3SLS", inst = inst, data = KleinI,
    methodResidCov = "noDfCor", maxit = 500 )

迭代3SLS估计结果(summary):

Show the code
summary( kleinI3sls )

迭代3SLS估计结果(coef):

Show the code
broom::tidy( kleinI3sls ) %>%
  kableExtra::kbl(escape = FALSE, digits = 4) %>%
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "condensed"))

比较不同方法的估计结果

比较不同方法的估计结果(表格形式):

Equation math Variable OLS 2SLS 3SLS I3SLS
Consumption NA Intercept 16.237
(1.303)
16.555
(1.321)
16.441
(1.305)
16.559
(1.224)
Consumption \(P_t\) corpProf 0.193
(0.091)
0.017
(0.118)
0.125
(0.108)
0.165
(0.096)
Consumption \(P_{t-1}\) corpProfLag 0.090
(0.091)
0.216
(0.107)
0.163
(0.100)
0.177
(0.090)
Consumption \(W_t^p + W_t^g\) wages 0.796
(0.040)
0.810
(0.040)
0.790
(0.038)
0.766
(0.035)
Investment NA Intercept 10.126
(5.466)
20.278
(7.543)
28.178
(6.794)
42.896
(10.594)
Investment \(P_t\) corpProf 0.480
(0.097)
0.150
(0.173)
-0.013
(0.162)
-0.357
(0.260)
Investment \(P_{t-1}\) corpProfLag 0.333
(0.101)
0.616
(0.163)
0.756
(0.153)
1.011
(0.249)
Investment \(K_{t-1}\) capitalLag -0.112
(0.027)
-0.158
(0.036)
-0.195
(0.033)
-0.260
(0.051)
PrivateWages NA Intercept 1.497
(1.270)
1.500
(1.148)
1.797
(1.116)
2.625
(1.196)
PrivateWages \(X_t\) gnp 0.439
(0.032)
0.439
(0.036)
0.400
(0.032)
0.375
(0.031)
PrivateWages \(X_{t-1}\) gnpLag 0.146
(0.037)
0.147
(0.039)
0.181
(0.034)
0.194
(0.032)
PrivateWages \(A_t\) trend 0.130
(0.032)
0.130
(0.029)
0.150
(0.028)
0.168
(0.029)

主要结论和观点:

  • 首先,OLS估计量出人意料地接近结构估计量(2SLS和3SLS)。同时,OLS估计的方差小于2SLS估计的方差。这似乎表明OLS估计要更优,但事实并非如此。因为,小样本下,可能会出现OLS估计更优的假象,而在大样本下,2SLS必须优于OLS。

  • 其次,在模型正确设置和大样本的情况下,基于完全信息的3SLS估计量在渐近上优于基于有限信息的2SLS估计量。此外,3SLS的有限样本方差可能等于或大于2SLS的有限样本方差。但在实际应用中,有限样本性质可能对估计结果产生重要影响。