如何生成含显著性等指标的转置格式年度时间序列回归结果表
我完全懂你想要的那种表格布局——把年份放在行,截距项b0到b4、R²、F统计量这些作为列,还要带上显著性星号标记对吧?之前用memisc的mtable()得到的是系数在行、年份在列的格式,确实不符合你的需求。这里给你两个实用的解决方案,都是在R里实现的:
方案1:用broom+tidyverse定制表格(推荐,更灵活)
这个方法是先把每个年度的模型结果拆成“tidy格式”,再拼接成你想要的宽表,完全可控:
首先,先模拟年度数据(你替换成自己的真实数据就行):
set.seed(123) years <- 2010:2012 # 生成每个年份的数据集 data_list <- lapply(years, function(y) { data.frame( year = y, y = rnorm(50), x1 = rnorm(50), x2 = rnorm(50), x3 = rnorm(50), x4 = rnorm(50) ) })
然后拟合每个年份的回归模型:
models <- lapply(data_list, function(df) { lm(y ~ x1 + x2 + x3 + x4, data = df) }) names(models) <- years # 给模型命名为年份
接下来用broom提取系数和模型统计量,再拼接成目标格式:
library(broom) library(dplyr) library(tidyr) # 1. 提取系数并添加显著性星号 coef_data <- bind_rows( lapply(names(models), function(year) { tidy(models[[year]]) %>% mutate(year = as.integer(year)) %>% # 按规则添加星号:***<0.001, **<0.01, *<0.05 mutate( coef_with_star = case_when( p.value < 0.001 ~ paste0(round(estimate, 3), "***"), p.value < 0.01 ~ paste0(round(estimate, 3), "**"), p.value < 0.05 ~ paste0(round(estimate, 3), "*"), TRUE ~ as.character(round(estimate, 3)) ) ) %>% select(year, term, coef_with_star) }) ) # 2. 提取R²和F统计量 model_stats <- bind_rows( lapply(names(models), function(year) { glance(models[[year]]) %>% mutate(year = as.integer(year)) %>% select(year, r.squared, statistic) %>% rename(R_sq = r.squared, F_stat = statistic) %>% mutate( R_sq = round(R_sq, 3), F_stat = round(F_stat, 2) ) }) ) # 3. 合并并转成宽格式(年份在行,指标在列) final_table <- coef_data %>% pivot_wider(names_from = term, values_from = coef_with_star) %>% left_join(model_stats, by = "year") %>% # 调整列顺序成你要的:b0(截距)、b1-b4、R-sq、F-stat relocate(year, `(Intercept)` = `(Intercept)`, x1, x2, x3, x4, R_sq, F_stat)
最后用kableExtra输出美观的表格:
library(kableExtra) final_table %>% kable( col.names = c("Year", "b0", "b1", "b2", "b3", "b4", "R-sq.", "F-stat."), align = "cccccccc" ) %>% kable_styling(full_width = FALSE)
方案2:调整memisc::mtable()的输出
如果你不想换包,也可以把mtable()生成的表格转置后再调整:
library(memisc) # 生成原始mtable mt <- mtable(paste0("Year_", years), models[[1]], models[[2]], models[[3]]) # 转成数据框后转置 mt_df <- as.data.frame(mt) mt_transposed <- t(mt_df) # 清理行名和列名,把年份作为第一列 mt_transposed <- as.data.frame(mt_transposed) %>% mutate(Year = as.integer(gsub("Year_", "", rownames(.)))) %>% relocate(Year) %>% rename( b0 = `(Intercept)`, b1 = x1, b2 = x2, b3 = x3, b4 = x4, `R-sq.` = R.squared, `F-stat.` = F.statistic )
这个方法的优点是不用重新处理显著性星号(mtable()已经自动生成了),但格式调整的灵活性不如第一个方案。
两种方法都能得到你想要的“年份在行、指标在列”的表格,推荐第一个方案,因为后续要调整格式、添加额外统计量都更方便。
内容的提问来源于stack exchange,提问作者procrastinator
相关产品推荐
相关产品推荐

