GIS空间数据分析的新视角
从理论到实践:主流因果推断框架在地理信息系统中的应用
2024 | GIS专业课程 | 因果推断与空间分析
引言与理论基础
因果推断核心概念、GIS应用场景、空间数据特点
因果图与贝叶斯网络
DoWhy、CausalNex框架详解
机器学习因果推断
EconML、CausalML方法
空间计量经济学
PySAL、MGWR模型
时间序列与贝叶斯
Tigramite、PyMC框架
总结与展望
方法对比、未来方向
节点表示变量,有向边表示因果关系。利用图论方法识别因果效应。
每个个体有Y(1)和Y(0)两个潜在结果。因果效应:Y(1)-Y(0)。
do(X=x)表示强制设置X为x,与条件概率P(Y|X)不同。
公园与房价正相关,但实际由收入混杂。使用工具变量识别真实因果效应。
相邻区域的空间变量具有相似性,违反独立性假设。
地理现象在不同位置具有不同行为特征。
工具变量Z需要满足:
两阶段最小二乘法(2SLS):
高铁对经济影响:使用"是否在高铁规划沿线"作为工具变量(基于历史规划和地理因素)。
因果图与贝叶斯网络方法
微软开源因果推理框架,基于因果图模型和do算子理论。
DoWhy建立在两个理论基础上:Judea Pearl的因果图模型(do-calculus和后门准则)和Donald Rubin的潜在结果框架,统一了两个经典因果推断范式。
因果图需要明确声明因果假设:
后门准则:
如果Z阻断X和Y之间的所有后门路径,则因果效应可识别。
前门准则:
即使存在未观测混杂,如果通过前门路径传导,也可以识别。
定义因果假设
声明混杂因素
构建因果图
验证效应可识别性
返回识别公式
后门调整公式
从数据计算效应
多种估计方法
置信区间
稳健性检验
添加混杂测试
伪处理测试
研究问题:城市扩张是否导致碳排放增加?
数据:
包含:处理变量(城市扩张)、结果变量(碳排放)、混杂因素(GDP、人口、工业化)、中介变量(绿化覆盖、交通密度)
每增加1%的城市用地比例,碳排放增加约0.8%。反驳测试验证了结果的稳健性。政策含义:控制城市扩张速度、优化城市空间布局可有效减少碳排放。
from dowhy import CausalModel
# 定义因果图
causal_graph = """
digraph {
urban_expansion -> carbon_emission;
urban_expansion -> green_coverage;
green_coverage -> carbon_emission;
GDP -> urban_expansion;
GDP -> carbon_emission;
population -> urban_expansion;
population -> carbon_emission;
industry -> urban_expansion;
industry -> carbon_emission;
}
"""
# 创建因果模型
model = CausalModel(
data=df,
treatment='urban_expansion',
outcome='carbon_emission',
common_causes=['GDP', 'population', 'industry'],
graph=causal_graph
)
# 识别因果效应
identified_estimand = model.identify_effect()
# 使用倾向得分匹配估计
estimate = model.estimate_effect(
identified_estimand,
method_name="backdoor.propensity_score_matching"
)
print(f"ATE估计值: {estimate.value}")
# 反驳测试
refutation = model.refute_estimate(
identified_estimand, estimate,
method_name="random_common_cause"
)
print(f"反驳测试p值: {refutation.p_value}")
ATE表示平均因果效应。置信区间反映不确定性。反驳测试帮助判断假设合理性。
Uber开发的因果推理库,专门用于从数据中学习因果结构并支持贝叶斯网络推理。
Non-combinatorial Optimization via Trace Exponential and Augmented lagRangian for Structure learning
from causalnex.structure import StructureModel
from causalnex.structure.notears import from_pandas
# 使用NOTEARS算法学习因果结构
sm = from_pandas(df, tabu_edges=None, w_threshold=0.3)
# 可视化
sm.plot()
# 核心参数
# type_forest: 节点类型
# tabu_edge_num: 禁止边数
# max_iter: 最大迭代次数
从城市空间数据中学习因果结构,例如从交通、土地、经济数据中自动发现"交通密度→土地价格→商业集聚"等因果链条。
给定贝叶斯网络,可以计算:
# 干预分析:强制设置交通密度为高
ie_intervention = InferenceEngine(bn)
ie_intervention.do_intervention(
'traffic_density', {'high': 1.0}
)
result_intervention = ie_intervention.query()
print(result_intervention['urban_growth'])
研究交通网络发展如何影响城市经济发展模式。
使用CausalNex NOTEARS学习变量间的因果结构。
因果结构学习揭示了"交通网络→要素集聚→产业升级→经济增长"的传导链条。高速公路密度对GDP有显著正向因果效应,效应强度随距主要城市距离递减。结果支持了交通基础设施促进区域经济发展的理论假说。
from causalnex.structure import StructureModel
from causalnex.structure.notears import from_pandas
# 使用NOTEARS算法学习因果结构
sm = from_pandas(df, tabu_edges=None, w_threshold=0.3)
# 可视化
sm.plot()
# 阈值过滤,去除弱因果边
sm.remove_edges_below_threshold(0.5)
from causalnex.inference import InferenceEngine
# 构建贝叶斯网络
bn = BayesianLNetwork(sm)
bn = bn.fit_node_states(df)
bn = bn.fit_cpds(df)
# 概率推断
ie = InferenceEngine(bn)
# 查询:给定交通密度高
result = ie.query({'traffic_density': 'high'})
print(result['urban_growth'])
标准因果图不包含空间关系,但GIS应用需要考虑空间依赖性。
空间溢出效应可通过空间滞后变量表示:
在空间因果图中,可以定义局部因果效应(某区域的因果效应)和全局效应(所有区域的平均效应)。空间杜宾模型中的直接效应和间接效应分解与这种因果图解释相对应。
在您的研究领域(城市规划/交通/环境GIS),有哪些适合使用因果图方法研究的问题?
识别您研究中可能存在的混杂因素。
因果图方法的局限性是什么?
机器学习因果推断方法
由Chernozhukov等人提出,解决高维混淆变量下的因果效应估计问题。
传统ATE假设效应在所有个体中相同,但实际可能因特征而异。
微软开发的Python库,专门用于从观测数据中估计异质处理效应和因果关系。
DML用于估计处理变量T对结果变量Y的因果效应,同时控制混淆变量W。
核心步骤:
如果能够精确估计E[T|W]和E[Y|W],则残差项中不包含混淆因素的影响。
使用交叉拟合(Cross-fitting)控制过拟合:
由Athey和Wager提出,将随机森林应用于因果推断。
结合因果森林和双机器学习:
识别哪些区域/人群从政策中获益最多、理解政策效果的差异来源、为精准施策提供依据。例如,识别出哪类城市从交通投资中获益最多。
研究问题:国家"智慧城市"试点政策对城市经济增长的效果是否因城市特征而异?
数据:
使用CausalForestDML估计异质处理效应:
from econml.dml import LinearDML
from sklearn.linear_model import LassoCV
# 定义模型
est = LinearDML(
model_y=LassoCV(cv=5), # outcome模型
model_t=LassoCV(cv=5), # treatment模型
discrete_treatment=True,
random_state=42
)
# 拟合模型
est.fit(Y, T, X=W) # Y:outcome, T:treatment, W:controls
# 估计ATE
ate = est.ate(X=W)
print(f"ATE估计: {ate.mean():.4f}")
from econml.dml import CausalForestDML
# 定义因果森林模型
est = CausalForestDML(
n_estimators=100,
max_depth=5,
discrete_treatment=True,
random_state=42
)
# 拟合模型
est.fit(Y, T, X=W)
# 估计异质效应(每个样本的ITE)
hte = est.effect(X)
# 识别高效应样本
high_effect_idx = np.argsort(hte)[-10:]
Uber开发的Python库,专注于使用机器学习方法估计处理效应和uplift建模。
将处理变量作为特征之一,建立统一预测模型:
μ(x, t) = E[Y|X, T=t]
处理效应:
τ(x) = μ(x, 1) - μ(x, 0)
分别建立处理组和对照组模型:
μ₀(x) = E[Y|X, T=0]
μ₁(x) = E[Y|X, T=1]
处理效应:
τ(x) = μ₁(x) - μ₀(x)
T-learner的改进,分三步:
优势:适合样本不平衡情况
Uplift(提升度):
τ(x) = E[Y(1) - Y(0)|X=x]
给定特征x条件下,处理相对于不处理的期望增量。
目标:找到uplift最高的群体进行干预
每个样本只能观察到Y(1)或Y(0)中的一个,无法直接计算真实uplift。
常用方法:
在城市规划中,uplift建模可用于:识别最能从基础设施投资中受益的区域、优化公共资源在不同区域的分配、预测干预措施对不同社区的增量效果。
城市公共空间改造项目(口袋公园建设)如何在不同社区产生不同的满意度提升?
决策目标:
在有限财政预算下,选择最具效益的改造点位。
数据:北京市2018-2022年100个社区调查数据
使用X-learner估计各社区的处理效应。
高满意度提升社区特征:原有绿地面积较少、老年人口比例较高、周边500米无大型公园。
建议:优先在老城区(绿地稀缺、老龄化程度高)推进口袋公园建设。预算约束下,应聚焦高uplift社区以最大化整体效益。
from causalml.inference.meta import BaseXClassifier
from sklearn.ensemble import GradientBoostingClassifier
# 定义X-learner
xl = BaseXClassifier(
outcome_learner=GradientBoostingClassifier(),
effect_learner=GradientBoostingClassifier()
)
# 拟合模型
xl.fit(X=df_features,
treatment=df_treatment,
y=df_outcome)
# 估计个体处理效应
ite = xl.predict(X=df_features)
from causalml.inference.uplift import BaseTClassifier
# 使用T-learner进行uplift建模
uplift_model = BaseTClassifier(
GradientBoostingClassifier()
)
uplift_model.fit(X=df_features,
treatment=df_treatment,
y=df_outcome)
# 预测uplift分数
uplift_scores = uplift_model.predict(X=df_features)
# 识别高uplift群体
threshold = np.percentile(uplift_scores, 80)
target_population = df_features[uplift_scores >= threshold]
| 研究问题 | 推荐方法 | 工具包 |
|---|---|---|
| 估计平均处理效应(ATE) | 倾向得分/DML | DoWhy + EconML |
| 估计异质处理效应(HTE) | CausalForest | EconML |
| 因果结构发现 | NOTEARS | CausalNex |
| Uplift优化 | 元学习者 | CausalML |
| 时间序列因果 | PCMCI | Tigramite |
研究目的(探索性 vs 验证性)、结果解释需求(黑箱 vs 白盒)、数据条件(样本量、变量类型)、计算资源。必要时可组合多种方法进行稳健性检验。
空间计量经济学方法
由Anselin(1988)系统提出,旨在处理空间数据的依赖性和异质性问题。
核心创新:
空间依赖性:
空间异质性:
PySAL(Python Spatial Analysis Library)是空间计量分析的开源生态系统,包含spreg(空间回归)、esda(空间自相关)、libpysal(空间权重)、mgwr(地理加权回归)等模块。
空间权重矩阵W是一个n×n矩阵,元素w_ij表示区域i和区域j之间的空间关系。
主要类型:
from libpysal.weights import Queen, KNN, DistanceBand
# 邻接矩阵(基于多边形邻接)
w_queen = Queen.from_shapefile('cities.shp')
# K近邻矩阵(每个区域4个最近邻居)
w_knn = KNN.from_shapefile('cities.shp', k=4)
# 距离带矩阵(100km阈值内)
w_dist = DistanceBand.from_shapefile(
'cities.shp', threshold=100
)
# 行标准化
w_knn.transform = 'r'
y = ρWy + Xβ + ε
解释:本区域因变量如何受到邻近区域因变量的影响。
由于空间滞后的存在,需要使用:
ML估计:
假设误差项服从空间自相关分布,通过最大化似然函数同时估计所有参数。
y = Xβ + u, u = λWu + ε
SEM使用:
与SLM的区别:
y = ρWy + Xβ + WXθ + ε
SDM同时包含因变量和处理变量的空间滞后。
模型关系:
SDM的重要优势是分解效应:
这是量化政策溢出效应的关键工具。
PySAL中的空间回归模块,提供三类估计方法:
支持模型:
SAR、SEM、SAC、SDM、GMM等
from spreg import OLS, ML_Lag, ML_Error
# OLS基准回归
ols = OLS(y, X, w=w_knn,
name_y='GDP',
name_x=['pop','industry'])
# 空间滞后模型ML估计
slag = ML_Lag(y, X, w=w_knn,
name_y='GDP',
name_x=['pop','industry'])
# 空间误差模型ML估计
sem = ML_Error(y, X, w=w_knn,
name_y='GDP',
name_x=['pop','industry'])
y_t = ρWy_t + X_tβ + μ_i + λ_t + ε_t
固定效应模型:
随机效应模型:
Hausman检验可帮助选择。
研究问题:FDI对区域经济增长的影响是否存在空间溢出效应?
数据:中国2000-2020年省级面板
模型:SDM with fixed effects
FDI对本地经济增长的直接效应显著为正。FDI对邻近区域的间接效应也显著为正,说明存在正向技术溢出。总效应表明FDI每增加1%,区域GDP增长约0.3%。
from spreg import ML_Lag
import geopandas as gpd
from libpysal.weights import Queen
# 加载数据
gdf = gpd.read_file('provinces.shp')
# 构建空间权重矩阵
w = Queen.from_dataframe(gdf)
w.transform = 'r'
# 准备变量
y = gdf['GDP_growth'].values
X = gdf[['FDI', 'human_capital',
'infrastructure']].values
# 估计SDM
sdm = ML_Lag(y, X, w=w,
name_y='GDP_growth',
name_x=['FDI', 'human_capital',
'infrastructure'],
name_ds='Province Data')
print(sdm.summary)
from scipy.linalg import inv
import numpy as np
# 提取参数
beta = sdm.betas
rho = sdm.rho
theta = sdm.theta
# 逆矩阵计算
W = w.full()[0]
I = np.eye(len(W))
inv_term = inv(I - rho * W)
# 简化效应分解
direct_effect = beta.mean()
indirect_effect = (rho * W).sum() / len(W)
print(f"直接效应: {direct_effect:.4f}")
print(f"间接效应: {indirect_effect:.4f}")
LeSage和Pace(2009)提出偏微分方法:
∂y/∂x_j = (I - ρW)⁻¹(β_j I + θ_j W)
分解:
直接效应:
间接效应:
对政策制定至关重要——本地政策对邻近区域的溢出不容忽视。
传统GWR假设所有变量的空间尺度相同(共享带宽),但实际上:
MGWR允许每个回归系数有不同的空间尺度。
y_i = Σ_j X_ij β_bw_j(u_i, v_i) + ε_i
其中bw_j是变量j的带宽参数:
城市房价受哪些因素影响?这些因素的影响是否存在空间异质性?不同因素的影响是否在不同的空间尺度上发挥作用?
数据:北京市2020年1km网格房价
地铁站密度呈现多尺度特征:市中心区域(局部尺度)地铁影响弱(已有密集交通),郊区(区域尺度)地铁影响强。绿地覆盖率在全市尺度上影响一致。商服中心距离在街道尺度上影响差异大。
from mgwr.gwr import MGWR
from mgwr.sel_bw import Sel_BW
import geopandas as gpd
import numpy as np
# 准备数据
gdf = gpd.read_file('beijing_housing.shp')
coords = np.array(list(zip(
gdf.geometry.centroid.x,
gdf.geometry.centroid.y
)))
y = gdf['price'].values.reshape(-1, 1)
X = gdf[['metro', 'school', 'hospital',
'green', 'distance']].values
# 带宽选择与MGWR拟合
selector = Sel_BW(coords, y, X, multi=True)
bw = selector.search(multi_bw_min=[2],
multi_bw_max=[100])
mgwr_model = MGWR(coords, y, X, selector, multi=True)
results = mgwr_model.fit()
# 各变量的带宽(尺度参数)
print("Variable Bandwidths:", results.BW)
# 带宽含义:带宽越大,影响越全局
# 局部R²
print("Local R²:", results.R2)
# 系数空间分布
for i, var in enumerate(['metro','school',
'hospital','green','dist']):
gdf[var + '_coef'] = results.params[:, i]
gdf.plot(var + '_coef', cmap='RdBu_r',
legend=True, figsize=(8,6))
空间计量模型本质上是描述性的,但可与因果推断结合:
时间序列与贝叶斯方法
许多GIS问题涉及时间维度:
时间序列因果发现的专业Python库,实现PCMCI算法。
核心功能:
PCMCI分为两步:
在高维情况下比完整条件独立测试更有效率。
标准化时间序列
选择条件独立测试
运行因果发现
可视化因果图
from tigramite.pcmci import PCMCI
from tigramite.independence_tests import ParCorr
# PCMCI分析
pcmci = PCMCI(dataframe=data, cond_ind_test=ParCorr())
results = pcmci.run_pcmci(tau_max=5, pc_alpha=0.05)
# 显著因果链路
print(results['p_matrix']) # p值矩阵
print(results['val_matrix']) # 因果强度
研究CO2排放、气温、降水、海平面等气候变量之间的因果关系,理解气候变化的驱动机制和反馈回路。
数据:中国1960-2020年年度气候数据
主要因果链路:
结果支持了CO2是全球变暖主因的科学共识。
import tigramite.data_processing as pp
from tigramite.pcmci import PCMCI
from tigramite.independence_tests import ParCorr
import pandas as pd
# 加载数据
df = pd.read_csv('climate_data.csv', index_col=0)
var_names = ['CO2', 'Temp', 'Precip', 'SeaLevel', 'NDVI']
data = pp.DataFrame(df.values,
datatime=np.arange(len(df)),
var_names=var_names)
# PCMCI分析
parcorr = ParCorr(significance='analytic')
pcmci = PCMCI(dataframe=data, cond_ind_test=parcorr)
results = pcmci.run_pcmci(tau_max=5, pc_alpha=0.05)
from tigramite.plotting import plot_time_series_graph
# 因果图可视化
plot_time_series_graph(
val_matrix=results['val_matrix'],
sig_mask=results['sig_matrix'],
var_names=var_names,
link_matrix=results['link_matrix'],
figsize=(10, 6)
)
plt.savefig('causal_graph.png')
敏感性分析:测试不同alpha和tau_max参数下的结果稳健性
Python中的贝叶斯概率编程库,使用马尔可夫链蒙特卡洛(MCMC)进行贝叶斯推断。
核心能力:
import pymc3 as pm
with pm.Model() as model:
# 超先验
sigma_region = pm.HalfNormal('sigma_region', sigma=1)
# 区域效应
region_effect = pm.Normal('region_effect',
mu=0, sigma=sigma_region,
shape=n_regions)
# 固定效应
beta = pm.Normal('beta', mu=0, sigma=10)
# 线性预测
mu = beta * X + region_effect[region_idx]
# 似然
y_obs = pm.Normal('y_obs', mu=mu,
sigma=sigma_obs, observed=y)
with pm.Model() as spatial_model:
# CAR先验
tau_spatial = pm.HalfNormal('tau_spatial', sigma=1)
spatial_effect = pm.distributions.CAR(
'spatial_effect',
mu=0, tau=tau_spatial,
W=adjacency_matrix
)
# 其余代码同上
# 模型拟合
with spatial_model:
trace = pm.sample(2000, tune=1000, cores=2)
研究空气污染(PM2.5)对呼吸道疾病发病率的空间影响,同时考虑社会经济和医疗资源因素。
目标:
数据:中国2019年区县级数据
使用邻接矩阵表示空间结构。
使用泊松似然建模疾病计数,包含CAR空间先验。结果显示PM2.5效应存在空间异质性,北方工业区效应更强。
总结与展望
DoWhy、CausalNex:适合有明确因果假设的验证性研究
EconML、CausalML:适合高维数据下的异质效应估计
PySAL、MGWR:适合分析空间依赖和溢出效应
Tigramite、PyMC:适合时间因果链条和不确定性分析
| 研究问题 | 推荐方法 | 推荐工具 |
|---|---|---|
| 探索因果假设 | 因果发现 | CausalNex |
| 验证因果假设 | 因果图 + 反驳测试 | DoWhy |
| 估计政策效应 | DML | EconML |
| 发现谁受益最多 | 因果森林 | CausalML |
| 分析空间溢出 | SDM | PySAL |
| 多尺度空间效应 | MGWR | PySAL mgwr |
| 时间因果链条 | PCMCI | Tigramite |
| 处理不确定性 | 贝叶斯推断 | PyMC |
入门:DoWhy基础 + 空间计量基础 → 进阶:因果发现 + 机器学习因果推断 → 高级:时空因果 + 贝叶斯层次模型 → 持续:最新论文和工具更新
欢迎提问与讨论
课程资料、代码示例、参考文献请访问课程网站
沪公网安备31010402010179号
沪ICP备2023003282号-38