Statsmodels OLS面板回归中.get_prediction()维度不匹配问题求解
解决Statsmodels OLS.get_prediction()维度不匹配问题
报错原因
你遇到的ValueError: shapes (3289,4) and (1,) not aligned核心原因是预测输入的特征维度和模型训练时的特征维度完全不匹配:
- 训练模型时,你仅传入了单变量
df['x_variable']作为自变量,模型的系数仅1个(无截距时)或2个(有截距时)。 - 但调用
get_prediction(train)时,你传入了包含4列的完整DataFrame,模型会将其当作4维特征矩阵,自然无法和1维的系数矩阵完成矩阵运算。
修正方案
必须保证预测时的输入和训练时的自变量结构完全一致,以下是两种可行的修正代码:
方案1:添加截距项训练模型(推荐)
Statsmodels的OLS默认不会自动添加截距项,手动添加能让回归结果更符合统计逻辑:
import pandas as pd import statsmodels.api as sm df = pd.read_csv("df_panel.csv", header=0) # 构造带截距的自变量矩阵 X = sm.add_constant(df['x_variable']) # 训练模型 pooled_olsr_model = sm.OLS(df['y_variable'], X) pooled_olsr_model_results = pooled_olsr_model.fit() train = df[df['percentage']<75] # 构造和训练时结构一致的预测输入(带截距) train_X = sm.add_constant(train['x_variable']) # 执行预测 predictions = pooled_olsr_model_results.get_prediction(train_X)
方案2:不添加截距项(仅适合不需要截距的场景)
如果你确定业务场景不需要截距,直接传入和训练时一致的单变量即可:
import pandas as pd import statsmodels.api as sm df = pd.read_csv("df_panel.csv", header=0) # 使用单变量作为自变量(无截距) X = df['x_variable'] pooled_olsr_model = sm.OLS(df['y_variable'], X) pooled_olsr_model_results = pooled_olsr_model.fit() train = df[df['percentage']<75] # 仅传入训练时用的自变量列 train_X = train['x_variable'] # 执行预测 predictions = pooled_olsr_model_results.get_prediction(train_X)
额外提示
如果你的数据是面板数据,更推荐使用Statsmodels生态下的PanelOLS(需导入linearmodels库)来处理个体或时间固定效应,混合OLS可能无法捕捉面板数据的特性。
内容的提问来源于stack exchange,提问作者Nabih Bawazir
相关产品推荐
相关产品推荐

