如何用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
相关产品推荐
相关产品推荐

