简介:面向空间计量学入门学习者的GeoDa实操案例数据包,涵盖空间依赖性、空间异质性、空间权重矩阵、Moran's I全局与局部统计、空间滞后/误差模型及地理加权回归等方法的入门应用。文件总计17个,以GeoDa可直接加载的Shapefile(.shp/.dbf/.shx)为主,配合sbn/sbx空间索引、HTML说明页面与PDF补充文档,压缩包仅1.13MB,轻量便捷。已有437人浏览学习,适合地理信息系统、区域科学及城市经济地理方向的学生和研究人员。借助圣路易斯、萨克拉门托等案例数据,可练习数据整理、空间自相关检验、热点识别、回归建模与地图可视化,掌握从探索性分析到结果解读的完整流程。
1. 空间计量学入门:先别啃公式,让 GeoDa 把数据跑给你看
空间计量学入门最让人头疼的,不是公式本身,而是公式对应的地图直觉迟迟建立不起来。教材一上来就摆空间权重矩阵、空间滞后项、拉格朗日乘数检验,术语密度太高,很多人在第一步就放弃了。我见过不少同学卡在“为什么我算出的 Moran’s I 和教材不一样”这种问题上,其实多半不是算错,而是权重矩阵或数据 ID 没对齐。
GeoDa 把这扇门撬开了一条缝:它免费、图形化,空间权重矩阵、全局 Moran、LISA、空间回归都能在一个界面里点出来,不用写代码就能看到完整结果。这个空间计量学入门与 GeoDa 软件应用案例数据 zip 包,正好是围绕这套工具组织的练习材料,包含边界数据、示例属性和典型操作路径,适合第一次碰空间分析、正在写论文的同学按顺序复现。
这篇笔记按实际操作顺序展开:解压数据、建权重矩阵、跑莫兰指数和 LISA、做空间回归,最后把踩过的坑集中列出来。你不需要提前掌握矩阵推导,会装 GeoDa、认得清 shp 和 CSV 就够了。
2. 空间权重矩阵:解压后第一件事,把数据 ID 和邻接关系对齐
2.1 空间权重矩阵是骨,不是可有可无的细节
空间计量和普通回归最大的区别,就是多了一张空间权重矩阵 W。它 n 行 n 列,n 是样本区域个数,第 i 行第 j 列表示 j 对 i 的空间影响。Moran 指数的分子要乘 W,空间回归里的空间滞后项 W·y 也要用到 W,所以权重矩阵一旦建错,后面每一步都是错的,而且错误通常不报错,只输出一个“看似合理但跟预期完全对不上”的结果。
挑选权重类型的逻辑并不复杂。用省级面板、市辖区这类边界整齐的行政区划时,Queen 邻接最直观,共点或共边都算邻居;网格状或街区形态的数据用 Rook 邻接更严谨,只认共边;点位型数据,比如企业数据、气象站数据,用距离阈值或 K 近邻更合理。四种常见类型对比如下:
| 权重类型 | 构建逻辑 | 适用场景 | 注意点 |
|---|---|---|---|
| Queen 邻接 | 共点或共边都算邻居 | 省、市、区县边界数据 | 可能出现孤岛单元 |
| Rook 邻接 | 只共边才算邻居 | 网格状、街区型数据 | 对角线接触会被忽略 |
| 距离阈值 | 距离小于阈值算邻居 | 企业、采样点等点位数据 | 阈值选择敏感 |
| K 近邻 | 每个区域取最近的 K 个 | 形状差异大、有孤岛的数据 | K 太大会引入远距离关系 |
对刚入门的人,我先建议只记住一条:先用 Queen 一阶邻接 + 行标准化把全流程跑通,等理解了结果,再回来试 K 近邻和距离阈值。不要一开始就同时比较十几种权重,那是稳健性检验阶段才做的事。
2.2 解压 zip 包并确认数据文件
无论案例包从哪里下载,第一步永远是完整解压到一个独立目录。我习惯在用户目录下建一个 spatial_lab 之类的英文目录,而不是直接解压到桌面,因为 GeoDa 对全角空格、中文路径和深层嵌套目录的兼容性不稳定,Windows 上遇到中文目录容易直接打不开 shapefile。解压命令如下:
mkdir -p ~/spatial_lab unzip 空间计量学入门与GeoDa软件应用案例数据.zip -d ~/spatial_lab/ cd ~/spatial_lab ls -la-d 参数把文件统一释放到指定目录,避免 zip 内部的多级目录把项目拆得七零八落;mkdir -p 保证目标目录存在。解压后不要急着启动 GeoDa,先检查解压出来的文件结构。一个典型的空间计量案例包至少包含四部分:.shp 边界几何文件、.dbf 属性表、.shx 索引文件,以及 .csv 或 .dbf 格式的统计指标;整理得完整的还会带权重文件 .gal/.gwt 和工程文件 .gda。用 ls 看得不放心,可以再用 file 命令确认文件不是空壳:
file *.shp *.dbf *.csv如果输出里出现 empty file 或 broken,说明 zip 包在传输或解压过程中出了问题,换一个解压工具重新解压即可。这里还有个常见的理解误差:GeoDa 里的“打开数据”并不等于“打开 Excel 表格”,它必须有一份带空间位置的边界文件兜底,光有 CSV 是画不出地图的。如果压缩包里带 .gda 工程文件,直接双击它进 GeoDa 即可;没有的话,就按下面的 Shapefile 流程走。
2.3 在 GeoDa 里创建一份可用的 Queen 邻接权重
打开 GeoDa 后,通过 File → Open → Shapefile 选中刚才解压的 .shp。打开后左侧是地图窗口,右侧是属性表窗口,这时候先别急着做分析,先确认属性表里有没有一个唯一且无空值的 ID 字段。省/县代码、统计代码都行,但必须是整数类型。
随后从菜单打开 Tools → Weights Manager,在权重管理器中点 Create,按下面几步设置:
- 权重类型选择 Contiguity Weight;
- 阶数 Order 写 1,邻接规则选 Queen Contiguity;
- ID 变量选择刚才确认好的整数代码字段;
- 保存路径保持默认,权重文件会以 .gal 后缀写到磁盘;
- 点击 Create,回到 Weights Manager 主面板,确认总样本数与属性表行数一致。
完成后最重要的一件事,是打开权重文件看一眼,别直接进入分析。.gal 文件是纯文本,用文本编辑器就能看到:
"province_weight.GAL" 31 31 1 3 2 3 4 2 3 1 4 5 3 4 1 2 5 6第一行是文件名,第二行前半是区域总数;从第三行开始,每一行第一个数字是区域 ID,第二个数字是邻居个数,后面跟着的就是邻居 ID 列表。我一般会重点检查有没有“第二个数字是 0”的行,那意味着某个区域在 Queen 邻接下没有邻居,也就是孤岛单元,后续分析会因此出问题。权重矩阵的对齐检查,应该像做数据清洗一样固定下来。
2.4 行标准化:默认勾选别关掉
创建权重时,GeoDa 会默认勾上 Row-standardize。不要手痒关掉它。行标准化的意思是,把权重矩阵每一行的值除以该行总和,让每个区域的邻居影响权重之和等于 1。这样做最大的好处是,空间滞后项 W·y 从“邻居的总和”变成“邻居的平均值”,参数的可解释性好很多。
如果不做行标准化,一个被 8 个邻居包围的区域和一个只有 2 个邻居的区域,即使邻居取值完全相同,算出来的 W·y 也差好几倍,回归系数会因此失真。GeoDa 的 Moran’s I 和回归面板都会读取权重文件的标准化属性;如果你用 .gwt 格式的距离权重,更要在权重创建时就确认行标准化被勾选。
我个人的习惯是:不管用什么权重类型,全部统一行标准化;如果为了稳健性比较不同权重,也会把标准化方式固定为同一种,避免把“权重类型不同”和“标准化方式不同”两个因素混在一起。空间计量里很多令人困惑的差异,追到根上都是这种细节没固定住。
3. Moran’s I 与 LISA:全局自相关的显著性检验和散点图读法
3.1 全局 Moran’s I:一个数衡量全域空间自相关
空间自相关检验的核心工具,就是全局 Moran’s I。它衡量同一个变量在相邻区域之间是趋向于相似、相反,还是完全随机。公式写出来是这个样子:
I = (n / S0) * [∑∑ w_ij (x_i - x̄)(x_j - x̄)] / [∑ (x_i - x̄)²]
其中 S0 是所有 w_ij 之和,如果权重做了行标准化,S0 就等于 n,公式会简化不少。看着复杂,但它做的事就是“把相邻区域之间的协方差归一化”。
这里有一个非常值得说的细节:在原假设“空间随机分布”下,Moran 指数的数学期望是 -1/(n-1),不是 0。只有当区域个数特别大时,这个期望才趋近于 0。所以你看到结果里 Moran=0.02、p=0.3,不代表分析没意义,而是变量在当前权重定义下没有显著的空间自相关。
如果 Moran 指数显著为正,说明相邻区域取值倾向相似,也就是存在正空间自相关,热点和冷点会成片出现。显著为负则说明相邻区域取值倾向相反,比如高值被低值包围,这种情况在现实中多见于行政边界跨界的污染或税收竞争数据。要判断显著与否,不是看指数绝对值大小,而是看基于置换的伪 p 值。
3.2 在 GeoDa 里运行全局 Moran 并读懂四个象限
操作路径是 Space → Univariate Moran’s I(中文界面会显示“单变量莫兰指数”)。在弹出的对话框里选择要分析的变量,下面的权重文件选 2.3 节生成的那份 .gal,点击 OK 后会同时出现两个窗口:Moran 散点图和统计报告。
散点图的横轴是变量标准化值,纵轴是空间滞后值 W·y,四个象限分别对应四种局部格局:右上角的 HH 表示高值区和相邻高值区聚集;左下角 LL 是低值与低值相邻;左上角 LH 表示低值被高值包围;右下角 HL 表示高值被低值包围。散点图回归线的斜率就是全局 Moran 指数本身。有一点必须提醒:散点图里的点越分散,回归线斜率越受异常点影响,所以报告里要同时看 p 值和剔除明显离群点后的结果。
在统计报告窗口里,重点看三个字段:Moran’s I 值、pseudo p-value(伪 p 值)、permutations(置换次数)。GeoDa 默认使用随机置换检验,一般默认 999 次。我做论文时会拉到 9999 次,并且把置换次数直接写在结果描述里,因为 9999 次得到的伪 p 值稳定得多,审稿人也不会问“为什么换个随机种子结果就变了”。
这里穿插一个解释:伪 p 值的含义,是把变量取值随机打乱后,再计算 Moran 指数;重复上千次后,看真实观察到的 Moran 在随机分布中的位置。如果只有 2% 的随机结果比真实值更大,那 p 值就是 0.02。所以置换次数越少,p 值本身的随机性越大。
3.3 LISA:从“一个数”到“一张分布地图”
全局 Moran 只给你一个总体数值。如果全局检验显著,你自然会追问:哪些区域是真正的高值集聚区?这就是局部 Moran LISA 要解决的问题。
在 GeoDa 里运行 Space → Univariate LISA,选择同样的变量和权重文件,置换次数同样建议设为 9999。运行结果会同时打开集聚图、显著性地图、散点图等多个窗口。集聚图的每个区域按局部自相关类型着色:
| 集聚类型 | 含义 | 常见解读 |
|---|---|---|
| 高-高(HH) | 该区域本身高值,邻居也高值 | 热点区,带动效应强 |
| 低-低(LL) | 该区域和邻居都低值 | 冷点区,容易被忽视 |
| 高-低(HL) | 该区域高值,邻居低值 | 极化点,虹吸或统计离群 |
| 低-高(LH) | 该区域低值,邻居高值 | 凹陷点,统计离群 |
需要理解的是:集聚图里所有有颜色的区域,都是局部 Moran 指数对应的伪 p 值小于设定水平,通常是 0.05。LISA 分析本质上涉及多次检验,所以不应该把 0.1 这种宽松水平拿来做结论。如果样本量很大,反而要更严格。
这里有两个判断标准供参考:全局 Moran 显著 + LISA 图能看出来成片的热点和冷点,基本可以判定变量有可靠的空间结构;如果全局显著但 LISA 全是散点、没有一个像样的集聚区,就回去检查权重矩阵或数据里的离群值,大概率是某个异常区域在拖着全体结果。
3.4 用 PySAL 复核 GeoDa 算出的数
GeoDa 是个图形界面,很多同学在论文里被追问“这个 p 值是怎么算出来的”,回答不上来。其实 GeoDa 的结果完全可以用 Python 的 PySAL 复核。下面是复核全局 Moran 和 LISA 的最小脚本:
import geopandas as gpd import libpysal as lp from esda.moran import Moran, Moran_Local # 读取边界和权重 gdf = gpd.read_file("province.shp", encoding="utf-8") w = lp.io.open("province_weight.gal").read() w.transform = "r" # 行标准化,对应 GeoDa 里的 Row-standardize # 全局 Moran y = gdf["gdp_percap"] moran = Moran(y, w, permutations=9999) print(f"Moran's I = {moran.I:.4f}, pseudo p = {moran.p_sim:.4f}") # 局部 LISA lisa = Moran_Local(y, w, permutations=9999) print(lisa.q) # 四个象限分类结果 print(lisa.p_sim) # 每个区域的伪 p 值说明三点:一是 geopandas 的 read_file 需要正确指定编码,中文属性表建议先做编码检查;二是 w.transform = "r" 必须和 GeoDa 里创建权重时的行标准化保持一致;三是 permutations 指定 9999,这个参数直接影响伪 p 值稳定性。如果 GeoDa 和 PySAL 的结果差异在小数点后两位以内,说明分析没跑偏;如果对不上,先检查权重的样本数是否一致,再检查 ID 是否对齐。
4. 空间回归模型:从 OLS 到空间滞后/空间误差模型的选择逻辑
4.1 为什么 OLS 在空间数据上不靠谱
回归分析的第一步永远是 OLS。空间数据里经常出现两个问题:残差存在空间自相关,或者解释变量存在空间溢出。只要有一个出现,OLS 的系数标准误就是错的,显著性检验也失去意义。所以空间回归不是“换个高级模型”,而是让回归结果在空间依赖存在时依然可信。
空间依赖的两种典型结构,对应两种模型。第一种是空间滞后模型(SAR):被解释变量 y 本身会受到相邻区域 y 的影响,写成 y = ρW·y + Xβ + ε。ρ 是空间自回归系数,它刻画的是“邻居的结果会传染到本地”。第二种是空间误差模型(SEM):空间依赖进入扰动项,写成带 λ 的误差结构;它刻画的是“邻居那边未观测到的因素传导到了本地”。
选择哪一种,不能靠拍脑袋,要靠检验。GeoDa 的 OLS 输出里有一个专门的板块报告 LM 检验(拉格朗日乘数检验)及稳健版,判断该用哪种空间结构。经验上:如果被解释变量有明显的扩散、传染、示范效应,比如房价、技术采用率、犯罪率,优先怀疑 SAR;如果主要是遗漏变量或区域冲击导致的空间关联,优先怀疑 SEM。
4.2 先跑 OLS,再看 LM 检验决定后一步
在 GeoDa 里跑 OLS 的操作:Methods → Regression(部分版本菜单位置略有差异,但名称不变),在回归对话框中把 Y 变量选为被解释变量,加入若干 X 解释变量,运行后先看回归结果和残差,同时把 LM 检验数据留好。
LM 检验输出四行关键结果:LM-Lag、LM-Err、Robust LM-Lag、Robust LM-Err。它们是两两配对的,决策规则归纳如下:
| LM-Lag | LM-Err | 选型建议 |
|---|---|---|
| 显著 | 不显著 | 空间滞后模型 SAR |
| 不显著 | 显著 | 空间误差模型 SEM |
| 两者都显著 | 两者都显著 | 看稳健版中更显著的那个 |
| 两者都不显著 | 两者都不显著 | 维持 OLS,不必强加空间项 |
这条规则是空间计量里公认的操作顺序,不是玄学。要注意的是,若 LM-Lag 和 LM-Err 都显著,而各版本也分不出高下,就需要考虑空间杜宾模型(SDM)做进一步检验。GeoDa 的标准面板里没有 SDM,通常转入 R 的 spdep 包或 Python 处理;入门阶段先掌握 SAR 和 SEM 就够了。
4.3 在 GeoDa 里运行空间滞后/空间误差模型
明确了选型之后,回到回归对话框,把模型从 OLS 切换为 Spatial Lag 或 Spatial Error,并在空间权重栏选择 2.3 节生成的权重文件。GeoDa 在这个面板里会显示权重文件名称和具体模型设置。
运行前再确认三件事:一是权重文件已经行标准化;二是样本量与权重矩阵一致;三是解释变量不要包含因变量的线性组合,比如 Y 和 Y 的滞后项不能同时放。GeoDa 对这三项没有强制报错,但它们都会让输出出现奇怪的不可读结果。
运行结束后,输出会多出几项关键统计量:对空间滞后模型,直接看 ρ;对空间误差模型,直接看 λ。如果 ρ 或 λ 不显著,说明加入空间结构后并未改进模型,这时应该回到 LM 检验重新审视选型,而不是强行保留一个不显著的空间项。
空间回归模型的 R² 也不能直接和 OLS 的 R² 对比,因为空间模型用极大似然估计(MLE),提供的是伪 R²。真正用于比较的是 log-likelihood 和 AIC/SC,哪个数值更优说明模型解释力更强。很多新手拿 OLS 的 R² 和空间模型的伪 R² 直接比较,得出“空间模型不如 OLS”的结论,这是错误比较。
4.4 读懂输出里的“直接效应”和“间接效应”
空间滞后模型里,ρ 显著不为零时,解释变量的系数 β 不能再按普通线性回归的语气解释。以房价数据为例:解释变量就业密度提高 1 个单位,不仅直接抬升本地区房价,还会通过空间滞后项把影响传导到邻居,邻居又反过来影响本地区,形成反馈循环。
所以严格意义上,要把效应分解成直接效应和间接效应(空间溢出效应)。GeoDa 的回归输出本身不直接给分解表,但很多研究者会把 ρ 和 β 代入公式,用 R 的 spatialreg 包求均值。入门阶段至少要做到:不把 β 孤立地念成“每增加一个单位,Y 增加多少”,而是说“在 ρ 显著的情况下,存在空间反馈”。
空间误差模型则不同:虽然 λ 显著,但解释变量的系数解释与 OLS 基本相同,因为空间结构在误差项里,不改变 X 对 Y 的边际效应。写论文时,SAR 模型谈溢出,SEM 模型谈滤波后的关系,二者解释方式不一样。回看一遍 4.2 的选型规则,比直接在结果里挑一个好看的 ρ 靠谱得多。
5. 避坑清单:GeoDa 数据分析和 zip 解压里最常翻车的五个细节
5.1 中文路径与 zip 解压乱码:GeoDa 直接打不开 shp
现象:zip 解压后双击或用 File → Open 选路径,GeoDa 报错或地图窗口空白;同一个文件在 QGIS 里却能正常打开。
原因:压缩包里的中文目录名在 Windows 默认解压后可能变成乱码,GeoDa 对路径中的中文、全角空格、特殊字符兼容性不好;老的压缩包用 GBK 编码打包,在 macOS 或 Linux 上解压后目录名也可能乱掉。
解决:把解压目标目录改成纯英文,比如 C:\geo_lab 或 ~/spatial_lab;内部文件名也尽量改成 province.shp 这种短名称。命名的第一原则就是路径中不要出现中文,zip 包本身是中文名没关系,解压后的顶层目录一定要重命名为英文。
5.2 属性表中文乱码:CSV/DBF 编码不一致
现象:在 GeoDa 属性表窗口看到的省名、市名全是乱码;用 CSV 做表连接时,连接键明明一样,却匹配不上。
原因:属性数据是 GBK/GB2312 编码保存的,GeoDa 默认按 UTF-8 读取;或者反过来,文件是 UTF-8,但旧的编辑工具保存时落了 BOM 标记,导致第一列名称异常。
解决:用 VS Code 或 Notepad++ 打开 CSV,重新编码为 UTF-8 后保存;注意保存时带 BOM 而不是纯 UTF-8,GeoDa 对带 BOM 的 UTF-8 识别更稳定。DBF 文件则尽量用数据管理工具转存为 CSV 再做关联。每次拿到新数据,先花半分钟检查编码,能省下后面一个小时的排查时间。
5.3 ID 不匹配:权重矩阵对不上数据
现象:创建权重时一切正常,但做 Moran 或回归时,GeoDa 提示权重与数据观测数不一致,或者结果窗口里全是缺失值。
原因:shapefile 属性表里的 ID 字段和权重文件里的 ID 编号不是同一套;比如数据里用省名“北京”,权重里却用代码 11;或者 CSV 合并时,两个表的连接字段类型不一致,一个是整数,一个是字符串。
解决:先统一 ID。推荐做法是创建一个整数型 ID 列,比如行政区划代码,让 shp 和 CSV 都用这个字段做主键。在 GeoDa 的表窗口可以右键新增变量并重新编码,导入 CSV 后用 Table → Merge 合并,再检查唯一性和缺失值。权重文件里的 ID 顺序必须与主表一致,这是所有空间分析能跑通的前提。
5.4 孤岛单元:邻接权重整行是零
现象:Weights Manager 里创建权重后显示连通性异常;Moran 结果出现 NaN;空间回归里某个区域的拟合值空掉。
原因:某个多边形与其他区域不共边,比如海岛县、飞地,在 Queen 邻接下邻居数为 0;权重矩阵中这一行全为 0,局部自相关无法计算。
解决:先识别孤岛——在 Weights Manager 里打开权重编辑器,GeoDa 会把没有邻居的单元高亮显示。然后改用 K 近邻(比如 K=4)或距离阈值权重,保证每个区域至少有一个邻居;也可以在分析中剔除这个区域。对面板数据要格外小心,不同年份行政区划若有变动,一个稳定存在的岛县会持续影响模型。
5.5 莫兰 p 值两次不一样:置换次数太少
现象:今天跑全局 Moran,p=0.04;明天同一份数据重跑,变成 p=0.06;LISA 图上显著区域也略有变化。
原因:GeoDa 的显著性是基于随机置换得到的伪 p 值。默认置换次数较少时,随机波动会直接影响结果;不同版本对随机种子处理也不一致,所以重复运行会得到细微差异。
解决:把置换次数固定下来,一般设 9999;论文里写明“基于 9999 次随机置换”。如果对可复现性要求更高,就在同一次会话内完成所有核心分析,并记录 GeoDa 的版本号和随机种子设置。从那以后我每次输出莫兰结果,都会同时写下置换次数,避免过几天自己都说不清这个 p 值是怎么来的。
6. 复核与收尾技巧:三个数字确认你跑的不是黑匣子
6.1 用统计量本身验证分析结果
跑完空间回归和莫兰指数后,先核对三个地方。第一,Moran 指数是否落在合理范围内,一般情况下取值在 -1 到 1 之间;如果出现 0.8 以上的极端值,先怀疑离群值,再怀疑权重矩阵,而不是急着宣布“强空间自相关”。第二,伪 p 值和置换次数要成对记录,一份结果里写了 p=0.02,就必须写着 9999 permutations,缺一个都不完整。第三,LISA 显著单元的数量和 Moran 散点图四个象限的落点数量要能对上;如果集聚图标出十几个 HH 区域,散点图右上角却只有两三个点,多半是权重文件或者数据版本选错了。
6.2 一个固定下来的检查流程
我每次拿到新的案例数据,都会强制走一遍这套流程:解压到英文路径 → 打开 shp 和 CSV 检查字段类型与编码 → 创建权重并打开 .gal 看孤岛和邻居数 → 跑全局 Moran,设 9999 次置换并记录伪 p 值 → 跑 LISA 对照集聚图 → 最后做 LM 检验并选型空间回归。整个流程在 GeoDa 里不会超过半小时,但它能过滤掉绝大多数“结果看着正常,换个数据就崩”的隐患。
有一次我跳过权重文件检查,直接跑空间回归,出来的 ρ 显著得漂亮,后来发现 ID 字段在 CSV 里被读成了字符串,整体匹配错位,整个结果作废重来。从那以后,权重矩阵的邻居数和 ID 唯一性检查就成了我雷打不动的第一步。如果你也在入门空间计量,希望这套流程帮到你,少走一段我走过的弯路。
本文还有配套的精品资源,点击获取