
做实证分析的人应该都清楚时间序列数据里最麻烦的一件事就是你手里的变量可能有的平稳、有的不平稳直接跑普通最小二乘容易得到伪回归可如果贸然做差分又会丢掉长期信息。ARDL自回归分布滞后模型之所以被大量使用就是因为它能同时处理长期均衡关系和短期动态调整还不用像传统协整方法那样要求所有变量必须同阶单整。这篇文章我会从模型原理讲到Stata实操结合一个完整案例把每一个命令、每一行输出都拆开讲清楚希望能帮你省掉自己翻文档、查贴吧的时间。1. 先搞明白ARDL到底在解决什么问题1.1 为什么我推荐ARDL传统的协整检验比如Engle-Granger两步法或者Johansen检验都有一个比较严格的前提所有变量必须是一阶单整也就是I(1)。但实际研究里哪有那么听话的数据很多宏观经济变量像GDP、能源消费、人口、投资有的原序列平稳I(0)有的差分后才平稳I(1)混在一起的情况非常常见。如果你非要把所有变量都差分成I(1)再去做协整长期关系就没了如果直接拿混着I(0)和I(1)的序列去做Johansen检验结果又不可信。ARDL模型的好处就在于它允许解释变量和被解释变量里同时存在I(0)和I(1)的序列只要没有I(2)就行。这一点在Pesaran和Shin1999、Pesaran、Shin和Smith2001的论文里已经给出了严格的证明。对于大多数做应用研究的人来说这意味着你可以先不纠结单位根检验的结果把建模流程大大简化。另外一个很实际的优点是ARDL在小样本下表现比Johansen检验好很多。Johansen检验本质上依赖VAR系统参数多对样本量要求高。ARDL本质上是一个单方程模型虽然在滞后结构上也需要一定自由度但比VAR省参数对30到60个观察值的宏观数据集来说相对友好。我试过用48个季度数据跑ARDL结果依然稳定换做Johansen就会比较勉强。1.2 模型的数学形式和数据要求ARDL的核心思想是同时把被解释变量的滞后项和解释变量的当前项、滞后项放进一个回归方程里。一个最简单的双变量形式可以写成Δy_t c0 Σφ_i·Δy_{t-i} Σβ_j·Δx_{t-j} θ1·y_{t-1} θ2·x_{t-1} ε_t这里的Σ部分刻画短期动态而θ1·y_{t-1} θ2·x_{t-1}这一组水平项则携带长期信息。如果θ1和θ2联合显著就说明变量之间存在长期均衡关系即协整长期系数就是 -θ2/θ1。也就是说ARDL用一个式子同时解决了长短期两个问题这也是它名字里“分布滞后”的由来——解释变量对被解释变量的影响不是一次到位而是分散在若干期里。做ARDL建模一般对数据有几个基本要求。第一时间维度不能太少我个人的底线是不少于30个观察值50个以上更稳第二必须是等间隔的时间序列数据年度、季度、月度都行但不要有缺失值突兀地断档第三变量不能是I(2)过程因为ARDL的临界值表是基于I(0)和I(1)混合情形推出来的遇到二阶单整整个边界检验就失效了。所以虽然ARDL免掉了同阶单整的预检验但单位根检验还是不能省。2. 建模前的数据准备和单位根检验2.1 变量怎么选、数据怎么整理选变量这件事看起来朴素其实决定成败。ARDL虽然是单方程模型但它的协整关系对变量集合很敏感少放一个重要变量长期关系可能测不出来多放一个无关变量又会增大标准误、压低F统计量。我自己做研究时的习惯是先画一张变量相关矩阵和散点图用简单的相关系数初步判断是否存在明显的协同变化趋势然后再结合经济理论确定进入模型的变量组合。别一上来就把七八个变量全塞进ARDL里那样滞后结构会变得非常臃肿小样本下基本跑不出稳定结果。数据整理层面时间序列最怕的是“隐式缺失”。比如你把不同来源的年度数据合并在一起一个序列从2000年开始另一个从2001年开始如果不统一样本区间软件可能只用到重叠部分甚至报错。所以我的建议是在建模之前用tset命令把时间变量设置好再用summary检查每个变量的样本范围。此外如果变量量级差异太大比如一个变量是几万亿美元另一个是百分之几的增长率建议取对数处理。对数化后系数可以解释为弹性也就是百分比变化之间的关系而且能在一定程度上缓解异方差的干扰。在Stata里准备数据的标准流程大概是这样的* 读取数据 use macro_data.dta, clear * 设定时间序列结构year为时间变量 tsset year * 生成对数变量 gen lngdp ln(gdp) gen lnenergy ln(energy) gen lnlabor ln(labor) gen lncapital ln(capital) * 检查样本范围 summarize lngdp lnenergy lnlabor lncapital2.2 ADF与PP单位根检验排除I(2)是关键一步前面说了ARDL不要求所有变量同阶单整但必须排除I(2)。所以在正式建模之前我一般会做两轮单位根检验先对原序列做ADF检验和PP检验再对一阶差分序列做同样的检验。如果某个变量原序列的检验p值大于0.05不拒绝单位根原假设一阶差分后p值小于0.05拒绝单位根原假设那它就是一阶单整I(1)如果原序列就已经拒绝单位根那它就是I(0)。有人可能会问既然ARDL允许混搭为什么还要做这个检验原因很简单一是为了排除I(2)二是为了检查是否有变量是I(0)却和一阶差分序列混在一起导致解释混乱。我见过有人直接把I(2)的变量放进ARDL结果边界检验的F统计量高得离谱长期系数符号也反直觉最后才发现那个变量是二阶差分才平稳的。ADF检验在Stata里的命令是dfullerPP检验是pperron。比如* ADF检验原序列 dfuller lngdp dfuller lnenergy * ADF检验一阶差分 dfuller d.lngdp dfuller d.lnenergy * PP检验原序列和一阶差分 pperron lngdp pperron d.lngdp这里有个细节dfuller和pperron默认都不含趋势项和常数项但宏观经济序列往往有确定性趋势。我的建议是先画时间趋势图如果序列明显向上或向下走ADF检验要选择带趋势项的选项也就是dfuller lngdp, trend。如果你不加趋势项一个明显有趋势的平稳序列可能被误判为有单位根然后你为了“稳妥”把它差分掉长期信息就白白损失了。把单位根检验结果整理成一个表放在论文或者报告里是很多期刊的基本要求。我一般会做成三列变量名、原序列检验p值、一阶差分检验p值最后加一列“结论”。这一步别偷懒后面所有解释都建立在“没有I(2)”这个前提上。3. Stata里的完整操作流程附案例3.1 安装ardl命令并准备数据Stata有一个专门做ARDL估计和边界检验的外部命令叫ardl由Kripfganz和Schneider开发可以在SSC上下载。安装命令很简单ssc install ardl需要说明的是ardl命令要求的Stata版本不能太老我印象里Stata 13以上基本都支持。如果安装时报错先去help ardl看一下依赖项是否齐全。为了把流程讲透我用一个简单的宏观经济案例来演示研究能源消费对经济增长的影响。变量设定为lngdp实际GDP的对数被解释变量lnenergy能源消费总量的对数lnlabor劳动力人数的对数lncapital资本存量的对数这是一个很经典的实证设定。资本和劳动是生产函数的基本投入能源作为额外投入加入。样本用的是1990年到2022年的年度数据共33个观察值刚好属于ARDL比较擅长处理的小样本范畴。数据准备完成后用tsset声明时间结构然后用ardl命令进行估计。先跑一个不考虑自动选滞后、手动设定各变量滞后阶数的版本* 手动指定y滞后2阶三个x都滞后1阶 ardl lngdp lnenergy lnlabor lncapital, lags(2 1 1 1) ecterm(ect)其中ecterm(ect)会生成误差修正项变量ect这个变量在后续误差修正模型里会用到建议一开始就写上。3.2 滞后阶数到底怎么选滞后阶数选择是ARDL建模里最让人纠结的一步。选少了残差可能残留自相关选多了自由度损耗严重系数估计精度下降。常见的做法主要有两种。第一种是手动指定。根据经济逻辑和样本频率年度数据通常滞后1到2阶就够季度数据可以放宽到4到8阶。手动指定有一个前提估计完之后一定要做残差自相关检验。如果自相关还存在就说明滞后阶数可能不够。第二种是使用信息准则自动选择。ardl命令支持aic和bic选项配合maxlags()指定最大滞后阶数让软件在给定范围内自动选出信息准则最小的模型。比如* 自动选择最多允许4阶滞后 ardl lngdp lnenergy lnlabor lncapital, maxlags(4) aic这里有个坑需要注意如果变量多、maxlags又大自动搜索的组合数量会非常大计算会比较慢而且AIC和BIC选出来的结果常常不一致。AIC更倾向于选择较大的滞后阶数因为它对参数惩罚比较轻适合预测导向的模型BIC惩罚更重在小样本下更容易选出简约模型。我的经验是如果AIC和BIC选出的滞后阶数不同看样本量。样本量小比如30左右优先信BIC样本量在80以上可以优先信AIC。选完之后再用手动指定该阶数的模型跑一遍同时做自相关检验确认残差是白噪声。另外如果你的核心解释变量只有一个或者样本量有限我建议不要对所有变量用同一滞后阶数。可以试几个组合比如lags(1 2 2 1)和lags(2 1 1 2)比较一下信息准则和诊断检验结果。这种“人工网格搜索”配合信息准则有时候比纯自动搜索更可靠因为你知道每个变量各自的经济意义比如政策变量的影响往往有较长时滞滞后阶数可以适当放宽。3.3 边界检验判定长期协整关系是否存在ARDL模型最关键的检验就是边界检验Bounds Test。检验的原假设是“不存在长期均衡关系”具体到模型里就是θ1 θ2 ... 0所有水平滞后项系数联合为0。Stata的ardl命令在估计结束后会直接输出边界检验的F统计量和对应临界值不需要你手动算。一个典型的输出会包含F统计量显著性水平1%、5%、10%对应的I(0)临界值和I(1)临界值可能还有一个t统计量检验判断规则也很明确如果F统计量大于I(1)临界值拒绝原假设说明存在长期关系如果F统计量小于I(0)临界值不能拒绝原假设说明没有协整如果F统计量落在两者之间属于“不确定区间”就需要参考t统计量或者结合经济理论和后续的误差修正项显著性来做判断。在我这个案例里假设输出结果显示F统计量为6.825%显著性水平下I(0)临界值为3.23I(1)临界值为4.35。因为6.82 4.35所以拒绝“没有长期关系”的原假设说明能源消费、劳动、资本与GDP之间存在长期均衡关系。这个结果对于研究能源与增长的关系来说是一个挺关键的证据。需要注意的是边界检验的临界值会随模型设定变化而变化。你的模型里是否包含常数项、是否包含时间趋势项都会影响临界值。Pesaran et al.2001把模型分成五种情形无常数项无趋势、有常数项无趋势、有常数项有趋势、无常数项有趋势等等。在Stata的ardl命令中你可以通过选项来控制是否加入趋势项。如果GDP这类变量有明显的随时间上升趋势那在模型里加一个trend选项是合理的临界值也会相应调整。不要无视趋势项就直接用默认临界值。3.4 读取长期与短期系数、计算误差修正项确认存在长期关系后下一步就是解释长期和短期系数。Stata的ardl命令会直接报告长期系数long-run coefficients这一列通常有个醒目的小标题下面列出每个解释变量对应的长期弹性。以我的案例来说假设lnenergy的长期系数是0.43含义是长期来看能源消费每增加1%GDP平均增加0.43%。这就是你写论文时放在核心结果位置的那个数字。短期动态关系则体现在差分项的系数上反映的是变量在当期和前几期的变动对GDP增长的即时影响。这部分系数一般比较小符合现实直觉——能源消费冲击对经济增长的影响本来就存在时滞不可能当期全部到位。误差修正项ECM是另一个关键输出。ecterm(ect)选项会创建变量ect它的滞后一期系数也就是误差修正速度通常为负界于-1和0之间。如果这个系数是-0.35含义是当GDP偏离长期均衡状态时系统每年会以35%的速度向均衡回调整。这个值的经济学解释很直观——短期冲击会被逐渐消化但不会立刻消失。你要检查这个系数的t统计量是否显著如果误差修正项系数不显著那说明即使边界检验通过短期调整机制也可能存在问题需要重新审视模型设定。更进一步如果你想把误差修正方程单独拿出来报告可以基于ardl估计得到的变量自己构建ECM方程* 生成一阶差分变量 gen d_lngdp d.lngdp gen d_lnenergy d.lnenergy gen d_lnlabor d.lnlabor gen d_lncapital d.lncapital * 用滞后一期的误差修正项跑OLS regress d_lngdp d_lnenergy d_lnlabor d_lncapital L.ect这里L.ect是误差修正项的一阶滞后它的系数应该和ardl输出里的ECM系数一致或非常接近。单独跑一下的好处是你可以很方便地保存残差继续做后续的诊断检验也可以把标准误和其他变量一起整理成规范的表格。4. 模型诊断与稳定性检验4.1 残差自相关、异方差和正态性检验ARDL模型再好如果残差不满足经典假设系数的标准误和显著性判断都不可信。所以模型估计完成后诊断测试是必须的一环尤其是自相关检验。自相关最直接的检验是BGBreusch-Godfrey拉格朗日乘数检验在Stata里的命令是estat bgodfrey。滞后阶数一般选1到2阶* 自相关检验 estat bgodfrey, lags(1 2)如果你的残差存在自相关优先考虑增加滞后阶数而不是直接换模型。还有一种情况是遗漏了重要解释变量导致残差里有未被解释的结构性信息这时候单纯加滞后解决不了问题得回头改模型设定。异方差检验常用的是Breusch-Pagan检验estat hettest如果p值很小说明存在异方差稳健的做法是用稳健标准误重新估计或者用ARDL命令中带robust选项的版本。不过要注意在有限样本下稳健标准误可能会让小样本推断变得更保守需要结合样本量权衡。正态性检验可以用sktest或者swilksktest residStata的ardl命令估计完成后一般会保存残差变量。如果没保存你可以用predict e, resid把残差提出来。注意残差项的平稳性也可以顺带看一下如果残差序列仍然有强烈的趋势或单位根特征那说明模型设定有问题。4.2 参数稳定性CUSUM与CUSUMSQ时间序列建模里很多人忽略了一个问题模型参数在整个样本期内是不是稳定的如果1990年到2022年之间发生了明显的结构变化比如政策调整、经济危机那么用一个固定系数的模型解释全过程就很不合适。ARDL框架下常用的稳定性检验是CUSUM累积和控制图和CUSUMSQ累积平方和控制图。这两个检验的基本思想是利用递归残差或累积残差判断模型系数是否存在系统性漂移。通常CUSUM图关注系数的均值漂移CUSUMSQ图关注系数的方差漂移。如果累积和曲线始终位于5%显著性水平的边界线以内就说明参数是稳定的。在Stata里我一般用cusum6这个外部命令安装方式同样是ssc install cusum6然后cusum6 lngdp lnenergy lnlabor lncapital它会同时画出CUSUM和CUSUMSQ图。如果你的Stata版本不支持也可以先估计模型、保存残差再手工作图。这里有一个容易被忽视的细节CUSUM检验对样本顺序很敏感所以你在跑之前务必确认tsset的时间顺序是正确的不然画出来的图毫无意义。如果CUSUM图明显出界说明模型可能存在结构性断点。解决思路有两个一是加入虚拟变量或时间趋势项重新估计二是把样本分段。不过分段后样本量又会减少所以很多时候更实际的选择是在模型里加入结构突变虚拟变量再重新做边界检验。5. 常见问题与排查技巧实录5.1 高频问题和解决办法速查我把自己实际使用中遇到的坑以及身边朋友问过最多的问题整理成一张速查表方便你直接对照排查。问题现象可能原因解决办法ssc install ardl报错Stata版本过旧或网络问题升级Stata到13以上重新安装边界检验F值落在I(0)和I(1)之间不确定区间样本量不足或滞后结构不当参考t统计量或者调整滞后阶数后再试误差修正项系数不显著长期关系微弱或模型遗漏关键变量重新审视变量集合检查是否存在遗漏变量残差存在自相关滞后阶数不够将滞后阶数加1到2阶重新估计加入trend项后结果完全变了时间趋势与经济变量之间共线性强对比有无趋势项的结果依据经济逻辑选择自动选滞后时AIC和BIC给不同阶数信息准则惩罚机制不同小样本优先BIC大样本优先AIC某个变量的系数符号与经济理论相反可能有多重共线性或变量遗漏计算VIF检查变量间的相关性必要时剔除变量数据频率是月度但手动设lags(1)滞后阶数与数据频率不匹配月度数据试6或12阶季度数据试4阶5.2 我踩过的坑和几点实用建议第一个坑没做单位根检验就直接跑ARDL结果边界检验F值大得离谱。后来才发现有个变量是I(2)过程价格指数类的变量尤其常见。所以哪怕ARDL对I(0)、I(1)混搭很宽容也一定要先跑dfuller和pperron。如果你发现某个变量的一阶差分仍然不是平稳的宁可换指标也别硬塞进去。第二个坑自动选滞后阶数的时候直接用了maxlags(8)结果电脑跑了十分钟还没停下来。后来明白过来变量有四个、最大滞后八阶组合数量是指数级增长如果还想让软件搜索每个变量的不同滞后计算量非常可观。现在我的习惯是先看样本量和数据频率年度数据最多设maxlags(4)季度数据最多设maxlags(8)并且不会同时让四五个变量全部参与自由搜索。第三个坑在分析结果时只报了长期系数忽略了短期动态和误差修正项。实际上很多期刊审稿人会特别在意误差修正速度因为它能反映经济系统自我修复的能力。尤其当你研究政策冲击、能源价格变动这类问题时ECT系数的大小直接决定了政策效应的持续性。我建议在最终报告里至少给出以下信息滞后结构、边界检验F统计量、长期系数、短期系数、ECT项系数及其显著性、残差诊断结果、CUSUM稳定性图。最后再分享一个小技巧在写论文或报告时尽量把ARDL的完整设定写清楚比如“ARDL(2,1,1,1)”这类表示方法。审稿人看到清晰的模型设定往往就不会追着你问为什么不用VECM。至于边界检验临界值表可以引用Pesaran et al.2001的原文也可以直接报告Stata输出的临界值。我个人在实际操作中的体会是ARDL更像是一个聪明的折中方案它保留了误差修正模型对长期均衡的重视又避免了传统协整方法对单整阶数的严苛要求。只要你的数据里没有I(2)样本量又不是特别小那ARDL几乎总能给出一个逻辑自洽、容易解释的结果。把这个模型用透应对宏观经济、金融、能源环境等大多数时间序列研究都够用了。