动态面板空间杜宾模型:从静态到动态的MATLAB实现与实证指南
2026/9/24 23:52:46 网站建设 项目流程

简介:面向空间计量经济学研究者与高年级学生的动态空间杜宾模型MATLAB实现包,专注空间动态回归建模,支持时空滞后效应分析,区别于传统静态模型,可用于研究区域经济增长、产业集聚等面板数据中的空间溢出与时间动态特征。压缩包共19个文件,以12个M脚本为主,涵盖模型估计主函数(含SAR、SARAR变体)、配套示例与绘图输出脚本,另含4个xlsx数据文件及1份PDF说明文档,整体仅337KB,便于下载与快速上手。已有1948人学习使用,资源内含可直接运行的示例脚本、空间权重矩阵构造工具及生产率与集聚相关数据;读者对照PDF笔记逐步运行,可掌握动态空间面板模型的估计流程、结果解读与实战应用。适合需要开展空间计量实证研究或扩展论文模型的中高级用户。

1. 动态面板空间杜宾模型:空间计量里最值得下功夫的一类模型

动态面板空间杜宾模型(Dynamic Panel Spatial Durbin Model,简称动态 SDM),是静态空间杜宾模型在时间维度上的扩展,它同时在方程右侧加入被解释变量的一阶时间滞后、空间滞后以及时空滞后项,使得模型能同时捕捉时间惯性、空间溢出效应以及二者的交互影响。这个资源包给的不是空壳代码,而是一整套能在 MATLAB 里直接跑通的动态面板 SDM 实现:主程序 sar_jihai_time.m、似然函数 f2_sar_jihai_time.m、空间权重矩阵生成工具 wrook.m,外加一份说明动态面板极大似然估计原理的笔记 note-sdpd-mle.pdf。配套数据是某地区高技术产业生产率与集聚面板数据,非常适合正在做空间计量实证、写学位论文或投稿期刊的从业者,也适合刚入门空间面板、想对比静态模型与动态模型差异的初学者直接上手复现。

2. 为什么必须用动态空间杜宾模型:静态模型在时间维度上的三个先天短板

2.1 静态 SDM 只能给出"当期均衡关系",解释不了惯性

静态空间杜宾模型的经典设定是:

y = ρWy + Xβ + WXθ + ε

其中 ρ 是空间自回归系数,Wy 是空间滞后项,WX 是解释变量的空间滞后,θ 是空间溢出系数。静态模型本质上假设所有变量在同一期内同时决定,回归结果描述的是"均衡状态"下的空间交互关系。但现实中的经济数据几乎都有惯性——上一期的产出水平会深刻影响本期产出,上期的技术溢出也需要时间才能在空间上扩散。静态模型把时间项塞进扰动项里,导致两个直接后果:一是遗漏解释变量造成的内生性偏差,二是如果真实数据生成过程包含时间滞后,静态模型的系数估计就是非一致的。

动态 SDM 在方程右侧显式加入 yₜ₋₁,把时间惯性从扰动项里"捞"出来。以资源包中主程序 sar_jihai_time.m 对应的模型形式为例:

yₜ = τyₜ₋₁ + ρWyₜ + ηWyₜ₋₁ + Xₜβ + WXₜθ + μ + εₜ

其中 τ 是时间滞后系数,衡量惯性;ρ 是当期空间溢出;η 是时空滞后系数,衡量的是"上一期邻居的 y 对本期本地区 y 的影响"。这个设定比静态模型多出了三个维度的信息:时间惯性、空间溢出、以及两者交叉形成的时空扩散路径。

2.2 静态模型估计的空间溢出效应被"平均化",动态模型能区分短期与长期效应

静态 SDM 的空间溢出系数 θ 是一个"打包值",它无法区分溢出是当期发生的还是跨期累积的。例如地区 A 的研发投入提高 1%,对地区 B 产出的影响可能第一年为 0.3%,第二年积累到 0.8%,静态模型只能估计出一个两者平均后的数。动态面板 SDM 则能从估计出的 τ、ρ、η 中解析出短期直接效应、短期间接效应、长期直接效应、长期间接效应四个量。这对于政策评价极其关键——短期效应回答"当年见效多少",长期效应回答"稳态下累计见效多少"。

