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

如何用Statsmodels解决多DataFrame多元线性回归的尺寸不匹配问题

修正多元线性回归(MLR)的尺寸不匹配问题及SLR R²=0的排查

一、多元线性回归代码错误修正

你的MLR代码存在三个关键问题,导致尺寸不匹配和语法错误:

  1. 错误的特征维度处理:当选择两个特征列时,values.reshape(-1,1)会将原本的二维数组(n行×2列)强行转为一维数组(2n行×1列),破坏了多元回归所需的多特征结构。
  2. numpy数组调用pandas方法:X = Reddit_WSB[...].values后,X变成numpy数组,无法使用.iloc方法(这是pandas DataFrame专属方法)。
  3. 语法错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:43:12