全局Moran I公式推导:原理解析、期望与方差
这一章,我们开始硬核的推导环节。说「硬核」,其实也就是把Moran I背后的逻辑掰开揉碎,看看它到底在算什么东西。
从我自己的经历来看,很多初学者在第一步就被公式吓退了。密密麻麻的符号,Σ上下堆叠的变量。其实不用怕。你想想看,这公式本质上只做了三件事:找邻居、算差值、标准化。
3.1 公式的来源:从空间关联到统计量
先问一个最根本的问题:为什么要用Moran I来衡量空间自相关?
假设你有一组城市的人口密度数据。如果密度高的城市周围也是高密度,那就说明有空间聚集。如果高的周围是低的,那就是离散。Moran I本质上就是一个空间加权版的皮尔逊相关系数。
我们来看最经典的全局Moran I公式:
I = n / S₀ × ΣᵢΣⱼ wᵢⱼ (xᵢ - x̄)(xⱼ - x̄) / Σᵢ (xᵢ - x̄)²
你仔细看这个式子。分号上面是空间加权的协方差,下面是普通方差。说白了,就是把数据里的变量波动往空间关系上映射了一下。我个人习惯把这个结构拆成三部分来理解:
- 分子左半部分:n/S₀,这是个消除尺度的系数,保证Moran I的值可以被比较
- 分子右半部分:∑ᵢ∑ⱼ wᵢⱼ (xᵢ - x̄)(xⱼ - x̄),这是空间加权后的协方差总和
- 分母:∑ᵢ (xᵢ - x̄)²,这是普通方差,用来做全局标准化
核心要点:Moran I的值域通常在 -1 到 +1 之间。
+1 表示完全正相关(高-高聚集,低-低聚集),
-1 表示完全负相关(高-低交错,类似棋盘格),
0 则表明空间随机分布。
我曾在一次城市热岛效应研究中用过这个公式。当时数据集有2000多个观测点,直接用Excel拉公式?不行,太慢。我建议你用Python的 esda 包或者PySAL,但理解背后的逻辑还是得亲手推一遍。
3.2 空间权重矩阵的角色:Wᵢⱼ 到底在干嘛
公式里的 wᵢⱼ 是整个Moran I的骨架。没有它,空间自相关和普通相关性就没有区别了。
权重矩阵用来定义「谁是谁的邻居」。最常见的有三种:
| 权重类型 | 定义 | 适用场景 |
|---|---|---|
| 邻接权重 | 共享边界的区域为邻居 | 行政区域、地理多边形 |
| 距离权重 | 距离小于阈值的点为邻居 | 点状数据、气象站分布 |
| K近邻权重 | 每个点取最近的K个邻居 | 不均匀分布、边缘区 |
在实际项目中,权重矩阵的选择会影响最终结果。我遇到过一种情况:用邻接矩阵时Moran I是0.35,换成距离衰减矩阵后变成0.12。这就是所谓的「空间尺度效应」。所以我在做任何空间分析前,一定会先做敏感性分析,看看不同权重下的结果是否稳定。
关于权重矩阵的正式写法,一般会规范化为行标准化(每行和为1)。这样做的目的是让每个观测对象的总权重相等,避免个别高密度区域被过度加权。
避坑提示:我建议你在构建权重矩阵时,先检查一下孤立点。如果一个区域没有任何邻居,那它在Moran I计算中会被完全忽略。我曾在处理岛屿数据时踩过这个坑,结果发现有效样本量少了10%。
3.3 期望E[I]的推导:零空间自相关假设
有了公式,我们还需要知道它的期望(Expectation)和方差(Variance),才能在假设检验里判断观察到的I是否显著。
先从期望讲起。在原假设H₀下,我们认为数据没有空间自相关,也就是说变量在地理上是随机分布的。在这种情况下,Moran I的期望是多少?
推导起来其实很简单。假设x是独立同分布(iid)的样本,那么期望E[I]可以写成:
E[I] = -1 / (n - 1)
为什么会这样?
你别惊讶,这个结果不是0。因为空间权重矩阵的内在结构会引入一点点负偏误。举个例子,n=100时,E[I] ≈ -0.0101。也就是说,即使数据完全随机,你很难恰好得到0,而是稍稍偏向负值。
我个人习惯把E[I]称为「随机折现率」——它告诉你,在多大程度上可以认为观察到的正相关是偶然的。如果实测I远大于-1/(n-1),那就可以怀疑存在真正的空间聚集。
注意:期望公式 E[I] = -1/(n-1) 是在假设数据服从正态分布(Normality assumption)或者随机排列(Randomization assumption)下推导出来的。在实际使用中,大多数软件默认采用随机排列假设,因为不需要对变量分布做过多假定。
3.4 方差Var(I)的推导:衡量不确定性
期望知道了,还得知道方差。方差决定你有多大把握拒绝H₀。方差越小,检验越灵敏。
全局Moran I的方差公式不是统一的,它取决于分布假设。我最常用的是随机检验法(randomization)下的方差公式:
Var(I) = [n²S₁ - nS₂ + 3S₀²] / [(n² - 1)S₀²] - (E[I])²
其中:
- S₀ = ΣᵢΣⱼ wᵢⱼ (所有权重之和,行标准化后等于n)
- S₁ = ½ ΣᵢΣⱼ (wᵢⱼ + wⱼᵢ)² (反映权重对称性)
- S₂ = Σᵢ (Σⱼ wᵢⱼ + Σⱼ wⱼᵢ)² (反映行和与列和的差异)
这堆符号看起来很复杂。但别急着跑,用一个小例子演示一下就懂了。
假设你有一个3×3格网,只用相邻权重(rook邻接,只共享边)。先构建W矩阵:
W = |
0 1 0 | 1 0 1 | 0 1 0 |
行标准化后,每行和为1。
计算S₀: 所有权重求和 = n = 9。
计算S₁: 对每个非零权重平方和。
计算S₂: 每行和+每列和,平方再求和。
我记得第一次手动推导这个公式时,花了整整一个下午。因为S₁和S₂的推导里,对交叉项的处理很容易搞错。如果你不想算,也可以直接用PySAL或GeoDa等工具自动输出方差。但我建议至少手推一遍小矩阵,对理解方差来源会有质变帮助。
一个小技巧:当样本量不是很大(n < 100)时,方差会偏大,导致统计效力降低。此时可以改用蒙特卡罗置换检验来获取伪p值,比直接用公式更稳妥。
3.5 完整的检验统计量:Z scores
有了E[I]和Var[I],我们就可以构造标准正态检验统计量:
Z = (I - E[I]) / √Var(I)
这个Z值服从标准正态分布(在足够大样本下)。然后你就可以用双侧检验来判断是否拒绝H₀:
- Z > 1.96:显著空间正相关(聚集)
- Z < -1.96:显著空间负相关(离散)
- |Z| ≤ 1.96:不能拒绝随机假设
我在给一个团队做培训时,经常强调一句话:Moran I本身只是描述,Z值才是判断。光看I是0.6还不行,得看它有没有统计显著性。尤其在小样本下,哪怕I很大,也可能不显著。
下面这张图概括了全局Moran I计算和检验的完整流程:
整个流程,说白了就是从空间配置出发、算出Moran I、再判断它是否可信。
3.6 注意事项:当你算出的I值偏大或偏小时
在实际项目中,你可能会遇到一些反常结果。比如Global Moran I达到0.9,但Z值却不显著。这时别急着开心,很可能是因为数据存在异方差或空间非平稳性。我曾经在房价模型里见过这种情况——因为有几个极端高的离群点,使得I被拉高,方差也被拉大,最终不显著。
重要警告:全局Moran I只能检测整体的空间模式,无法告诉你局部是在哪里聚集。如果I接近0但Z显著,它只说明全局没有明显趋势,却不能排除局部存在几个小规模聚集区。这时候应该转而使用 局部Moran I(LISA) 做深挖。
另外,数据里的缺失值也要小心处理。如果直接删掉缺失值,你必须重新检查权重矩阵是否完整。我记得有一次因为数据空值太多,结果删到最后只剩下70%的样本,空间自相关结构完全变了。所以,我一般采用多重插补或者空间插值来补全,至少也要做敏感性分析对比。
实践建议:完成推导后,你可以用PySAL或者GeoDa快速验证自己的计算。
手推小矩阵(比如5×5格网)可以帮助你确认公式实现是否准确。