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
相关产品推荐
相关产品推荐

