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

如何生成含显著性等指标的转置格式年度时间序列回归结果表

我完全懂你想要的那种表格布局——把年份放在行,截距项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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:42:48