空间计量不想死磕R?用GeoDa+Stata+Python四步走通全流程
做空间计量的人,十有八九在R上摔过跤。这话从我嘴里说出来,不是要黑R,而是我在课程答疑和论文辅导里见过太多同学的真实状态:拿着文献里的R代码逐行调试,从白天搞到深夜,最后卡在某个包版本不兼容、权重矩阵报错、或者一份结果无论如何都跟原文对不上。R本身没什么错,只是对于大多数社科背景、平时用Stata写惯了reg y x的研究者来说,它的容错成本实在太高。
我想先说清楚这篇文章的立场:不劝你放弃R,但劝你别再和R代码死磕。空间计量的核心从来不是某段代码怎么调通,而是权重矩阵怎么构建、空间依赖如何检验、模型该选SAR还是SEM、估计结果怎么解释成直接效应和间接效应。这些逻辑想透了,工具只是最后一公里的翻译。
我目前的工作流是GeoDa做探索性分析、Stata跑标准流程、Python处理扩展场景、R只用来复核关键结果。这套组合帮我省下了大量调试时间,也让我能更专注于经济学解释本身。下面把每个环节的具体做法和踩过的坑都讲清楚。
1. 为什么你会在R上“死磕”:空间计量的真实门槛
1.1 R不是不够好,而是三重门槛叠在了一起
我见过太多人把空间计量学不会的原因归结为自己代码能力差,其实不完全是。R这套生态本身就自带三重门槛,叠在一起,对非编程背景的研究者很不友好。
第一重是语法习惯的割裂。社科背景的人常年用Stata,命令式的写法让我们习惯了“一句话干一件事”,而R是函数式语言,你得理解对象、列表、矩阵之间的转换关系。光是搞清楚sf对象和sp对象里那些@、$、[[]]的区别,就能劝退一批人。空间计量又不是天天写,隔几个月碰一次,前半年学的语法早忘光了。
第二重是包的生态演进。空间计量最常用的spdep包,早期基于sp对象,后来转向sf对象,很多老代码直接失效。函数的参数名变了、对象结构变了、读入shp文件的方式也变了。你今天搜到一个2018年的教程,照着跑可能到处都是报错。这并不是你不行,是这一领域本身变动太频繁,文档还经常没跟上。
第三重是模型家族的复杂度。空间计量不是“跑一个回归”那么简单,SAR、SEM、SDM、SAC、GSPRE,这还不算面板空间模型和动态空间模型,每个模型又有ML、GMM、Bayesian等多种估计思路。哪怕你的计量理论底子不错,要把每个模型的估计代码写对,也需要不小的工程量。
这三重门槛叠加起来,就形成了一个很尴尬的局面:你明明知道该用哪个模型,但就是写不出能跑的代码;或者代码好不容易跑通了,你又不太确定结果到底靠不靠谱。
1.2 空间计量的真门槛是模型与检验逻辑,根本不是语法
很多人在R里死磕代码,本质上是在用代码的复杂度掩盖思路的不清晰。空间计量有一套固定的追问链条,你只要把链条上的每个问题回答清楚,用什么工具其实差别不大。
第一个问题:数据里到底有没有空间依赖?这对应空间自相关检验,典型指标是全局Moran's I和局部LISA。第二个问题:如果存在空间依赖,它体现在哪里?是因变量的空间滞后项,还是误差项,还是两者都有?这对应LM-Lag、LM-Error以及它们的稳健形式。第三个问题:模型估计出来后,解释变量的边际效应是多少?其中多少是直接效应、多少是间接效应?这对应空间模型的偏微分分解。
说实话,这三个问题比R语法重要得多。你用一个不熟悉的工具照猫画虎,也许能跑出一张看似完整的结果表,但别人问你一句“为什么这里用SDM而不用SEM”,你就可能答不上来。反过来,如果你先把这套逻辑盘清楚,哪怕换个工具,代码都是可替代的。
1.3 死磕代码的隐性代价
跟R代码死磕,最大的问题不是时间本身,而是时间花出去之后,你不知道自己学到了什么。有些人