StatsModels RollingOLS使用NumPy数组时疑似忽略x轴变量问题排查
问题排查与修正
核心问题分析
你的代码存在两个关键问题,导致结果不符合预期:
- 解释变量格式错误:StatsModels的
RollingOLS要求解释变量(exog)为二维数组(形状(n_samples, n_features)),但你传入的t是一维数组,模型无法正确识别变量维度。 - 图表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
相关产品推荐
相关产品推荐

