Как создать сводную таблицу статистики по нескольким категориям (группам) с помощью stargazer?

#r #latex #summary #stargazer

#r #Латекс #Краткие сведения #звездочет

Вопрос:

Мне было интересно, есть ли способ создать достойную сводную таблицу статистики по нескольким категориям (группам) с использованием stargazer() . Я начал со следующего кода, но я не уверен, как продвигаться дальше.

 library(mtcars)
mtcars2 <- within(mtcars, {
  vs <- factor(vs, labels = c("V", "S"))
  am <- factor(am, labels = c("automatic", "manual"))
  cyl  <- ordered(cyl)
  gear <- ordered(gear)
  carb <- ordered(carb)
})
summary1 = summary(mtcars2)
stargazer(summary1)
 

Это дает мне следующую ошибку:

Ошибка в именах (x) <- значение: атрибут ‘names’ [11] должен иметь ту же длину, что и вектор [3]

Используя stargazer() или другие сопоставимые пакеты, я хочу создать сводную таблицу статистики, классифицированную по transmission ( am ) и engine ( vs ), которая будет представлена следующим образом.

введите описание изображения здесь

Комментарии:

1. Что вы пробовали использовать stargazer() ? Не могли бы вы включить код, который вы пытались выделить, чтобы выделить проблемы с кодированием stargazer, которые у вас есть?

2. @Peter Я попытался stargazer(summary) и получил Error in names(x) <- value : 'names' attribute [11] must be the same length as the vector [3] , но даже если я решу эту проблему, мой код все равно не реализует приведенную выше таблицу. Я хочу знать, как кодировать, прежде чем подавать заявку stargazer() .

3. Пожалуйста, включите этот код и ошибку в вопрос, поскольку это ваша проблема с кодированием. Где summary определено, укажите, как вы решили эту проблему, и покажите, что вы получаете, чтобы было легко увидеть, в чем проблема (проблемы).

4. @Питер, я только что обновил ее.

Ответ №1:

Вы можете добиться чего-то подобного с datasummary помощью функции из modelsummary пакета (отказ от ответственности: я сопровождающий). Подробное описание и множество примеров вы найдете на веб-сайте пакетов.

Загрузите библиотеку и определите пользовательскую функцию для создания среднего значения /- sd. Мы используем обратные метки, потому что имя нашей функции содержит пробелы. Обратите внимание, что из-за символа Юникода это может не работать в Windows.

 library(modelsummary)

`Mean ± SD` <- function(x) { 
    sprintf("%.0f ± %.0f", round(mean(x)), round(sd(x)))
}
 

Очистка меток переменных:

 dat <- mtcars
dat$am = ifelse(dat$am == 0, "automatic", "manual")
dat$vs = ifelse(dat$vs == 0, "v-shaped", "straight")
 

Наконец, мы используем datasummary для создания таблицы. Несколько вещей, на которые следует обратить внимание:

  • Строки идут в левой части формулы
  • Столбцы идут в правой части формулы
  • Статистика и переменные, объединенные символом a , будут отображаться одна за другой.
  • Статистика и переменные, объединенные символом a * , будут «вложены» друг в друга.
  • Круглые скобки можно использовать для вложения нескольких переменных / статистики
  • 1 это сокращение для «всех».

Подробные инструкции и примеры вы найдете на веб-сайте пакета. Эту таблицу можно экспортировать в HTML, LaTeX, Word и другие форматы, используя output аргумент:

 datasummary(
    mpg * (Min   Max   `Mean ± SD`)  
    hp * (Min   Max   `Mean ± SD`)  
    wt * (Min   Max   `Mean ± SD`) ~
    am * vs   1,
    data = dat)
 

введите описание изображения здесь

Альтернативный подход заключается в том, чтобы заранее изменить форму данных. При этом вам не нужно указывать каждую переменную по отдельности в формуле:

 library(tidyverse)

dat <- mtcars %>%
    select(mpg, wt, hp, am, vs) |>
    mutate(am = ifelse(am == 0, "automatic", "manual"),
           vs = ifelse(vs == 0, "v-shaped", "straight")) |>
    pivot_longer(cols = c("mpg", "wt", "hp"),
                 names_to = "variables")

datasummary(
    variables * (Min   Max   `Mean ± SD`) ~ value * am * vs   Heading(`All`) * value,
    data = dat)