做宏观经济研究的朋友们应该都遇到过这样的困扰:我们手头有投资、收入、消费这些关键指标的面板数据,想知道它们之间到底谁影响谁、影响有多大。传统方法要么假设太强(比如固定效应模型),要么处理不了变量间的动态交互(比如普通回归)。这时候PVAR(面板向量自回归)模型就派上用场了。
但PVAR有个头疼的问题——内生性。比如消费可能影响收入,收入反过来又影响消费,这种"鸡生蛋蛋生鸡"的关系会让普通OLS估计产生偏差。我在2018年分析省级经济数据时就踩过这个坑,当时用OLS估计的结果连符号都不合理。后来发现GMM(广义矩量法)才是解决这个问题的金钥匙,它通过巧妙的工具变量设计,能有效处理滞后项的内生性问题。
先说说数据准备这个基础但关键的环节。我常用的数据集结构是这样的:
stata复制* 生成示例数据
clear
set obs 100
gen id = ceil(_n/10) // 10个时间点,10个个体
bysort id: gen year = 2000 + _n
gen inv = runiform(1,5) // 投资
gen inc = inv*0.5 + runiform() // 收入
gen cons = inc*0.7 + inv*0.2 + runiform() // 消费
这里要特别注意三个坑:
tsfill补全时间缺口xtunitroot fisher命令选滞后阶数是个技术活。去年帮某券商做消费预测时,我们对比了三种方法:
推荐这个自动化脚本:
stata复制pvar2 inv inc cons, lag(5) gmmstyle
estat ic // 看信息准则
实际应用中,经济数据通常1-2阶滞后就够了。太高的阶数不仅降低效率,还容易过拟合。
GMM的威力在于工具变量的选择。经过多次测试,我发现这些配置效果最好:
collapse选项减少工具变量数量stata复制pvar2 inv inc cons, lag(2) instl(1/2) gmmstyle
特别注意:工具变量太少会导致识别不足,太多会弱工具变量问题。建议用estat overid检验过度识别。
权重矩阵直接影响估计效率。常见选择有:
我常用的稳健估计命令:
stata复制pvar2 inv inc cons, lag(2) gmmstyle twostep robust
很多人误解格兰杰因果是"真实因果关系",其实它只是预测关系。具体来说:
运行PVAR后直接使用:
stata复制pvar2 inv inc cons, lag(2)
pvarstable // 先检查稳定性
pvargranger // 格兰杰检验
解读结果时要注意:
去年分析消费数据时发现:收入→消费的格兰杰因果很显著(p=0.01),但反向关系却不显著,这与理论预期一致。
脉冲响应展示变量受冲击后的动态路径。关键技巧:
accumulate选项看长期影响示例代码:
stata复制pvar2 inv inc cons, lag(2)
pvarirf, irf(10) mc(500) bs
pvarirf graph, impulse(inv) response(cons)
预测误差方差分解能告诉我们:
实用命令:
stata复制pvarfevd, horizon(10) decomp
经验法则:短期主要受自身冲击影响,长期受其他变量影响增大。比如在季度数据中,消费方差中收入冲击的贡献通常在6个季度后达到峰值。
模型不稳等于白做!必检项目:
stata复制pvarstable, graph
要求所有特征值模都位于单位圆内。去年遇到一个案例:加入房价变量后模型不稳定,最后发现是房价序列存在爆炸性趋势。
好模型的残差应该:
pvarlmar检验pvarwhite检验pvarnorm检验修复建议:
用predict命令生成拟合值:
stata复制pvar2 inv inc cons, lag(2)
predict inv_fit, equation(inv)
评估预测精度:
stata复制estat mse // 均方误差
estat mape // 平均绝对百分比误差
滚动预测更接近实战:
stata复制rolling _b[], window(80): pvar2 inv inc cons, lag(2)
在2020年疫情冲击预测中,PVAR模型的表现优于ARIMA,特别是在捕捉变量间的连锁反应方面。