如何在Python的spreg空间回归模型中纳入分类变量
问题原因
你遇到的报错和统计量为nan的核心原因是虚拟变量陷阱:spreg默认会自动在模型中添加常数项,而你生成了7个全量哑变量对应7个土地覆盖类别,7个哑变量的行和恒等于1,和常数项完全共线,导致自变量矩阵不满秩,方差协方差矩阵出现奇异值,计算标准误时无法开根号就返回nan。
statsmodels的OLS会自动检测完全多重共线性并主动删除共线列,所以相同输入可以得到正常结果,但spreg所有模型(包括OLS、GM_Lag等)都不会做自动共线列剔除,需要用户自行保证自变量矩阵满秩。
解决方案
只需要在生成哑变量时丢弃1个类别作为参考组即可,7个类别最终生成6个哑变量,即可避免和常数项共线:
# 生成哑变量时添加drop_first=True参数,自动丢弃第一个类别作为参考组 land_cover_dummies = pd.get_dummies(data['land_cover'], drop_first=True, prefix='cover')
如果你不想用第一个类别当参考组,可以手动删除指定类别对应的哑变量:
land_cover_dummies = pd.get_dummies(data['land_cover'], prefix='cover') # 比如指定cover_4作为参考组,手动删除该列 land_cover_dummies = land_cover_dummies.drop('cover_4', axis=1)
完整运行示例(以GM_Lag为例)
import pandas as pd import spreg from libpysal.weights import Queen # 1. 合并自变量:数值变量 + 处理好的哑变量 X = pd.concat( [data[['temperature', 'precipitation']], land_cover_dummies], axis=1 ) # 2. 提取因变量、自变量数组 y_arr = data['你的因变量列名'].values x_arr = X.values x_names = X.columns.tolist() # 3. 构造空间权重(根据你的实际需求调整权重类型) w = Queen.from_dataframe(data) w.transform = 'r' # 行标准化 # 4. 运行GM_Lag模型 model = spreg.GM_Lag( y=y_arr, x=x_arr, w=w, name_y='你的因变量名称', name_x=x_names ) # 输出结果 print(model.summary)
该处理逻辑对spreg所有模型通用,包括OLS、GM_Error、GM_Lag等空间回归模型。
内容的提问来源于stack exchange,提问作者cordoba27
相关产品推荐
相关产品推荐

