You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

statsmodels OLS的get_prediction能否按列名匹配回归变量?

问题原因

statsmodels 采用非公式接口拟合的OLS模型,get_prediction()方法默认不会根据传入数据的列名自动匹配回归变量,计算预测值时严格按照传入矩阵的列位置,与拟合时存储的系数顺序做矩阵运算。

模型拟合时的自变量顺序为const -> realdpi -> realinv -> tbilrate -> unemp,对应系数也按该顺序存储;调换预测输入的列顺序后,列位置变为const -> tbilrate -> unemp -> realdpi -> realinv,方法不会自动重排列对齐,相当于将realdpi的系数错乘到tbilrate列、realinv的系数错乘到unemp列,最终输出结果不符合预期。

可通过mod.model.exog_names属性查看模型拟合时固定的自变量排列顺序。

解决方法
  • 方法1:手动对齐列顺序
    构造预测输入时,严格复用模型拟合时的列顺序筛选数据,从根源避免错位:
    # 获取拟合时的自变量列顺序(已包含常数项)
    fit_col_order = mod.model.exog_names
    # 按固定顺序构造预测输入
    pred_data = sm.add_constant(macrodata)[fit_col_order]
    # 此时预测结果不会出错
    mod.get_prediction(pred_data).summary_frame(0.95).head()
    
  • 方法2:使用公式接口拟合模型
    如果用statsmodels的公式语法拟合模型,get_prediction()会自动根据列名匹配变量,不需要关心传入数据的列顺序,也不需要手动添加常数项:
    import numpy as np
    import pandas as pd
    import statsmodels.api as sm
    from statsmodels.formula.api import ols
    
    macrodata = sm.datasets.macrodata.load_pandas().data
    macrodata.index = pd.period_range('1959Q1', '2009Q3', freq='Q')
    # 公式接口拟合,自动添加常数项
    mod = ols('realgdp ~ realdpi + realinv + tbilrate + unemp', data=macrodata).fit()
    # 哪怕传入的列顺序打乱,也会自动匹配变量得到正确结果
    mod.get_prediction(macrodata[['tbilrate', 'unemp', 'realdpi', 'realinv']]).summary_frame(0.95).head()
    

注意:非公式接口默认按位置匹配的逻辑对所有传入外生变量的场景生效,不止get_prediction(),计算边际效应、调整标准误等操作时如果列顺序错位,都会得到错误结果。

内容的提问来源于stack exchange,提问作者Bogaso

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:51:21