资源包中 note-sdpd-mle.pdf 的推导部分,核心就是在讲动态条件下极大似然函数中雅可比项的处理。因为静态 SDM 只需处理一次 ln|Iₙ − ρW|,而动态 SDM 每个时间截面都要处理 ln|Iₙ − ρW|,同时还要考虑初始值 y₁ 的分布设定。这个问题处理不好,估计结果就是有偏的,后面的效应分解全都建立在错误估计量上。

2.3 普通 OLS 和静态 ML 在动态空间设定下完全失效

空间面板模型中,Wyₜ 是内生的,因为它与 εₜ 相关;yₜ₋₁ 在加入个体固定效应 μ 后也是内生的(Nickell 偏误),而这种偏误在空间依赖下会被 ρ、η 进一步放大。OLS 估计动态面板空间模型时,τ 的偏误不会随着 N 增大而消失,只会在 T 增大时减弱。这就是为什么资源包宁可写极大似然——虽然 MLE 对分布假设敏感,但在小样本和典型空间面板设定下,它仍然比 GMM 更容易收敛、更稳定。sar_jihai.m 是静态版本,sar_jihai_time.m 是动态版本,两个程序并排放在包里,最适合做对比:把同一份数据分别跑静态和动态,看系数和显著性发生了哪些变化,这是理解动态模型价值的最快捷路径。

3. 跑通第一个动态面板空间杜宾模型:从压缩包到回归结果的全流程

3.1 压缩包内文件结构与功能定位

拿到压缩包后先别急着运行,花十分钟把文件分好类。这里给出我拆包后的文件对应关系:

文件/目录功能角色说明
sar_jihai.m静态 SAR 主程序不含解释变量 X 的纯空间自回归模型,适合做基准对照
sar_jihai_time.m动态 SAR 主程序含 yₜ₋₁、Wyₜ、Wyₜ₋₁ 的动态空间自回归模型
f_sar_jihai.m静态 SAR 似然函数被 sar_jihai.m 调用的目标函数,返回负对数似然值
f2_sar_jihai_time.m动态 SAR 似然函数动态模型的 MLE 目标函数,关键改动集中在这个文件
SARAR.mSARAR 模型主程序空间自回归带空间自相关误差项的模型,用于误差项存在空间依赖时的备选估计
prt_sardynamic.m动态结果输出工具格式化打印动态模型的系数、t 统计量、拟合优度
prt_sp.m / prt_reg.m通用结果输出工具宏观经济计量工具包中的通用打印函数
wrook.m空间权重矩阵生成器根据经纬度或邻接关系生成 Rook 一阶邻接权重矩阵
note-sdpd-mle.pdf方法笔记动态面板数据 MLE 推导笔记,建议在跑代码前通读一遍
data.xlsx面板数据被解释变量与解释变量的面板数据,按地区-年份排列
matrix.xlsx空间权重矩阵数据地区间空间关系的原始数据,需要读入后用 wrook.m 处理

实际运行中,main 入口建议使用 sar_jihai_example.m,因为它已经把数据读取、权重矩阵生成、模型估计、结果打印的完整流程串好了,可以避免自己拼 matlab 脚本时搞乱数据顺序。

3.2 示例脚本跑通完整估计:以 sar_jihai_example.m 为入口

在 MATLAB 中把当前路径切换到解压目录后,最直接的复现方式是写一个驱动脚本,按照以下逻辑执行。这里给出一个标准模板:

%% 清理工作区并设置路径 clear; clc; addpath('你的解压路径'); %% 读取面板数据与空间矩阵 data = readmatrix('data.xlsx'); % 第一列是地区ID,第二列是年份,其余列是变量 Wraw = readmatrix('matrix.xlsx'); % 原始空间邻接矩阵,非标准化形态 [n, T] = size(data); % n为地区数,T为年份数 y = reshape(data(:, 3), n, T); % 假设第3列是被解释变量,重塑成 n×T X = reshape(data(:, 4:end), n, T, size(data, 2) - 3);

