如何运行5个同步OLS回归并将结果整合至同一表格?
合并多个回归结果为单一表格的解决方案
核心思路
先逐个提取每个回归模型的系数、p值,添加模型标识后合并所有结果,再转换为目标格式的表格,同时添加显著性标记。
R语言实现示例
1. 加载工具包并拟合模型
library(broom) library(dplyr) library(tidyr) library(knitr) # 替换为你的实际模型与数据 model1 <- lm(mpg ~ wt, data = mtcars) model2 <- lm(mpg ~ wt + hp, data = mtcars) model3 <- lm(mpg ~ wt + hp + disp, data = mtcars) model4 <- lm(mpg ~ wt + hp + disp + drat, data = mtcars) model5 <- lm(mpg ~ wt + hp + disp + drat + qsec, data = mtcars)
2. 提取并合并模型结果
# 提取单个模型的系数、p值,添加模型名称 extract_model <- function(model, model_name) { tidy(model) %>% mutate(model = model_name) %>% select(term, estimate, p.value, model) } # 批量处理5个模型 combined_data <- bind_rows( extract_model(model1, "模型1"), extract_model(model2, "模型2"), extract_model(model3, "模型3"), extract_model(model4, "模型4"), extract_model(model5, "模型5") )
3. 添加显著性标记并整理表格
# 生成显著性标记(***<0.001,**<0.01,*<0.05) combined_data <- combined_data %>% mutate( sig = case_when( p.value < 0.001 ~ "***", p.value < 0.01 ~ "**", p.value < 0.05 ~ "*", TRUE ~ "" ), coeff_with_sig = paste0(round(estimate, 3), sig) ) # 转换为宽格式表格(变量为行,模型为列) final_table <- combined_data %>% pivot_wider( names_from = model, values_from = c(coeff_with_sig, p.value), names_glue = "{model}_{.value}" ) # 输出美观表格 kable(final_table, caption = "5个回归模型的系数与p值(含显著性)")
Python语言实现示例
1. 加载工具包并拟合模型
import statsmodels.api as sm import pandas as pd # 替换为你的实际数据 data = sm.datasets.get_rdataset("mtcars").data # 定义5个回归公式 formulas = [ "mpg ~ wt", "mpg ~ wt + hp", "mpg ~ wt + hp + disp", "mpg ~ wt + hp + disp + drat", "mpg ~ wt + hp + disp + drat + qsec" ]
2. 提取并合并模型结果
model_results = [] for idx, formula in enumerate(formulas, 1): model = sm.OLS.from_formula(formula, data=data).fit() # 提取变量名、系数、p值 result_df = pd.DataFrame({ "变量名": model.params.index, f"模型{idx}_系数": model.params.round(3), f"模型{idx}_p值": model.pvalues.round(4) }) model_results.append(result_df) # 按变量名合并所有模型结果 final_table = model_results[0] for df in model_results[1:]: final_table = pd.merge(final_table, df, on="变量名", how="outer")
3. 添加显著性标记并整理
# 为每个模型的系数添加显著性标记 for i in range(1, 6): final_table[f"模型{i}_系数(含显著性)"] = final_table.apply( lambda row: f"{row[f'模型{i}_系数']}{'***' if row[f'模型{i}_p值']<0.001 else '**' if row[f'模型{i}_p值']<0.01 else '*' if row[f'模型{i}_p值']<0.05 else ''}", axis=1 ) # 选择需要展示的列(仅保留变量名和带显著性的系数) display_table = final_table[[col for col in final_table.columns if "系数(含显著性)" in col or col == "变量名"]] print(display_table)
内容的提问来源于stack exchange,提问作者MrFinance
相关产品推荐
相关产品推荐

