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

StatsModels RollingOLS使用NumPy数组时疑似忽略x轴变量问题排查

问题排查与修正

核心问题分析

你的代码存在两个关键问题,导致结果不符合预期:

  1. 解释变量格式错误:StatsModels的RollingOLS要求解释变量(exog)为二维数组(形状(n_samples, n_features)),但你传入的t是一维数组,模型无法正确识别变量维度。
  2. 图表x轴索引误用:当输入为NumPy数组时,RollingOLS结果默认使用整数索引作为坐标轴,而非t的实际数值,导致x轴刻度与数据不匹配。

修正后的代码

import math
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.regression.rolling import RollingOLS

# 生成[0, 2π]区间的sin(t)数据
t = np.array(range(0,1001))/(1000)*2*math.pi
Y = np.sin(t)

# 将解释变量t重塑为二维数组(满足RollingOLS输入要求)
X = t.reshape(-1, 1)
window = 2

# 初始化滚动OLS模型(默认添加截距项,两点拟合的斜率等价于ΔY/Δt)
model = RollingOLS(Y, X, window=window)
results = model.fit()

# 提取滚动回归的斜率系数(对应X的系数β1)
slopes = results.params[:, 0]

# 手动绘制对比图,使用t的实际值作为x轴
plt.figure(figsize=(10,6))
# 滚动窗口为2时,第一个有效结果从索引1开始,对应t[1:]
plt.plot(t[1:], slopes[1:], label='RollingOLS 斜率', alpha=0.7)
plt.plot(t, np.cos(t), label='cos(t)', linestyle='--', color='orange')
plt.xlabel('t')
plt.ylabel('数值')
plt.title('滚动OLS斜率与cos(t)对比')
plt.legend()
plt.show()

关键说明

  • 二维数组转换:t.reshape(-1, 1)将一维数组转为(1001, 1)的二维数组,确保RollingOLS正确识别解释变量。
  • 斜率的意义:窗口为2时,滚动回归的斜率等于相邻两点的ΔY/Δt,这是导数cos(t)的数值近似(对应区间中点的导数值),与cos(t)的整体趋势完全一致。
  • 手动绘图:避免使用results.plot_recursive_coefficient()的默认索引轴,直接用t的实际值作为x轴,保证图表刻度与数据匹配。

内容的提问来源于stack exchange,提问作者Luke Fullard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:17:01