这里有一个重要设计:面板数据在 Excel 中是"长格式"(每个地区-年份组合一行),但 MATLAB 估计程序需要的是"宽格式"(每个变量是 n×T 的矩阵)。reshape 操作正是完成这一步的。如果你的数据顺序稍有不同,务必先检查 data.xlsx 的列顺序,否则后续结果全部错位。

生成空间权重矩阵:

%% 生成标准化的 Rook 一阶邻接权重矩阵 W = wrook(Wraw); % 输入原始0-1邻接矩阵,输出行标准化后的W Wsp = sparse(W); % 转稀疏矩阵,提高后续矩阵运算效率

wrook.m 的逻辑是:先判断两个地区是否拥有公共边界,是则赋 1,否则赋 0;随后对每一行做行标准化,使每行元素之和为 1。行标准化后的权重矩阵可以保证空间滞后项 Wy 的经济含义为"邻居的加权平均"。

接下来调用动态模型估计:

%% 动态SAR模型估计 info.lflag = 0; % 0:精确对数行列式计算,1:近似计算 info.model = 1; % 1:个体固定效应,2:随机效应,3:时间固定效应 info.lndet = []; % 若已有预计算的lndet,可传入加速 result = sar_jihai_time(y, X, W, info); %% 打印结果 prt_sardynamic(result);

参数说明:info.lflag 控制对数行列式 ln|Iₙ − ρW| 的计算方式。精确计算在 n < 400 时完全可行;当 n 超过 500 或矩阵频繁迭代时,建议改为 info.lflag = 1 走蒙特卡洛近似,速度能提升数倍但精度会轻微下降。info.model 决定固定效应形式,个体固定效应是空间面板中使用最广泛的选择。prt_sardynamic 会输出 τ、ρ、η 的估计值及对应 t 统计量,还会报告 log-likelihood、R² 等信息。

%% 对照:同样数据跑静态SAR模型 info_static = info; result_static = sar_jihai(y, X, W, info_static); prt_sp(result_static);

对比两次输出的 Log-likelihood 和系数,你能直观看到引入动态项后模型拟合是否显著改善。这是论文中最常用来论证"动态模型优于静态模型"的关键证据。

3.3 权重矩阵的生成细节:直接影响所有估计结果的下游参数

权重矩阵是空间计量里最"玄学"的部分——同样的数据,换一种权重矩阵,ρ 和 η 的显著性可能完全翻转。wrook.m 生成的是一阶 Rook 邻接矩阵,适合基于地理邻接关系的产业集聚问题。如果你处理的是经济距离或引力模型,还需要改代码。这里给出 wrook.m 的核心逻辑:

function W = wrook(Wraw) % Wraw: 0-1邻接矩阵,Wraw(i,j)=1表示地区i与地区j相邻 n = size(Wraw, 1); W = Wraw; % 行标准化 for i = 1:n s = sum(W(i, :)); if s > 0 W(i, :) = W(i, :) / s; end end end

这个函数逻辑很简单,但有几个容易踩的细节:第一,Wraw 对角线必须是 0,自己不能算自己的邻居;第二,孤立地区(某一行全为 0)不会被标准化,对应行保持全 0,表示它没有邻居。如果你的数据样本里包含某个无邻接的地区,直接跑动态模型可能会出现 ρ 估计值异常,因为该地区的空间滞后项恒为 0,等同于一个异常值注入。建议在跑模型前先检查 sum(Wraw, 2) 是否出现 0 值。

4. 核心程序拆解:sar_jihai_time.m 与 f2_sar_jihai_time.m 的估计逻辑

4.1 动态空间自回归模型的 MLE 目标函数怎么写

理解动态 SDM 的估计逻辑,关键在于看 f2_sar_jihai_time.m 这个目标函数。动态模型的对数似然函数在经典静态基础上增加了时间滞后项的雅可比调整,整体形式为:

lnL = −(nT/2)ln(2πσ²) + T·ln|Iₙ − ρW| − (1/2σ²)·Σₜ eₜ' eₜ

