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

如何用Statsmodels从回归循环生成平均回归汇总表(Meta Table)

生成158次回归平均统计量的汇总表

当然可以生成仅包含平均统计量的单张汇总表。你已经在循环中收集了所有必要的统计量,只需要在循环结束后将这些数据整理并计算均值,再用合适的方式输出成汇总表格即可。

完整修改后的代码

import pandas as pd
import numpy as np
import statsmodels.api as sm
from statsmodels.stats.stattools import durbin_watson

# 初始化存储统计量的列表
Coefficients = []
Pvalues = []
Rsquared_adj = []
Bpagan = []
DBWatson = []
STD = []

# 执行回归循环(移除冗余打印以提升效率)
for i in df:
    df["M"] = ((df["Sum"] - df[i]) / 157)  # 横截面均值变量
    df["Mlag"] = df["M"].shift(1)
    df["Mlead"] = df["M"].shift(-1)
    df["Mtrn"] = (df["BBREIT Index"] - df["BBREIT Index"].shift(1)) / df["BBREIT Index"].shift(1)
    df["Mtrn.lag"] = df["Mtrn"].shift(1)
    df["Mtrn.lead"] = df["Mtrn"].shift(-1)
    df.replace([np.inf], np.nan, inplace=True)
    df = df.fillna(0)
    
    y = df[i]
    x = df[["M","Mlag","Mlead","Mtrn.lag","Mtrn.lead"]]
    x = sm.add_constant(x)
    model = sm.OLS(y, x, missing='drop') 
    results = model.fit()
    
    # 填充统计量列表
    Coefficients.append(results.params)
    Pvalues.append(results.pvalues)
    Rsquared_adj.append(results.rsquared_adj)
    Bpagan.append(sm.stats.diagnostic.het_breuschpagan(results.resid, exog_het=x))
    STD.append(results.bse)
    DBWatson.append(durbin_watson(results.resid))
    
    # 清理临时变量
    df.drop(columns=["M","Mlag","Mlead"], inplace=True)

# ---------------------- 生成平均统计量汇总表 ----------------------
# 1. 处理系数、标准误、P值的均值
coef_df = pd.DataFrame(Coefficients).mean().to_frame("系数均值")
std_df = pd.DataFrame(STD).mean().to_frame("标准误均值")
pval_df = pd.DataFrame(Pvalues).mean().to_frame("P值均值")
coef_summary = pd.concat([coef_df, std_df, pval_df], axis=1)

# 2. 计算模型整体统计量的均值
avg_rsquared_adj = np.mean(Rsquared_adj)
avg_dbwatson = np.mean(DBWatson)

# 3. 处理Breusch-Pagan异方差检验的多维度结果
bpagan_df = pd.DataFrame(Bpagan, columns=["LM统计量", "LM P值", "F统计量", "F P值"])
avg_bpagan = bpagan_df.mean().to_frame("均值").T

# 4. 整合并打印所有汇总结果
print("=== 回归系数平均统计量 ===")
print(coef_summary)
print("\n=== 模型整体平均统计量 ===")
print(pd.DataFrame({
    "调整R²均值": [avg_rsquared_adj],
    "Durbin-Watson均值": [avg_dbwatson]
}))
print("\n=== Breusch-Pagan异方差检验平均统计量 ===")
print(avg_bpagan)

# 可选:生成带显著性星号的专业学术表格
from statsmodels.iolib.summary2 import summary_col

# 构造虚拟结果对象适配summary_col格式
class DummyResults:
    def __init__(self, params, bse, pvalues, rsquared_adj):
        self.params = params
        self.bse = bse
        self.pvalues = pvalues
        self.rsquared_adj = rsquared_adj

dummy_result = DummyResults(
    params=coef_df["系数均值"],
    bse=std_df["标准误均值"],
    pvalues=pval_df["P值均值"],
    rsquared_adj=avg_rsquared_adj
)

# 输出专业格式汇总表
summary_table = summary_col(
    [dummy_result],
    stars=True,
    float_format='%.4f',
    info_dict={
        "调整R²均值": lambda x: f"{x.rsquared_adj:.4f}",
        "Durbin-Watson均值": lambda x: f"{avg_dbwatson:.4f}",
        "BP LM统计量均值": lambda x: f"{avg_bpagan['LM统计量'].values[0]:.4f}",
        "BP LM P值均值": lambda x: f"{avg_bpagan['LM P值'].values[0]:.4f}"
    }
)

print("\n=== 专业格式汇总表 ===")
print(summary_table)

关键说明

  • 循环部分保留原有逻辑,仅移除冗余打印步骤以提升运行速度
  • 利用pandas.DataFrame对收集到的统计量列表做均值计算,操作简洁高效
  • 针对Breusch-Pagan检验的多值输出,单独拆分各指标并计算均值
  • 提供两种输出形式:简洁文本表格适合快速查看,Statsmodels专业格式表格支持显著性星号,适配学术论文场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 14:30:59