如何用Statsmodels解决多DataFrame多元线性回归的尺寸不匹配问题
修正多元线性回归(MLR)的尺寸不匹配问题及SLR R²=0的排查
一、多元线性回归代码错误修正
你的MLR代码存在三个关键问题,导致尺寸不匹配和语法错误:
- 错误的特征维度处理:当选择两个特征列时,
values.reshape(-1,1)会将原本的二维数组(n行×2列)强行转为一维数组(2n行×1列),破坏了多元回归所需的多特征结构。 - numpy数组调用pandas方法:
X = Reddit_WSB[...].values后,X变成numpy数组,无法使用.iloc方法(这是pandas DataFrame专属方法)。 - 语法错误:
y= y.iloc[;min_length]中的分号是笔误,应为冒号。
修正后的MLR代码:
# 先计算两个DataFrame的最小长度 min_length = min(len(Reddit_WSB), len(final_df_twitter)) # 提取特征并截取到相同长度(保持DataFrame格式,避免转成numpy数组后无法切片) X = Reddit_WSB[['Sentiment_score (Body based)', 'Sentiment_score (Title based)']].iloc[:min_length] # 提取目标变量并截取相同长度 y = final_df_twitter['Close'].iloc[:min_length] # 添加常数项(statsmodels需要手动添加截距) X = sm.add_constant(X) # 构建并训练模型 model = sm.OLS(y, X).fit() print(model.summary())
二、简单线性回归(SLR)R²=0的排查
R²=0说明模型完全无法解释目标变量的变异,常见原因有两个:
1. 数据未对齐
如果Reddit_WSB和final_df_twitter的行顺序不对应(比如日期错位,某天的情绪分数对应了另一天的收盘价),会导致两者没有线性关系。解决方法:
- 检查两个DataFrame的索引是否为日期,且日期完全匹配。
- 如果索引不匹配,通过日期列合并两个DataFrame:
# 假设两个DataFrame都有'Date'列 merged_df = pd.merge(Reddit_WSB, final_df_twitter[['Date', 'Close']], on='Date', how='inner') # 用合并后的DataFrame做SLR X = merged_df['Sentiment_score (Title based)'].values.reshape(-1, 1) y = merged_df['Close'] X = sm.add_constant(X) model = sm.OLS(y, X).fit() print(model.summary())
2. 情绪分数与收盘价无线性关系
即使数据对齐,也可能两者本身没有线性相关性。可以先画散点图验证:
import matplotlib.pyplot as plt plt.scatter(merged_df['Sentiment_score (Title based)'], merged_df['Close']) plt.xlabel('Title Sentiment Score') plt.ylabel('Close Price') plt.show()
如果散点图完全随机分布,说明两者确实没有线性关系,R²=0是合理结果。
内容的提问来源于stack exchange,提问作者804gb
相关产品推荐
相关产品推荐

