You need to enable JavaScript to run this app. 如何在Python的spreg空间回归模型中纳入分类变量
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 09:36:08