其中 eₜ = yₜ − τyₜ₋₁ − ρWyₜ − ηWyₜ₋₁ − Xₜβ − WXₜθ − μ。代码实现时,为了减少矩阵运算量,会先用 Frisch-Waugh-Lovell 定理把固定效应 μ 消去,再对转换后的数据做迭代搜索。sar_jihai_time.m 的主体是两层循环:外层循环扫描候选 ρ 值(通常是在 (−1, 1) 区间内做 100 个格的网格搜索),内层用最小二乘快速计算给定 ρ 下的 β、τ、η、θ 和 σ²。最后取使似然值最大的 ρ 作为最优估计。

function llike = f2_sar_jihai_time(param, y, x, W, T, n, info) % param: [rho; beta; tau; eta; sigma2] 的列向量 rho = param(1); beta = param(2:1+size(x,2)); tau = param(end-3); eta = param(end-2); sigma2 = param(end); In = speye(n); A = In - rho * W; % 空间滤波矩阵 yt = y(:); % 将 y 拉成列向量 % 构建 H = y_t - tau*y_{t-1} - rho*W*y_t - eta*W*y_{t-1} % 这里需要按时间切片循环处理 e = zeros(n*T, 1); for t = 2:T y_prev = y(:, t-1); y_cur = y(:, t); Wy_cur = W * y_cur; Wy_prev = W * y_prev; X_cur = x(:, :, t); e((t-1)*n+1 : t*n) = A * y_cur - tau * y_prev - eta * Wy_prev ... - X_cur * beta; end % 对数似然值 llike = -(n*(T-1)/2)*log(2*pi*sigma2) + (T-1)*log(det(A)) ... - (1/(2*sigma2)) * (e' * e); llike = -llike; % 返回负值便于最小化 end

代码逻辑说明:目标函数接收参数向量 param,取出 ρ、β、τ、η、σ² 后构造残差向量 e。核心是循环中 A*y_cur − τ*y_prev − η*Wy_prev 这三项,分别对应当期空间滤波、时间惯性、时空滞后。注意这里没有直接写 WXθ 项,说明动态 SAR 模型和动态 SDM 在代码实现上有区别——SDM 还需要构造 WX 并追加到解释变量矩阵中,sar_jihai_time.m 名称里的 "sar" 表明它当前实现的是纯空间自回归结构,如果你需要用动态 SDM,需要手动把解释变量的空间滞后列拼接到 X 中。

4.2 初始值与迭代收敛:极大似然搜索中最容易被低估的环节

MLE 迭代的本质是在似然曲面上找峰,但这个曲面在 ρ 接近边界时非常平坦,导致搜索算法可能在 ρ = 0.95 和 ρ = 0.98 之间反复震荡。资源包中的 sar_jihai_time.m 采用了两阶段策略:第一阶段在 [−0.99, 0.99] 区间均匀取 30 个初始点,对每个点做一次完整迭代,选择似然值最高的结果作为最终迭代的初值;第二阶段使用 fminsearch 或 fminbnd 做精细搜索。这段逻辑实现如下:

% sar_jihai_time.m 内部的两阶段搜索示意 rmin = -0.99; rmax = 0.99; ngrid = 30; rgrid = linspace(rmin, rmax, ngrid); llmax = -inf; for i = 1:ngrid rho_init = rgrid(i); % 用当前rho初值计算条件最大似然 [ll, ~] = f2_sar_jihai_time([rho_init; beta0; tau0; eta0; sigma2_0], ... y, x, W, T, n, info); if ll > llmax llmax = ll; rho_best = rho_init; end end % 用rho_best作为最终搜索起点 param0 = [rho_best; beta0; tau0; eta0; sigma2_0]; options = optimset('Display', 'iter'); param_hat = fminsearch(@(p) f2_sar_jihai_time(p, y, x, W, T, n, info), ... param0, options);

参数说明:ngrid 是网格搜索密度,n 超过 200 时建议降到 20,否则每次网格点都调用一次似然函数,计算成本会很高。fminsearch 是 MATLAB 自带的 Nelder-Mead 算法,对不可导或含平坦区域的函数比较鲁棒。如果你发现迭代半天都不收敛,可以先检查目标函数是否返回了 NaN——这通常发生在线性代数运算中的矩阵接近奇异时,也就是 ρ 接近 1/W 最大特征值的倒数。

4.3 从静态到动态的改动对照:三行核心代码的区别

把 sar_jihai.m 与 sar_jihai_time.m 并排对比,差异非常集中。静态模型的似然函数中,残差构造为:

e = (Iₙ − ρW)y − Xβ

动态模型则多出两步:一是滞后项 yₜ₋₁ 进入解释变量集合;二是空间滞后项 Wyₜ₋₁ 也要进入。这意味着如果你仅仅在 sar_jihai.m 的代码里"加一列滞后 y"是远远不够的——还必须同步加入 Wyₜ₋₁,并在空间滤波矩阵 A 的处理上区分当期项与滞后项。很多初学者只加 yₜ₋₁,然后发现 η 估不出来或者显著性极差,原因就在这里。

正确的扩展方式是构造一个新的解释变量矩阵 Z = [yₜ₋₁, Wyₜ₋₁, Xₜ, WXₜ],然后估计:yₜ = ρWyₜ + Zδ + μ + εₜ。sar_jihai_time.m 内部实际做的就是这件事,f2_sar_jihai_time.m 的残差构造循环体现了这一点。

5. 避坑指南:动态面板空间杜宾模型最常见的五个翻车点

5.1 现象:τ 估计值接近 1,模型不收敛或结果异常

原因:被解释变量存在强烈的单位根或近单位根过程。动态面板模型要求 |τ| < 1 以保证稳定性,如果变量本身是 I(1) 过程(例如未经处理的产出水平值),τ 会无限接近 1,模型在边界处无法收敛。

解决:先对被解释变量做单位根检验,必要时取对数差分或增长率形式。产业集聚类数据通常用区位熵或密度指标,这些指标本身是平稳的,但如果直接用原始产值,极大可能翻车。另一个处理办法是加入时间趋势项,或者改用 longterm.m 对应的长期模型设定来缓解。

5.2 现象:ρ 总是被推到 0.99 以上,且网格搜索图完全不呈现单峰

原因:权重矩阵 W 与经济距离不匹配。Rook 邻接矩阵只考虑地理边界相接,如果研究的是产业间技术溢出,地理邻接可能根本无法有效刻画溢出渠道。此时 ρ 会被推高以弥补权重矩阵解释力度不足的问题。

解决:更换权重矩阵类型。常见的做法是构造经济距离权重矩阵——用地区间人均 GDP 差异的倒数作为权重;或者构造引力模型权重——用 GDP 乘积除以地理距离。更稳妥的做法是同时跑三套权重(Rook、Queen、经济距离),做敏感性分析,在论文中报告结果是否稳健。

5.3 现象:η 时空滞后项不显著,但理论上明显应该存在

原因:面板数据的年份间隔过大。如果 T = 5 且每期间隔 5 年,时空滞后效应可能已经在期內完全衰减,统计上捕捉不到。另一个常见原因是数据排列顺序错误——MATLAB 中如果 yₜ₋₁ 取成了同一年的另一列数据,η 自然不显著。

解决:检查数据排列。确认 data.xlsx 中每个地区的年份是严格连续的,并且 reshape 之后 y(:, t) 对应的是第 t 年。建议在估计前画出 y 的热力图,肉眼检查空间分布模式是否随时间推移出现明显的"波瓣状"扩散,如果有,说明时空滞后确实存在,η 不显著的问题在数据质量或权重矩阵上。

5.4 现象:静态模型和动态模型的系数符号完全相反

原因:动态模型中 τyₜ₋₁ 吸收了相当一部分原来静态模型中 X 的解释力。如果解释变量本身具有较强的惯性(例如研发投入历年变化不大),静态模型中 X 的系数包含了惯性成分,动态模型把惯性剥离给 τ 后,X 的系数可能缩小甚至变号。这是正常现象,不是代码 bug。

解决:在论文里解释清楚——静态模型估计的是"总效应",动态模型估计的是"净效应"。惯例是报告两套结果,并重点解释动态模型净效应的经济含义。如果动态模型中 β 由显著变不显著,说明该解释变量的影响主要通过惯性传导而非当期直接作用,这本身就是一个有价值的结论。

5.5 现象:运行时报错 "Insufficient number of observations" 或维度不匹配

原因:动态模型需要滞后项 yₜ₋₁,所以实际使用的观测是 T−1 个时间截面,而不是 T 个。如果程序中 y 和 X 的维度没有相应调整,就会出现矩阵乘法维度对不上。

解决:检查输入到 f2_sar_jihai_time.m 的 y 是否已经提前丢弃了第一年数据。有经验的写法是:

y = y(:, 2:end); % 丢弃第一期,因为需要 y_{t-1} 构造滞后 X = X(:, :, 2:end); T = T - 1;

然后重新估计。这一步遗忘是初学者报错的第一大原因,静态模型没有这个要求,所以从静态代码改动态时特别容易忽略。

6. 结果验证与进阶用法:动态 SDM 的效应分解与稳健性自检

6.1 先算直接效应与间接效应,再谈系数解释

动态空间杜宾模型的系数 β 不能直接解释为边际效应,因为空间溢出通过反馈循环会回到本地区。正确的做法是基于估计出的 τ、ρ、η、θ 求取偏导数矩阵。对于动态 SDM,第 t 期的短期直接效应是矩阵 (Iₙ − ρW)⁻¹(β + Wθ) 的对角线均值,短期间接效应是对角线外元素的行均值。长期效应则要在短期基础上除以 (1 − τ) 的调整因子,因为长期中时间惯性会持续放大影响。

在 MATLAB 中实现短期与长期效应分解:

%% 基于估计结果的效应分解 rho = result.rho; beta = result.beta; theta = result.theta; tau = result.tau; A_inv = inv(eye(n) - rho * W); % 短期直接效应与间接效应 short_mat = A_inv * (beta + theta); % 这里假设X是单变量,多变量时需逐变量构造 direct_short = mean(diag(short_mat)); indirect_short = mean(sum(short_mat, 2) - diag(short_mat)); % 长期效应(除以 1-tau 调整) long_mat = short_mat / (1 - tau); direct_long = mean(diag(long_mat)); indirect_long = mean(sum(long_mat, 2) - diag(long_mat)); fprintf('短期直接效应: %.4f\n', direct_short); fprintf('短期间接效应: %.4f\n', indirect_short); fprintf('长期直接效应: %.4f\n', direct_long); fprintf('长期间接效应: %.4f\n', indirect_long);

这段代码说明:效应分解的输出比系数本身更有说服力。如果间接效应显著而直接效应不显著,说明该变量主要通过空间溢出路径影响邻地。论文中报告这四个数字比单独罗列 β 更有冲击力。

6.2 稳健性检验的三个必做动作

做稳健性检验时,我一般强制自己走三关。第一关是换权重矩阵——把 Rook 换成 Queen 邻接或者经济距离权重,观察 ρ、η 显著性是否保持。第二关是换估计方法——用 SARAR.m 估计带空间自相关误差项的模型,看核心结论是否发生变化。第三关是改变动态项设定——尝试只含 yₜ₋₁ 不含 Wyₜ₋₁ 的模型,与完整动态模型做似然比检验。三个动作做完还稳健的结论,审稿人基本不会再在这上面做文章。

6.3 最终建议:跑模型前先跑一遍数据诊断

我现在每次拿到一份新的空间面板数据,都强制自己先花半小时做三件事:画被解释变量的时间趋势图,看是否存在明显的共同趋势;算一下变量的组内相关系数,判断固定效应与随机效应的选择;对空间权重矩阵做特征值检查,确保 ρ 的有效参数空间是 (−1/λ_min, 1/λ_max)。这三步看起来朴素,但能挡掉一大半后面的不收敛和假显著问题。

这些年拆过的空间计量代码包里,这套动态 SDM 的 MATLAB 实现是我见过少有的能直接跑通、又不靠黑箱命令的工具。它的价值不仅在代码本身,更在于那份 note-sdpd-mle.pdf 把动态面板模型的似然推导写得足够清楚,照着推一遍再回来看程序,每个函数都能对得上号。希望你也能在这套代码上跑出自己的结果,希望这次拆解帮你少走几个月的弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询