1. 为什么偏偏是ARDL:这个模型解决的痛点不是普通回归能替代的
做时间序列实证研究的人,八成都有过这样的纠结:手头一组变量,有的平稳,有的不平稳,直接跑OLS怕伪回归,全做差分又怕丢掉长期信息。传统协整检验要求所有变量同阶单整,这个前提在实际数据里往往卡得很死。宏观经济数据里,GDP、消费、投资这些序列常是I(1),但利率、汇率、某些政策变量有时就是I(0),混在一起的时候,Johansen那套方法基本就废了。
ARDL(自回归分布滞后模型)能在这几年火起来,核心就一个原因:它不要求所有变量同阶单整。Pesaran等人在2001年提出Bounds Testing方法时,把变量的单整阶数放宽到了I(0)和I(1)混合的情况,只要没有I(2)变量,模型就能跑。这个特性让它成了实证经济学里处理"混合单整"数据的首选工具,也是我在这篇文章里要重点讲清楚的东西。
当然,允许混合单整不等于什么都不用检查。我在实操中发现很多人拿着ARDL就当万能药,拿到数据直接开跑,结果一阶差分后还是不平稳,或者根本不知道模型前还要做单位根检验。这篇文章的目标就很具体了:讲清楚ARDL到底解决了什么问题、适用边界在哪里,然后一步步演示在Stata里从数据准备、平稳性检验、滞后阶数选择、Bounds检验到误差修正模型(ECM)的完整操作流程。无论你是刚接触时间序列的硕士生,还是被审稿人要求补做ARDL的科研党,照着走就能跑出可复现的结果。
需要特别说明的是,本篇涉及的Stata操作基于我平时使用的Stata 16/17版本,不同版本菜单和命令略有差异,但核心语法和输出解读逻辑完全一致,不影响复现。
2. ARDL背后的数学逻辑:不搞懂这个,你连Stata报错都看不懂
2.1 模型的基本形式:一个式子看懂滞后结构
ARDL模型的标准形式长这样:
[ y_t = \alpha_0 + \sum_{i=1}^{p} \phi_i y_{t-i} + \sum_{j=0}^{q} \beta_j x_{t-j} + \varepsilon_t ]
通俗翻译一下:当期被解释变量 (y_t) 不仅受当期解释变量 (x_t) 的影响,还受自己和解释变量的历史值影响。这就是"自回归"(AR部分,(y_{t-i}))和"分布滞后"(DL部分,(x_{t-j}))两个词的含义。
这个设定很贴近现实。比如研究货币政策对通胀的影响,利率调整往往不会当月立刻完全传导到物价,而是分几个月逐步体现,甚至存在"J曲线效应"和滞后反应。如果在模型里只放当期利率,你捕捉到的可能是严重偏误的短期效应,长期均衡关系也被截断了。
ARDL最常用的场景是处理非平稳时间序列的长期均衡关系,经典的Bounds Testing(边界协整检验)形式可以写成:
[ \Delta y_t = \alpha_0 + \sum_{i=1}^{p} \alpha_i \Delta y_{t-i} + \sum_{j=0}^{q} \beta_j \Delta x_{t-j} + \theta_1 y_{t-1} + \theta_2 x_{t-1} + \varepsilon_t ]
注意最后两项 (y_{t-1}) 和 (x_{t-1}),这就是误差修正项的基础。它们的存在让模型同时包含了短期动态和长期均衡两套信息。短期关系靠差分项 (\Delta y_{t-i}) 和 (\Delta x_{t-j}) 体现,长期关系则直接由水平值 (y_{t-1}) 和 (x_{t-1}) 捕捉。
这个设定太巧妙了。我们平时做协整,总想着先检验有没有长期关系,再单独建模短期修复速度。ARDL直接把这两步合并到一个回归里了。如果 (y_{t-1}) 和 (x_{t-1}) 的系数联合显著,就说明变量之间存在长期协整关系,短期偏离会在下一期被拉回均衡,这就是ECM(误差修正模型)的核心思想。
2.2 为什么ARDL不要求同阶单整?关键在于Bounds检验的临界值表
这是ARDL最让新手困惑的地方。同阶单整检验是传统协整的前提,但ARDL的检验逻辑完全不同。
Pesaran等人在2001年构造了一套双临界值体系,分两个极端情形:假设所有变量都是I(0),查下界临界值;假设所有变量都是I(1),查上界临界值。实际计算出的F统计量如果大于上界临界值,就拒绝"没有协整关系"的原假设,说明存在长期关系;如果小于下界,则不能拒绝原假设;如果落在两者之间,结论不确定。
我知道这个机制说起来可能还有点绕。打个比方,就像判断一个人能不能扛住重物,传统方法要求先测清楚他确实有100公斤的力气才能搬100公斤的东西(同阶单整);ARDL的方法则是给定一个重量范围(比如80到120公斤),只要他的力气落在这个区间上方,就认为他能扛住,至于具体是90还是110公斤,不那么重要了。这个"区间"就是两个临界值之间的区域,变量实际单整阶数只要落在这个范围内,检验结论就是稳健的。
这也解释了为什么ARDL能容忍I(0)和I(1)混合:它压根不需要你精确知道每个变量的单整阶数,只需要确认没有I(2)变量就行。I(2)变量的二阶差分才平稳,其行为特征和I(0)/I(1)差异过大,会直接破坏临界值的有效性,所以预检验的核心任务就变成了排查I(2)。
2.3 ARDL的适用边界:什么情况下别用它
这里必须说实话,ARDL不是万能的。我在给研究生改论文时,见过不少乱用的情况:
第一,有I(2)变量就别用。尽管ARDL可以处理混合单整,但这个"混合"的范围严格限制在I(0)和I(1)。如果你的利率或价格指数是I(2),必须先做变换或换模型。这一点在Stata操作中必须在单位根检验后就确认清楚。
第二,样本量太小或太大都不好。ARDL的临界值是基于大量模拟得到的大样本渐近分布,小样本(比如30个观测)下需要考虑小样本修正版本(Narayan, 2005专门做了小样本临界值)。当然,样本量特别大时ARDL也未必最优,比如日频金融数据动辄几千个观测,更合适的可能是GARCH族模型。
第三,结构性断点会干扰结果。ARDL本身不擅长处理突变(regime shift),如果数据涵盖了重大政策变革、金融危机等时期,建议在模型中加入虚拟变量,或者用CUSUM检验做稳定性评估。这个在Stata里跑完模型后可以顺手做掉,后面我会演示。
第四,ARDL解决的是单方程协整问题,如果研究系统里存在多个协整关系、变量之间存在双向因果,那就超出ARDL的范畴了,应该考虑VAR或VECM。
3. Stata里的完整操作流程:从数据导入到底层命令逐个拆解
这一部分是最核心的实操环节。我按完整流程一步步写,每一步都解释为什么这么做,以及常见报错的应对方案。
3.1 数据准备与变量定义:拿到原始数据后先做这三件事
ARDL对数据格式要求不复杂,但有几项前期清理工作必须做扎实:
时间变量必须是Stata能识别的日期格式。如果你的数据是年度数据,比如1970到2023年共54个观测,建议生成一个年份变量year,然后用
tsset year声明时间序列结构。月度或季度数据同理,可以用tsset yearq或tsset yearm。没有声明时间序列结构的直接后果是,后面所有滞后算子(L.y、L.x)都无法使用,Stata会直接报错"time variable not set"。检查缺失值。ARDL的估计本质上还是OLS框架,哪怕缺失一个观测都可能导致整个样本量变小、参数估计不稳定。时间序列数据尤其要警惕内部缺失(比如某年统计口径调整导致数据为空),建议用
misstable summarize检查,不能留空。建立变量清单。先想清楚哪些是核心解释变量、哪些是控制变量。ARDL理论上支持多个解释变量,但每多一个变量,滞后项的组合数就会爆炸式增长,本来就不大的样本量很快会被吃干榨尽。我一般建议核心模型不超过3到4个解释变量,否则做滞后阶数选择时AIC/BIC会把模型拖到过拟合。
假设我现在有个数据集,变量包括经济增长率gdp、通货膨胀inf、利率int和汇率exr,目标是研究通胀、利率和汇率对GDP增长的长期和短期影响。数据导入完成后,第一行代码永远是:
tsset year3.2 单位根检验:ADF和PP怎么配合使用才靠谱
前面反复强调I(2)是ARDL的禁区,所以在正式建模之前,单位根检验是绕不开的步骤。Stata里最常用的是ADF检验(dfuller命令)和PP检验(pperron命令)。
ADF检验的原假设是"序列存在单位根",也就是非平稳。P值小于0.05意味着拒绝原假设,序列平稳。这里有个新手特别容易踩的坑:ADF检验对滞后阶数的选择非常敏感,不同滞后阶数可能得出完全相反的结论。我习惯的做法是先用dfuller gdp, lag(1)跑一次,再根据结果尝试多个滞后阶数,看结论是否稳健。如果某个变量在不同滞后阶数下结论飘忽不定,就需要警惕该序列是否接近单位根过程,这时最好结合PP检验一起判断。
PP检验的优点是它自动修正了异方差和序列相关对检验统计量的影响,不依赖指定的滞后阶数,和ADF可以形成交叉验证。我通常会同时对水平和一阶差分做检验,逻辑是这样的:
- 如果水平序列不平稳、一阶差分序列平稳,则该变量是I(1);
- 如果水平序列就平稳,则是I(0);
- 如果一阶差分后仍不平稳,就要对二阶差分做检验,一旦发现I(2),就要考虑变量变换或调整模型设定。
下面是一段完整的Stata命令示例:
* 对水平值做ADF单位根检验 dfuller gdp, lag(1) trend dfuller inf, lag(1) trend dfuller int, lag(1) trend dfuller exr, lag(1) trend * 对一阶差分做ADF单位根检验,D.gdp表示gdp的一阶差分 dfuller D.gdp, lag(1) trend dfuller D.inf, lag(1) trend dfuller D.int, lag(1) trend dfuller D.exr, lag(1) trend * 用PP检验做交叉验证 pperron gdp, trend pperron inf, trend pperron int, trend pperron exr, trend pperron D.gdp, trend pperron D.inf, trend pperron D.int, trend pperron D.exr, trend运行完之后,你会得到一张类似下面的结论表。我随便写几行做个示范(具体数值因数据而异,别照抄):
| 变量 | 水平ADF p值 | 一阶差分ADF p值 | 结论 |
|---|---|---|---|
| gdp | 0.312 | 0.001 | I(1) |
| inf | 0.028 | — | I(0) |
| int | 0.187 | 0.004 | I(1) |
| exr | 0.452 | 0.000 | I(1) |
如果结果像这样,inf是I(0),其他是I(1),那正好是ARDL最擅长的场景——混合单整,而且没有I(2),放心往下走。
3.3 滞后阶数选择:AIC/BIC不是越小越好,要结合残差诊断
ARDL的估计结果对滞后阶数(p和q)非常敏感。p是被解释变量的自回归滞后阶数,q是每个解释变量的分布滞后阶数。如果p和q选得不合适,残差可能有自相关,Bounds检验统计量也会失真。
Stata中我一般这样操作:
- 先初步估计一个ARDL模型,带上一定阶数的滞后,然后让Stata自动比较不同滞后阶数的AIC/BIC。
如果你有ardl命令(外部命令,需要先安装,后面会说安装方法),可以直接用:
ssc install ardl安装完就可以跑:
ardl gdp inf int exr, lag(2) maxlag(4) aic这条命令的意思是:对gdp、inf、int、exr建立ARDL模型,考虑最大滞后阶数为4,按AIC自动选择最优滞后阶数组合。
- 如果不用
ardl命令,也可以退而求其次用普通回归和循环语句做手动选择。但说实话,ardl命令可以自动输出所有滞后组合下的AIC/BIC,并直接标出最优组合,效率高得多。我强烈建议安装。
需要注意一个细节:maxlag的设定不能太大。年度数据建议最大滞后2到3期,季度数据可以到4到8期,月度数据可以到12期左右。滞后阶数设得太高会消耗大量自由度,尤其在小样本下会导致估计不稳。我见过有人把月度数据的maxlag设到24期,样本只有120个,结果模型自由度过少,估计结果彻底失去解释力。
选定最优滞后阶数后,必须立刻做残差诊断。
3.4 残差自相关检验:做不好这一步,协整结论直接作废
Bounds检验的前提是残差不能存在序列相关。如果残差有自相关问题,F统计量的分布就会偏离Pesaran的临界值表,你查表判断协整与否的方法就失效了。
在Stata里,跑完ARDL之后可以用下面的命令做残差自相关的拉格朗日乘数检验(LM检验):
estat bgodfrey这个命令的原假设是"不存在自相关",检验的是滞后1到k阶的残差是否存在序列相关。如果p值小于0.05,拒绝原假设,说明残差有自相关问题,这时候不能急着做Bounds检验,应该回到模型设定,增加滞后阶数或用更合适的滞后结构。
我遇到过一种比较隐蔽的情况:残差自相关检验的p值看上去挺好(比如0.18),但把滞后阶数从4改成6之后,模型整体的AIC明显下降,同时残差自相关也消失了。也就是说,AIC/BIC选择的最优模型不一定能通过残差诊断,两者需要平衡。我的习惯是:先在AIC/BIC选择结果附近,手动尝试调整一到两阶,看残差lm检验的表现。哪里表现好、又不太过拟合,就用哪个设定。
3.5 Bounds检验(边界协整检验):Stata命令与结果解读
确定滞后阶数并通过残差诊断后,终于可以进入Bounds检验了。这个检验的目标非常明确:判断变量之间是否存在长期协整关系。
在ardl命令框架下,直接跑:
ardl gdp inf int exr, lag(2) maxlag(4) aic bc其中bc选项表示同时展示Bounds检验结果。Stata的输出会包含F统计量和对应的临界值表格。这个表格是Pesaran et al. (2001)的临界值,分为I(0)下界和I(1)上界。F统计量大于上界临界值,拒绝"不存在长期关系"的原假设,说明变量间存在协整关系。
如果F统计量落进两个临界值之间,结论就是不确定的。这时候怎么办?我一般会试着调整滞后阶数,或者换一个被解释变量再看。此外,也建议结合ECM项(误差修正项)的显著性来做辅助判断,后面会讲到。
这里再强调一次ardl命令的安装问题:它是外部命令,需要先ssc install ardl,网络正常情况下一次就能装上。如果你没有安装命令,可能会出现"command ardl not found"的报错,解决办法很简单,先安装即可。
3.6 长期系数和短期ECM模型:实证结果怎么解读
如果Bounds检验确认存在协整关系,接下来就是获取长期系数和短期动态误差修正模型。这两块内容是一篇实证论文的核心表格。
使用ardl命令时,可以这样获取长期系数:
ardl gdp inf int exr, lag(2) maxlag(4) aic bc ecec选项会在输出中直接给出ECM模型结果。ECM模型的被解释变量是$\Delta gdp$,解释变量包括$\Delta inf$、$\Delta int$、$\Delta exr$的当期和滞后项,以及一个关键的误差修正项(记为EC或ECT)。误差修正项的系数就是短期偏离长期均衡时的调整速度,理论上应该为负且显著。比如系数是-0.35,意味着当期的短期偏离在下期会有35%被修正回长期均衡。
长期系数则可以直接通过回归结果中的水平值系数计算得到,也就是$y_{t-1}$、$x_{t-1}$这些项的系数经过一定变换后的值。如果嫌手动计算麻烦,可以使用ardl命令之后配合nlcom命令做非线性参数组合来获得标准误。
还有另外一种思路:在Bounds检验通过后,直接用变量水平值做一条普通最小二乘回归,得到长期弹性系数。两条路线结果应该一致,前者更容易把长期与短期的关系讲清楚。
3.7 模型稳定性检验:CUSUM和CUSUMSQ怎么用
一篇严谨实证论文的标配,是在ARDL分析之后附上CUSUM(累积和)和CUSUMSQ(累积平方和)稳定性检验图。这个检验用来判断模型参数在样本期间内是否保持稳定,应对前面提到的结构断点问题。
在Stata中,在ARDL估计结束后运行:
estat stability或者外部命令:
cusum6 gdp inf int exrCUSUM图通常画的是随时间变化的累积统计量,以及上下两条5%显著水平的临界线。如果统计量曲线始终落在两条临界线之间,说明模型参数是稳定的;只要曲线钻出边界,就说明样本中可能存在结构断点。
CUSUMSQ是对累积平方和的检验,它比CUSUM对参数变化的敏感度更高,很多人会同时看这两个图。如果CUSUM稳定但CUSUMSQ不稳定,我会优先关注CUSUMSQ的结果,因为它在检测方差结构性变化上更有优势。
4. 从手动估计到命令式操作:ardl命令的功能拆解与替代方案
4.1ardl命令的选项说明与输出解析
ardl外部命令是本篇操作流程里的绝对主力,值得把它从选项到输出拆开讲一遍。完整语法是:
ardl depvar indepvars [if] [in] [, options]常用选项如下:
| 选项 | 作用 |
|---|---|
lag(#) | 设定自回归滞后阶数p |
maxlag(#) | 设定解释变量最大滞后阶数,结合aic或bic使用 |
aic | 按AIC自动选择最优滞后组合 |
bic | 按BIC自动选择最优滞后组合 |
bc | 输出Bounds检验结果 |
ec | 输出误差修正模型结果 |
trend | 在模型中加入时间趋势项 |
如果数据是季度或月度数据,还可以加季节虚拟变量。大体的业务判断是:年度数据至少考虑趋势项,季度数据考虑季节效应,月度数据则必须处理季节性。
4.2 没有ardl命令时怎么办:手动OLS的做法
如果因为网络原因装不了ardl命令,或者你希望完全透明地控制每一步估计,可以完全手动操作。手动做ARDL的步骤如下:
- 用
regress命令跑完整ARDL回归。假设p=2、q=2,命令如下:
regress gdp L.gdp L2.gdp inf L.inf L2.inf int L.int L2.int exr L.exr L2.exr保存残差,并对残差做LM自相关检验。
构造误差修正项。将$y_{t-1}$、$x_{t-1}$线性组合作为误差修正项,放进一阶差分回归中:
gen ec = gdp - _b[L.gdp]*L.gdp - _b[L.inf]*L.inf - ... regress D.gdp D.inf D.int D.exr L.ec需要注意:手动做这个流程的最大挑战在于系数的代数关系容易出错,尤其是长期系数的计算和标准误的推导。我自己的体会是,手动方式可以更清楚地理解每一个数字是怎么来的,但效率确实低了不少。镜像结论是,如果只是想写论文拿个结论,建议直接用ardl命令。
4.3 外部命令安装失败的常见原因
安装ardl时如果提示"connection timed out"或"http //www.stata.com ... no such file",通常是网络问题。可以尝试:
- 多试几次
ssc install ardl,有时候第一次连接超时第二次就好了。 - 手动去SSC官网下载
ardl.ado和ardl.sthlp文件,放进Stata的ado/personal目录。 - 安装后运行
help ardl确认命令是否可用。
这类命令安装问题和Stata本身无关,更多是网络环境导致。建议在有稳定网络的环境下操作,实在不行也可以使用varsoc和regress命令手动完成。
5. 实证结果汇报的学术规范:表格里该放什么,怎么说才严谨
这一节讲的是论文写作层面的东西,很多人模型跑出来了,结果汇报却漏洞百出。这里分享一些实用的规范和格式。
5.1 长短期关系分离汇报
严谨的ARDL论文通常会分两张表汇报结果:
- 长期系数表:列出各解释变量与因变量之间的长期均衡关系,包括系数、标准误和显著性星级。
- 短期动态ECM表:列出差分项的系数、误差修正项系数,以及模型的拟合优度、残差诊断结果。
长期系数的解读要特别注意单位。比如解释变量是利率(百分比单位),系数0.25意味着利率每提高1个百分点,长期来看GDP增长会提高0.25个百分点。短期系数解读同理,但强调的是"短期波动的影响"。
5.2 Bounds检验结果的呈现方式
汇报Bounds检验结果时,需要包含:F统计量、显著性水平(1%、5%、10%)、对应的I(0)和I(1)两个临界值。通常用表格形式展示,然后说明F统计量落在哪个区间、结论是什么。
比如:"F统计量为6.87,高于5%显著性水平下的上界临界值4.35,因此拒绝不存在协整关系的原假设,表明变量间存在长期均衡关系。"这句话要写得清楚、不模棱两可。
5.3 残差诊断和稳定性检验的汇报
残差诊断部分至少要报告:LM自相关检验的p值、正态性检验(如果你做了)和异方差检验结果。这些指标证明你的模型设定是可靠的。稳定性检验部分,一般把CUSUM和CUSUMSQ图放上去,正文中用"曲线均在5%显著性水平临界线以内"这样的表述概括即可。
6. 置信区间之外的坑:从审稿意见回到数据本身
走到这一步,ARDL的整个流程基本跑通了。但作为经常和审稿人打交道的人,我还有几句掏心窝的话想讲。
审稿人对ARDL最常见的质疑,第一是"你有没有做单位根预检验",第二是"你的滞后阶数选择标准是什么",第三是"你的模型稳定性如何"。如果你提前把单位根检验、AIC/BIC选择过程、残差诊断和CUSUM检验都做扎实了,这几个问题基本都能给出满意的答复。
另一个大家容易忽略的细节是样本量的影响。Pesaran的临界值表是渐近临界值,样本量越小,结论越可能失真。Narayan (2005)提供了小样本临界值。如果你的样本量小于60,建议引用Narayan的临界值表,而不要直接套用Pesaran的大样本表。
还有一个实用建议是:不要把ARDL当成唯一的方法。如果结果特别敏感,换个滞后阶数结论就变,那就说明模型本身不够稳健。这时候可以尝试用动态最小二乘法(DOLS)或完全修正最小二乘法(FMOLS)做交叉验证,看看长期系数是否一致。一致性越高,结论越可信。
7. 完整Stata操作命令流:一份可直接复制运行的范本
为了方便你直接上手,我把整个流程整理成一份可以按顺序执行的命令流,以年度数据、4个变量为例。数据集只要包含year、gdp、inf、int、exr五个变量就能跑:
* 1. 时间序列声明 tsset year * 2. 单位根检验 dfuller gdp, lag(1) trend dfuller inf, lag(1) trend dfuller int, lag(1) trend dfuller exr, lag(1) trend dfuller D.gdp, lag(1) trend dfuller D.inf, lag(1) trend dfuller D.int, lag(1) trend dfuller D.exr, lag(1) trend * 3. 安装ARDL外部命令 ssc install ardl * 4. ARDL模型估计,选择最优滞后,输出Bounds检验和ECM ardl gdp inf int exr, lag(2) maxlag(4) aic bc ec * 5. 残差自相关检验 estat bgodfrey * 6. 模型稳定性检验 estat stability * 7. 保存估计结果 estimates store ardl_model跑完之后,你需要重点关注以下几个输出:
- 最优滞后阶数组合(比如ARDL(2,1,2,0));
- Bounds检验的F统计量和临界值比较结论;
- 长期系数的符号、大小和显著性;
- ECM项的系数是否为负且显著(这决定短期调整机制是否成立);
- bgodfrey检验的p值是否大于0.05(残差无自相关)。
如果以上几点都符合预期,那恭喜你,ARDL实证研究的主体工作就完成了。
根据我自己的实际经验,第一次跑ARDL通常不会一路顺畅。一个小建议是:拿到数据先别急着跑模型,先花半小时画图,用tsline命令画出每个变量的时间走势图,对数据的基本形态心里有数。很多异常结果,比如系数符号不对、Bounds检验不通过,看图往往比看统计量更能发现问题。数据是歪的、趋势是断的、样本期里有明显突变,这些预处理阶段的判断,才是整个ARDL分析里最有价值的部分。