
简介面向空间计量学入门学习者的GeoDa实操案例数据包涵盖空间依赖性、空间异质性、空间权重矩阵、Morans 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 ContiguityID 变量选择刚才确认好的整数代码字段保存路径保持默认权重文件会以 .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。所以你看到结果里 Moran0.02、p0.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, encodingutf-8) w lp.io.open(province_weight.gal).read() w.transform r # 行标准化对应 GeoDa 里的 Row-standardize # 全局 Moran y gdf[gdp_percap] moran Moran(y, w, permutations9999) print(fMorans I {moran.I:.4f}, pseudo p {moran.p_sim:.4f}) # 局部 LISA lisa Moran_Local(y, w, permutations9999) 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-LagLM-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-8GeoDa 对带 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 近邻比如 K4或距离阈值权重保证每个区域至少有一个邻居也可以在分析中剔除这个区域。对面板数据要格外小心不同年份行政区划若有变动一个稳定存在的岛县会持续影响模型。5.5 莫兰 p 值两次不一样置换次数太少现象今天跑全局 Moranp0.04明天同一份数据重跑变成 p0.06LISA 图上显著区域也略有变化。原因GeoDa 的显著性是基于随机置换得到的伪 p 值。默认置换次数较少时随机波动会直接影响结果不同版本对随机种子处理也不一致所以重复运行会得到细微差异。解决把置换次数固定下来一般设 9999论文里写明“基于 9999 次随机置换”。如果对可复现性要求更高就在同一次会话内完成所有核心分析并记录 GeoDa 的版本号和随机种子设置。从那以后我每次输出莫兰结果都会同时写下置换次数避免过几天自己都说不清这个 p 值是怎么来的。6. 复核与收尾技巧三个数字确认你跑的不是黑匣子6.1 用统计量本身验证分析结果跑完空间回归和莫兰指数后先核对三个地方。第一Moran 指数是否落在合理范围内一般情况下取值在 -1 到 1 之间如果出现 0.8 以上的极端值先怀疑离群值再怀疑权重矩阵而不是急着宣布“强空间自相关”。第二伪 p 值和置换次数要成对记录一份结果里写了 p0.02就必须写着 9999 permutations缺一个都不完整。第三LISA 显著单元的数量和 Moran 散点图四个象限的落点数量要能对上如果集聚图标出十几个 HH 区域散点图右上角却只有两三个点多半是权重文件或者数据版本选错了。6.2 一个固定下来的检查流程我每次拿到新的案例数据都会强制走一遍这套流程解压到英文路径 → 打开 shp 和 CSV 检查字段类型与编码 → 创建权重并打开 .gal 看孤岛和邻居数 → 跑全局 Moran设 9999 次置换并记录伪 p 值 → 跑 LISA 对照集聚图 → 最后做 LM 检验并选型空间回归。整个流程在 GeoDa 里不会超过半小时但它能过滤掉绝大多数“结果看着正常换个数据就崩”的隐患。有一次我跳过权重文件检查直接跑空间回归出来的 ρ 显著得漂亮后来发现 ID 字段在 CSV 里被读成了字符串整体匹配错位整个结果作废重来。从那以后权重矩阵的邻居数和 ID 唯一性检查就成了我雷打不动的第一步。如果你也在入门空间计量希望这套流程帮到你少走一段我走过的弯路。本文还有配套的精品资源点击获取