含缺失值的滚动回归残差计算方法及实现疑问
滚动回归残差计算(含缺失值与滚动窗口适配)
问题描述
需要在含缺失值的矩阵上执行滚动回归并计算每行残差,规则如下:
- 使用长度为3的滚动窗口:窗口内当前行作为因变量y,前两行作为自变量x
- 若某列存在空值,对应残差需设为空值
样本输入
| a | b | c | d | e | |
|---|---|---|---|---|---|
| d1 | 1 | 2 | 4 | 3 | 3 |
| d2 | 4 | 5 | 4 | 6 | |
| d3 | 7 | 8 | 3 | 5 | |
| d4 | 10 | 11 | 5 | 6 | 12 |
预期计算
- 窗口
[d1, d2, d3]:以d3为y,[d1, d2]为x,计算d3的残差 - 窗口
[d2, d3, d4]:以d4为y,[d2, d3]为x,计算d4的残差
遇到的问题
尝试使用moving(calFunc, m, 3)实现滚动窗口计算,碰到两个核心问题:
- 空值处理:内置
residual和ols函数无法自动处理矩阵中的空值,导致回归计算失败或结果异常 - 函数类型不匹配:
moving函数要求传入聚合函数(返回标量),但residual返回向量,不符合要求
核心疑问
如何在moving框架下正确实现calFunc,同时处理空值和滚动回归残差计算?有没有简便方法编写该函数以适配向量输出和缺失值?
解决方案
1. 自定义适配函数处理向量输出与空值
针对moving函数的标量要求,可以通过按列遍历窗口数据的方式返回残差向量,同时在函数内部完成空值过滤:
import pandas as pd import numpy as np import statsmodels.api as sm def cal_func(window): # window为3行的子矩阵,行顺序:[前前一行, 前一行, 当前行] x_mat = window.iloc[:2, :].T # 前两行转置,每列对应自变量的两个观测值 y_vec = window.iloc[2, :] # 当前行作为因变量 residuals = pd.Series(np.nan, index=y_vec.index) for col in y_vec.index: # 检查当前列窗口内是否存在空值 if pd.isna(y_vec[col]) or pd.isna(x_mat[col]).any(): continue # 构造带截距的自变量矩阵,执行OLS回归 X = sm.add_constant(x_mat[col].values.reshape(-1, 1)) model = sm.OLS(y_vec[col], X).fit() # 计算残差:实际值 - 预测值 residuals[col] = y_vec[col] - model.predict(X)[0] return residuals
2. 逐列滚动适配标量要求
如果moving函数严格要求返回标量,可改为逐列独立执行滚动回归,每列的滚动窗口计算返回单个残差值,自然适配函数要求:
def single_col_residual(col_window): # col_window为当前列的3个滚动窗口值 if pd.isna(col_window).any(): return np.nan x = col_window[:2] y = col_window[2] X = sm.add_constant(x.values.reshape(-1, 1)) model = sm.OLS(y, X).fit() return y - model.predict(X)[0] # 对数据框每列应用滚动计算 result_df = df.apply(lambda col: col.rolling(window=3).apply(single_col_residual, raw=False))
3. 空值处理核心要点
- 对每个窗口的每列单独校验空值,只要窗口内该列存在空值,直接返回空值
- 回归计算前确保输入的自变量和因变量无空值,避免内置函数报错
- 若使用R等其他工具,逻辑一致:按列遍历,过滤空值后执行回归
内容的提问来源于stack exchange,提问作者xinyu zhang
相关产品推荐
相关产品推荐

