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

含缺失值的滚动回归残差计算方法及实现疑问

滚动回归残差计算(含缺失值与滚动窗口适配)

问题描述

需要在含缺失值的矩阵上执行滚动回归并计算每行残差,规则如下:

  • 使用长度为3的滚动窗口:窗口内当前行作为因变量y,前两行作为自变量x
  • 若某列存在空值,对应残差需设为空值

样本输入

abcde
d112433
d24546
d37835
d410115612

预期计算

  • 窗口[d1, d2, d3]:以d3为y,[d1, d2]为x,计算d3的残差
  • 窗口[d2, d3, d4]:以d4为y,[d2, d3]为x,计算d4的残差

遇到的问题

尝试使用moving(calFunc, m, 3)实现滚动窗口计算,碰到两个核心问题:

  1. 空值处理:内置residual和ols函数无法自动处理矩阵中的空值,导致回归计算失败或结果异常
  2. 函数类型不匹配: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 23:43:13