将 broom::tidy tibble 显示为打印摘要 table

Displaying a broom::tidy tibble as a printed summary table

我有一个看起来很奇怪的问题(但我问的原因的详细信息 很快就会变得清晰)。

考虑在R中拟合一个线性模型,如下:

lm_fit <- lm(mpg ~ cyl+disp, data = mtcars).

现在假设我们生成一个整洁的 tibble(名为 out_summ)的 我们使用令人惊叹的 broom 包的拟合总结如下:

out_summ <- broom::tidy(lm_fit)
out_summ
#> # A tibble: 3 x 5
#>   term        estimate std.error statistic  p.value
#>   <chr>          <dbl>     <dbl>     <dbl>    <dbl>
#> 1 (Intercept)  34.7       2.55       13.6  4.02e-14
#> 2 cyl          -1.59      0.712      -2.23 3.37e- 2
#> 3 disp         -0.0206    0.0103     -2.01 5.42e- 2

reprex package (v0.3.0)

于 2021-02-02 创建

现在考虑只打印 lm_fit object 的摘要 到控制台如下:

summary(lm_fit)
#> 
#> Call:
#> lm(formula = mpg ~ cyl + disp, data = mtcars)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -4.4213 -2.1722 -0.6362  1.1899  7.0516 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)    
#> (Intercept) 34.66099    2.54700  13.609 4.02e-14 ***
#> cyl         -1.58728    0.71184  -2.230   0.0337 *  
#> disp        -0.02058    0.01026  -2.007   0.0542 .  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 3.055 on 29 degrees of freedom
#> Multiple R-squared:  0.7596, Adjusted R-squared:  0.743 
#> F-statistic: 45.81 on 2 and 29 DF,  p-value: 1.058e-09

reprex package (v0.3.0)

于 2021-02-02 创建

现在,我的问题给出了 lm_fit object 和整洁的 out_summ tibble 作为 inputs,是否可以编写一个函数来轻松重现 如上所示打印 summary(lm_fit) table?

我查看了 getAnywhere(print.summary.lm)lm 汇总函数 这很复杂。 从某种意义上说,它是单个列的来源并手动 使用 cat() 调整间距以漂亮打印。因此,考虑到整洁的问题, 这可以很容易地进行逆向工程吗?

动机:我正在开发一个类似于lm的统计模型object, 然而,我们从一开始就使用整洁的 tibble 格式。我们还是愿意 为我们的 object 添加一个摘要方法。这将采用我们整洁的 tibble 格式 并使用 summary(lm_fit) 输出样式的格式打印出来 多于。也就是说,我们不想在不先制作的情况下只打印小标题 它看起来像经典摘要 table 格式。

任何帮助实现这一点,希望代码最少(给定整洁的输入), 将不胜感激。

不确定如何在不使用 lm_fit 对象(或等效对象)的情况下填写摘要的其余部分 table,但也许这些 'first steps' 会有所帮助。

library(tidyverse)

lm_fit <- lm(mpg ~ cyl+disp, data = mtcars)

summarise_lm_like_object <- function(lm_fit){
  out_summ <- broom::tidy(lm_fit) %>%
    mutate(sig = ifelse(p.value <= 0.001, "***",
                        ifelse(p.value <= 0.01, "**",
                               ifelse(p.value <= 0.05, "*", ".")))) %>% 
    rename("Estimate" = estimate,
           "Std. Error" = std.error,
           "t value" = statistic,
           "Pr(>|t|)" = p.value,
           "Significance" = sig)
  
  print.data.frame(out_summ, row.names = FALSE)
  cat("---\n")
  cat("Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1")
}

summarise_lm_like_object(lm_fit)
#>         term    Estimate Std. Error   t value     Pr(>|t|) Significance
#>  (Intercept) 34.66099474 2.54700388 13.608536 4.022869e-14          ***
#>          cyl -1.58727681 0.71184427 -2.229809 3.366495e-02            *
#>         disp -0.02058363 0.01025748 -2.006696 5.418572e-02            .
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

reprex package (v1.0.0)

创建于 2021-02-03