简介:这份资源面向需要开展空间计量与空间自相关分析的Stata用户,尤其适合经济学、地理学、区域研究等方向的研究生与科研人员。内容围绕莫兰指数的完整计算流程展开,涵盖程序包安装、空间权重文件的读取与标准化、全局与局部莫兰指数的计算,以及莫兰散点图的绘制,并给出批量处理多年份变量的命令写法,帮助读者快速上手空间数据分析。资源包共1个文件,为docx文档,大小约14KB,以文字与命令示例为主,便于对照操作与查阅。目前已有1969人学习下载,说明其在空间统计入门群体中具有一定参考价值。读者可据此掌握从权重构建到结果可视化的关键环节,理解单尾检验、权重标准化等细节,并借助带汉字标识的散点图直观呈现区域空间集聚特征,为后续空间计量建模打下基础。
1. 空间自相关从一张 Excel 表开始:莫兰指数到底在算什么
手里有一份全国各省份的某项指标数据,领导问「这东西有没有空间聚集性」,你打开 Stata 却不知道从哪下手——这是很多人第一次接触莫兰指数的真实场景。莫兰指数(Moran's I)本质上是把「相邻地区的指标值是否相似」量化成一个介于 -1 到 1 之间的数:大于 0 说明高值与高值扎堆、低值与低值扎堆,小于 0 说明高低交错,接近 0 则近似随机分布。它解决的是「空间上有没有规律」这个问题,而不是「为什么有规律」。适合做区域经济、房价、环境监测、公共卫生等带地理属性的数据分析的人。Stata 本身没有内置莫兰指数命令,需要靠第三方命令加空间权重矩阵配合完成,这也是很多人卡住的地方。下面按「准备数据 → 建权重 → 算指数 → 画图 → 排错」的顺序,把每一步落到可复现的命令上。
2. 数据准备与空间权重矩阵:莫兰指数的地基怎么打
莫兰指数的计算依赖两个输入:一份带地区标识和指标值的面板或截面数据,以及一个描述地区间邻接关系的空间权重矩阵。矩阵建错了,后面所有结果都是空中楼阁,所以这一章先把地基打牢。
2.1 数据格式要求与地区编码对齐
Stata 里做空间分析,数据必须是每个地区一行的截面数据(如果是面板数据,需要先按年份拆开或固定某一年)。关键字段有两个:一个是地区唯一标识(比如行政区划代码),一个是你要分析的指标变量。地区标识建议用字符串或数值编码都行,但必须和后面权重矩阵的行列顺序严格对应。
常见做法是先把数据存成一份带id和y两列的 dta 文件。假设原始数据在 Excel 里,地区名是中文,先导入并检查:
* 导入 Excel 数据,首行作为变量名 import excel "region_data.xlsx", firstrow clear * 查看数据结构:确认每个地区一行 list id y in 1/10 * 检查是否有缺失值,缺失会直接导致莫兰指数算不出来 misstable summarize y * 给数据编号,生成连续的行号,方便和权重矩阵对齐 gen row_id = _n这段代码的逻辑是:先导入并肉眼确认前 10 行,再用misstable排查缺失,最后生成一个连续行号row_id。参数说明:firstrow表示 Excel 第一行是变量名;clear表示替换内存中已有数据。row_id这个变量后面建矩阵时会反复用到,因为 Stata 的空间权重矩阵本质上是按行号索引的,不是按地区名索引的。
注意:如果指标变量存在缺失值,
spatwmat或spregress系列命令会直接报错或静默丢弃观测,务必先处理干净。
2.2 用 spatwmat 手工构建邻接权重矩阵
Stata 建空间权重矩阵最直接的方式是用spatwmat命令,它接受一个纯文本或矩阵形式的邻接关系。邻接关系有两种常见定义:Rook 邻接(共边才算相邻)和 Queen 邻接(共边或共点都算相邻)。对于省份这种规则网格,Queen 更常用。
假设有 31 个地区,你需要准备一个 31×31 的 0/1 矩阵,1 表示相邻,0 表示不相邻。可以先用 Excel 或 Python 生成这个矩阵,存成空格分隔的 txt,然后:
* 安装空间分析命令包(只需装一次) ssc install spatwmat, replace ssc install spatgsa, replace * 从文本文件读入空间权重矩阵,生成 Stata 矩阵 W spatwmat using "weight_matrix.txt", name(W) standardize * 查看矩阵维度,确认是 31x31 matrix list W逻辑说明:spatwmat把外部邻接矩阵读进 Stata 并命名为W。参数standardize是关键——它把每一行元素除以该行之和,使每行权重加起来等于 1。标准化后的矩阵在计算莫兰指数时能避免因为某些地区邻居多、某些邻居少而带来的偏差。如果你不做标准化,邻居多的地区会被过度加权,结果解释起来就变味了。
name(W)是给矩阵起名,后面spatgsa调用时要对应。matrix list W用来确认维度,如果显示的不是 31×31,说明你的 txt 文件行列数或分隔符有问题,常见的是多了一个空行或用了逗号分隔。
2.3 用 spmatrix 从 shapefile 或坐标自动生成权重
手工敲 31×31 矩阵还能忍,上百个地区就不现实了。更省事的做法是用spmatrix系列命令,从经纬度或 shapefile 自动生成距离阈值权重或 k 近邻权重。
* 安装 spmatrix 命令 ssc install spmatrix, replace * 假设数据里有经度 lon 和纬度 lat 两个变量 * 生成基于距离阈值的空间权重矩阵,阈值设为 500 公里 spmatrix create contiguity W using "region_shapefile.shp", replace * 或者用 k 近邻:每个地区取最近的 5 个邻居 spmatrix create knn W_knn, k(5) replace * 查看生成的矩阵摘要 spmatrix summarize W逻辑说明:spmatrix create contiguity从 shapefile 读取多边形边界,自动判断哪些地区共边或共点。spmatrix create knn则基于坐标计算距离,每个地区只保留最近的 k 个邻居。参数k(5)里的 5 是邻居数量,这个值没有绝对标准,一般取 3 到 8 之间,取太小矩阵稀疏、取太大失去「局部」意义。replace表示覆盖同名矩阵。
注意:
spmatrix生成的矩阵默认是逆距离加权或二值邻接,和spatwmat的标准化逻辑不完全一样。如果你后面用spatgsa算莫兰指数,建议统一用spatwmat读入并标准化,避免两套命令的矩阵语义打架。
3. 莫兰指数计算与显著性检验:从 spatgsa 到结果解读
矩阵建好之后,核心计算其实只有一行命令,但结果怎么读、p 值怎么来的、什么时候该怀疑结果,才是真正拉开差距的地方。
3.1 spatgsa 计算全局莫兰指数
spatgsa是 Stata 里算全局空间自相关最常用的命令,支持莫兰指数、Geary's C 等多种统计量。
* 计算全局莫兰指数,权重矩阵用之前生成的 W spatgsa y, weights(W) moran * 同时输出多种统计量做对比 spatgsa y, weights(W) moran geary twotail逻辑说明:y是你要分析的指标变量,weights(W)指定权重矩阵,moran表示计算莫兰指数。geary会额外输出 Geary's C,twotail表示双尾检验。输出结果里你会看到 Moran's I 的值、期望值 E(I)、标准差、z 值和 p 值。
参数解读:莫兰指数的期望值在随机分布假设下是 -1/(n-1),n 是地区数。31 个地区时期望值约 -0.033。如果你的 I 值显著大于这个期望值(z 为正且 p < 0.05),说明存在空间正相关;显著小于则说明空间负相关。z 值在 1.96 以上或 -1.96 以下对应 5% 显著性水平,这是最常用的判断门槛。
3.2 结果表格与参数含义对照
把spatgsa的输出拆开看,每个数字都有明确含义:
| 输出项 | 含义 | 判断标准 |
|---|---|---|
| Moran's I | 空间自相关系数 | 范围约 -1 到 1,越远离期望值越显著 |
| E(I) | 随机假设下的期望值 | 等于 -1/(n-1),n 为地区数 |
| sd(I) | 标准差 | 用于构造 z 统计量 |
| z | 标准化统计量 | 绝对值大于 1.96 对应 5% 显著 |
| p-value | 显著性概率 | 小于 0.05 拒绝随机分布假设 |
这张表建议直接抄进你的分析笔记。实际写报告时,不要只报一个 I 值,要把 z 和 p 一起放上去,否则审稿人或领导会追问「这个 0.3 算高还是低」。
3.3 局部莫兰指数与莫兰散点图
全局莫兰指数只告诉你整体有没有聚集,不告诉你哪里聚集。局部莫兰指数(LISA)和莫兰散点图就是干这个的。
* 计算局部莫兰指数,识别高-高、低-低等局部聚集类型 spatgsa y, weights(W) moran local * 画莫兰散点图,横轴是变量值,纵轴是空间滞后值 spatlsa y, weights(W) moran graph(moran) symbol(id)逻辑说明:local选项让spatgsa输出每个地区的局部莫兰指数和对应的显著性。spatlsa是专门做局部空间自相关的命令,graph(moran)直接画出散点图,symbol(id)用地区标识标注每个点。
莫兰散点图分四个象限:右上角是「高-高」聚集(高值地区被高值邻居包围),左下角是「低-低」聚集,左上角是「低-高」异常(低值被高值包围),右下角是「高-低」异常。落在右上和左下的点越多,全局莫兰指数就越大。这张图在写区域分析报告时非常直观,比一堆数字更有说服力。
注意:局部莫兰指数做多重比较时假阳性率会上升,建议对 p 值做 Bonferroni 或 FDR 校正,否则你会得到一堆「显著」的假聚集。
4. 避坑与排查:莫兰指数算不出来时先看这五条
这一章是我自己踩过的坑和帮别人排查时最高频的问题,按「现象 → 原因 → 解决」整理,遇到报错先对着查。
现象一:命令报错「matrix W not found」。原因:spatwmat读入矩阵时命名和后面调用不一致,或者矩阵没成功读入。 解决:先matrix list W确认矩阵存在且维度正确。如果不存在,检查 txt 文件路径是否含中文或空格,Stata 对路径比较敏感,建议放在纯英文路径下。
现象二:莫兰指数算出来是缺失值.。原因:指标变量y里有缺失值,或者权重矩阵某一行全为 0(孤立地区)。 解决:misstable summarize y查缺失,spatwmat后检查矩阵是否有全零行。孤立地区要么补上邻接关系,要么从样本中剔除。
现象三:z 值很大但 p 值不显著,或者反过来。原因:用了单尾检验但按双尾解读,或者权重矩阵没有标准化导致方差估计异常。 解决:统一用twotail选项,并在spatwmat时加standardize。如果还不一致,检查地区数 n 是否太小,n 小于 15 时莫兰指数的正态近似不可靠,建议用随机化推断。
现象四:全局莫兰指数显著,但局部莫兰指数一个显著地区都没有。原因:全局显著可能由少数极端值驱动,局部检验经过多重比较校正后就不显著了。 解决:先看莫兰散点图,确认是否有离群点。如果有,考虑对y做对数变换或缩尾处理,再重新计算。
现象五:换了权重矩阵定义后结果符号反转。原因:Rook 邻接和 Queen 邻接、距离阈值和 k 近邻,对「邻居」的定义不同,结果敏感是正常的。 解决:不要只报一个矩阵的结果。稳健的做法是同时用两种矩阵算一遍,如果符号和显著性一致,结论才站得住;如果反转,说明你的结论对权重设定敏感,需要在报告里说明。
5. 从显著到可解释:把莫兰指数写进分析报告的三个技巧
算出一个显著的莫兰指数只是起点,真正难的是把它翻译成别人能听懂、能决策的结论。我自己的习惯是:先看散点图定类型,再看局部结果定区域,最后做敏感性分析定信心。
第一个技巧是用散点图定故事线。莫兰散点图右上角密集,故事就是「高值区域连片,存在正向溢出」;左上角有异常点,故事就是「某地区被高值包围但自身偏低,可能是政策洼地」。图比数字好讲,先把图截出来,再往图上套解释。
第二个技巧是局部结果按象限分类汇总。不要逐个地区念局部莫兰指数,而是把地区按「高-高」「低-低」「高-低」「低-高」四类分组,每组报几个代表地区。这样报告结构清晰,听众也能记住。
第三个技巧是做权重矩阵敏感性对照。下面这段代码可以一次性跑两种矩阵并对比结果:
* 矩阵一:Queen 邻接标准化 spatwmat using "queen_matrix.txt", name(Wq) standardize spatgsa y, weights(Wq) moran twotail * 矩阵二:k 近邻 k=5 spatwmat using "knn5_matrix.txt", name(Wk) standardize spatgsa y, weights(Wk) moran twotail * 对比两次输出的 I 值、z 值和 p 值,记录在报告里逻辑说明:两套矩阵分别读入、分别计算,输出结果并排看。如果两次都显著且符号一致,你可以在报告里写「结果对权重设定稳健」;如果只有一套显著,就要老实说明「结论依赖于邻接定义,需谨慎解读」。参数上,standardize两次都要加,保证可比性。
最后一个习惯:永远把原始数据、权重矩阵文件和 do 文件放在同一个项目文件夹里,用相对路径引用。我见过太多人换了电脑就跑不出结果,因为路径写的是绝对路径。do 文件开头加一行cd "项目文件夹路径",后面全部用相对路径,这是最省后悔药的做法。
希望帮到你。
本文还有配套的精品资源,点击获取