OLS与IV2SLS预测结果异常问题求助
问题分析与解决方案
核心错误根源
你所有的问题都来自模型设定完全错误:把Price同时作为因变量和自变量,这违背了回归模型的基本逻辑,导致回归结果无意义,自然无法得到预期的预测值。从你预期结果约340来看,你实际应该是要预测Quantity(数据中Quantity的范围是241-800,符合340的量级),而非Price。
一、OLS回归的正确实现与预测
正确模型设定
以Quantity为因变量,Price和Cost为自变量,并添加常数项(Statsmodels默认不自动包含常数项,需手动处理):
import statsmodels.api as sm # 生成含常数项的自变量矩阵 X = sm.add_constant(annual[['Price', 'Cost']]) # 构建并拟合OLS模型 ols_model = sm.OLS(annual['Quantity'], X).fit()
正确预测方式
预测时需按照「常数项→Price→Cost」的顺序输入值,例如预测Price=10、Cost=1.83的情况:
# 手动输入参数(顺序对应X的列:const, Price, Cost) print(ols_model.predict([1, 10, 1.83])) # 更稳妥的方式:用DataFrame输入,避免顺序错误 import pandas as pd predict_data = pd.DataFrame({'const': [1], 'Price': [10], 'Cost': [1.83]}) print(ols_model.predict(predict_data))
二、IV2SLS回归的正确实现与预测
IV2SLS用于处理内生性问题(例如你认为Price是内生变量,Cost是其有效工具变量),正确的模型设定如下(推荐使用linearmodels库的IV2SLS,语法更直观):
正确模型设定
from linearmodels import IV2SLS # 用公式语法构建模型:Quantity ~ 常数项 + 内生变量Price + [内生变量Price ~ 工具变量Cost] iv_model = IV2SLS.from_formula( 'Quantity ~ 1 + Price + [Price ~ Cost]', data=annual ) iv_results = iv_model.fit()
正确预测方式
预测时仅需输入内生变量和外生变量的值,工具变量无需输入(模型仅在拟合阶段使用工具变量):
# 用DataFrame输入预测参数 predict_data = pd.DataFrame({'Price': [10], 'Cost': [1.83]}) # linearmodels会自动处理常数项,无需手动添加 print(iv_results.predict(predict_data))
你之前错误的原因解释
- OLS错误:你将
Price同时作为因变量和自变量,回归后Price的系数会被强制拟合为1,Quantity的系数为0,因此输入[1,10]时,预测结果为1*1 + 10*0 = 1,即你得到的[1.]。 - IV2SLS错误:同样混淆了因变量和自变量,且工具变量设定逻辑错误,导致预测时仅读取了输入的第一个值作为结果,即
[1.83]。
内容的提问来源于stack exchange,提问作者Joan Arau
相关产品推荐
相关产品推荐

