Как я могу добавить звезды в вывод функции tidy() пакета broom?

Я использовал функцию tidy() пакета broom в R для печати сводок по моей модели.

Однако функция tidy() возвращает p-значения без звездочек, что делает ее немного странной для многих людей, привыкших видеть звездочки в сводках моделей.

Кто-нибудь знает способ добавить звезды к выходу?


person bcdeniz    schedule 20.02.2018    source источник


Ответы (4)


Для этого мы можем использовать удобную функцию stars.pval из gtools

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     **
person akrun    schedule 20.02.2018

На самом деле это не цель tidy. Он используется для создания аккуратных фреймов данных из различных объектов, а не для предоставления дополнительных показателей об этих объектах.

Вы всегда можете написать функцию для создания звезд на основе p-значений и добавить столбец во фрейм данных, созданный с использованием tidy. Например:

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
}

Затем что-то вроде:

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     **
person neilfws    schedule 20.02.2018

На этот вопрос уже был дан ответ, но я просто хотел указать на этот еще один вариант, который является более гибким, чем gtools::stars.pval, упомянутый выше, потому что он возвращает кадр данных или вектор в зависимости от того, что вы решите ввести.

# 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 **

Создано 9 апреля 2020 г. с помощью пакета reprex (v0.3.0.9001)

person Indrajeet Patil    schedule 20.02.2018
comment
Кажется, это ничего не возвращает. - person jzadra; 09.04.2020
comment
@jzadra Спасибо, что указали на это. Я обновил ответ. - person Indrajeet Patil; 09.04.2020
comment
Это странно. Результат цепочки каналов без назначения должен быть таким же, как при печати объекта. Возможно, у него нет метода печати. - person jzadra; 09.04.2020

Как используется функцией printCoefmat в R, вы также можете использовать функцию symnum из пакета stats (включенного в базу 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"

Создано 10 сентября 2018 г. с помощью пакета reprex (v0.2.0).

Или, чтобы точно ответить на ваш вопрос, вы можете использовать его так

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 **

Создано 10 сентября 2018 г. с помощью пакета reprex (v0.2.0).

person David    schedule 10.09.2018