How can I add stars to broom package's tidy() function output?

旧巷老猫 提交于 2020-11-27 01:53:35

问题


I have been using the broom package's tidy() function in R to print my model summaries.

However, the tidy() function returns p-values without stars, which makes it a bit weird for many people who are used to seeing stars in model summaries.

Does anyone know a way to add stars to the output?


回答1:


We can use a convenient function stars.pval from gtools to do this

library(gtools)
library(broom)
library(dplyr)
data(mtcars)
mtcars %>%
   lm(mpg ~ wt + qsec, .) %>%
   tidy %>%
   mutate(signif = stars.pval(p.value))
#        term  estimate std.error  statistic      p.value signif
#1 (Intercept) 19.746223 5.2520617   3.759709 7.650466e-04    ***
#2          wt -5.047982 0.4839974 -10.429771 2.518948e-11    ***
#3        qsec  0.929198 0.2650173   3.506179 1.499883e-03     **



回答2:


This is not really the purpose of tidy. It is used to make tidy data frames from various objects, not to provide additional metrics about those objects.

You could always write a function to generate stars based on p-values and add a column to the data frame generated using tidy. For example:

make_stars <- function(pval) {
  stars = ""
  if(pval <= 0.001)
    stars = "***"
  if(pval > 0.001 & pval <= 0.01)
    stars = "**"
  if(pval > 0.01 & pval <= 0.05)
    stars = "*"
  if(pval > 0.05 & pval <= 0.1)
     stars = "."
  stars
}

Then something like:

library(broom)
library(dplyr)

mtcars %>% 
  lm(mpg ~ wt + qsec, .) %>% 
  tidy() %>% 
  mutate(signif = sapply(p.value, function(x) make_stars(x)))

         term  estimate std.error  statistic      p.value signif
1 (Intercept) 19.746223 5.2520617   3.759709 7.650466e-04    ***
2          wt -5.047982 0.4839974 -10.429771 2.518948e-11    ***
3        qsec  0.929198 0.2650173   3.506179 1.499883e-03     **



回答3:


This question has already been answered, but just wanted to point out this another option which is more flexible than gtools::stars.pval mentioned above because it gives back a dataframe or a vector, based on whatever is it that you choose to enter.

# loading the necessary library
library(broom)
library(dplyr)
library(groupedstats)

# using the function
df <- mtcars %>%
  stats::lm(mpg ~ wt + qsec, .) %>%
  broom::tidy(.) %>%
  groupedstats::signif_column(data = ., p = p.value)

df
#> # A tibble: 3 x 6
#>   term        estimate std.error statistic  p.value significance
#>   <chr>          <dbl>     <dbl>     <dbl>    <dbl> <chr>       
#> 1 (Intercept)   19.7       5.25       3.76 7.65e- 4 ***         
#> 2 wt            -5.05      0.484    -10.4  2.52e-11 ***         
#> 3 qsec           0.929     0.265      3.51 1.50e- 3 **

Created on 2020-04-09 by the reprex package (v0.3.0.9001)




回答4:


As used by the printCoefmat function in R, you can also use the symnum function from the stats package (included in base r):

pv <- c(0.00001, 0.002, 0.02, 0.06, 0.12, 0.99)

stars <- symnum(pv, corr = FALSE, na = FALSE, 
       cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1), 
       symbols = c("***", "**", "*", ".", " "))

# fetch the stars only
as.character(stars)
#> [1] "***" "**"  "*"   "."   " "   " "

# fetch the legend description
attr(stars, "legend")
#> [1] "0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1"

Created on 2018-09-10 by the reprex package (v0.2.0).

Or to precisely answer your question, you can use it like so

library(dplyr)

pv <- c(0.00001, 0.002, 0.02, 0.06, 0.12, 0.99)

star_function <- function(x) {
  symnum(x, corr = FALSE, na = FALSE, 
         cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1), 
         symbols = c("***", "**", "*", ".", " "))
}
stars <- star_function(pv)

# fetch the stars only
as.character(stars)
#> [1] "***" "**"  "*"   "."   " "   " "

# fetch the legend description
attr(stars, "legend")
#> [1] "0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1"

mtcars %>%
  stats::lm(mpg ~ wt + qsec, .) %>%
  broom::tidy(.) %>% 
  mutate(sign = as.character(star_function(p.value)))
#> # A tibble: 3 x 6
#>   term        estimate std.error statistic  p.value sign 
#>   <chr>          <dbl>     <dbl>     <dbl>    <dbl> <chr>
#> 1 (Intercept)   19.7       5.25       3.76 7.65e- 4 ***  
#> 2 wt            -5.05      0.484    -10.4  2.52e-11 ***  
#> 3 qsec           0.929     0.265      3.51 1.50e- 3 **

Created on 2018-09-10 by the reprex package (v0.2.0).



来源:https://stackoverflow.com/questions/48877475/how-can-i-add-stars-to-broom-packages-tidy-function-output

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!