dplyr и stargazerМы продолжаем работать с файлом про шоколадные торты:
cakes <- read.csv("https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/lme4/cake.csv")
Посмотрим, как можно выводить описательные статистики с помощью dplyr. Запросим внутри summarise() число наблюдений через n(), среднее и стандартное отклонение:
library(dplyr)
cakes %>% summarise(observations = n(),
avg = mean(temp),
sd = sd(temp))
## observations avg sd
## 1 270 200 17.10997
Мы вывели на экран нужные характеристики. Теперь попробуем на их основе создать новые. Добавим столбец cv с коэффициентом вариации:
cakes %>% summarise(observations = n(),
avg = mean(temp),
sd = sd(temp)) %>%
mutate(cv = sd / avg)
## observations avg sd cv
## 1 270 200 17.10997 0.08554983
В mutate() можно указывать любые названия столбцов, с пробелами, на кириллице и прочим. Убедимся в этом: назовём столбец с коэффициентов вариации иначе и переведём его в проценты:
cakes %>% summarise(observations = n(),
avg = mean(temp),
sd = sd(temp)) %>%
mutate("CV (in %)" = sd / avg * 100)
## observations avg sd CV (in %)
## 1 270 200 17.10997 8.554983
Если нужно вывести описательные статистики по группам, можно сочетать groupby() и summarise():
cakes %>% group_by(recipe) %>%
summarise(observations = n(),
avg = mean(temp),
sd = sd(temp)) %>%
mutate("CV (in %)" = sd / avg * 100)
## # A tibble: 3 x 5
## recipe observations avg sd `CV (in %)`
## <fct> <int> <dbl> <dbl> <dbl>
## 1 A 90 200 17.2 8.59
## 2 B 90 200 17.2 8.59
## 3 C 90 200 17.2 8.59
Теперь познакомимся с библиотекой stargazer. R позволяет выгружать не только таблицы с результатами регрессии, но и почти любые таблицы, например, таблицу с описательными статистиками.
Для начала загрузим библиотеку stargazer. Она используется для выгрузки таблиц «во внешний мир». Библиотека называется так неслучайно: обычно она используется для выгрузки результатов регрессионных моделей, а в моделях значимость коэффициентов для наглядности обозначается звёздочками. Вот и получается star + gaze (глазеть, пристально смотреть), в итоге stargazer.
install.packages("stargazer")
library(stargazer)
Для того, чтобы вывести таблицу с описательными статистиками, нужно просто набрать stargazer() и указать датафрейм:
stargazer(cakes)
##
## % Table created by stargazer v.5.2.2 by Marek Hlavac, Harvard University. E-mail: hlavac at fas.harvard.edu
## % Date and time: пт, мар 29, 2019 - 02:33:31
## \begin{table}[!htbp] \centering
## \caption{}
## \label{}
## \begin{tabular}{@{\extracolsep{5pt}}lccccccc}
## \\[-1.8ex]\hline
## \hline \\[-1.8ex]
## Statistic & \multicolumn{1}{c}{N} & \multicolumn{1}{c}{Mean} & \multicolumn{1}{c}{St. Dev.} & \multicolumn{1}{c}{Min} & \multicolumn{1}{c}{Pctl(25)} & \multicolumn{1}{c}{Pctl(75)} & \multicolumn{1}{c}{Max} \\
## \hline \\[-1.8ex]
## X & 270 & 135.500 & 78.086 & 1 & 68.2 & 202.8 & 270 \\
## replicate & 270 & 8.000 & 4.329 & 1 & 4 & 12 & 15 \\
## temperature & 270 & 200.000 & 17.110 & 175 & 185 & 215 & 225 \\
## angle & 270 & 32.122 & 8.213 & 18 & 26 & 36.8 & 63 \\
## temp & 270 & 200.000 & 17.110 & 175 & 185 & 215 & 225 \\
## \hline \\[-1.8ex]
## \end{tabular}
## \end{table}
Для тех, кто умеет работать в LaTeX, все просто — R выдал теховский код, который можно просто скопировать в tex-файл. Обратите внимание: в начале кода в качестве комментария всегда указывается, есть ли необходимость догружать (указывать в преамбуле) специальные пакеты или нет. В данном случае не нужно.
Можно выгрузить таблицу в tex-файл. Но это будет файл только с кодом для таблицы, без преамбулы и прочего:
stargazer(cakes, out = "mytable.tex")
##
## % Table created by stargazer v.5.2.2 by Marek Hlavac, Harvard University. E-mail: hlavac at fas.harvard.edu
## % Date and time: пт, мар 29, 2019 - 02:33:31
## \begin{table}[!htbp] \centering
## \caption{}
## \label{}
## \begin{tabular}{@{\extracolsep{5pt}}lccccccc}
## \\[-1.8ex]\hline
## \hline \\[-1.8ex]
## Statistic & \multicolumn{1}{c}{N} & \multicolumn{1}{c}{Mean} & \multicolumn{1}{c}{St. Dev.} & \multicolumn{1}{c}{Min} & \multicolumn{1}{c}{Pctl(25)} & \multicolumn{1}{c}{Pctl(75)} & \multicolumn{1}{c}{Max} \\
## \hline \\[-1.8ex]
## X & 270 & 135.500 & 78.086 & 1 & 68.2 & 202.8 & 270 \\
## replicate & 270 & 8.000 & 4.329 & 1 & 4 & 12 & 15 \\
## temperature & 270 & 200.000 & 17.110 & 175 & 185 & 215 & 225 \\
## angle & 270 & 32.122 & 8.213 & 18 & 26 & 36.8 & 63 \\
## temp & 270 & 200.000 & 17.110 & 175 & 185 & 215 & 225 \\
## \hline \\[-1.8ex]
## \end{tabular}
## \end{table}
Посмотрим, в какую папку этот файл сохранился:
getwd()
## [1] "/Users/allat/Desktop"
Тем, кто в LaTeX не работает, легче не стало. Но выход есть. Stargazer умеет не только выводить код в консоль, но и сохранять результат в отдельный файл. Этот файл может быть теховским файлом (.tex), текстовым (.txt) и html-файлом (.htmlили .htm). Word умеет открывать файлы с расширением .htm. И Libre Office/Open Office тоже.
stargazer(cakes, type = "html",
out = "mytable.htm")
| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max |
| X | 270 | 135.500 | 78.086 | 1 | 68.2 | 202.8 | 270 |
| replicate | 270 | 8.000 | 4.329 | 1 | 4 | 12 | 15 |
| temperature | 270 | 200.000 | 17.110 | 175 | 185 | 215 | 225 |
| angle | 270 | 32.122 | 8.213 | 18 | 26 | 36.8 | 63 |
| temp | 270 | 200.000 | 17.110 | 175 | 185 | 215 | 225 |
Теперь попробуем вывести описательные статистики не для всех переменных, а для нескольких:
stargazer(subset(cakes, select = c("angle", "temp")),
type = "html",
out = "mytable.htm")
| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max |
| angle | 270 | 32.122 | 8.213 | 18 | 26 | 36.8 | 63 |
| temp | 270 | 200.000 | 17.110 | 175 | 185 | 215 | 225 |
Добавим заголовок для таблицы и комментарии (notes), а также выровним комментарии по правому краю ('r'):
stargazer(subset(cakes, select = c("angle", "temp")),
type = "html",
out = "mytable.htm",
title = "Summary statistics",
notes = "N = 270",
notes.align = 'r')
| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max |
| angle | 270 | 32.122 | 8.213 | 18 | 26 | 36.8 | 63 |
| temp | 270 | 200.000 | 17.110 | 175 | 185 | 215 | 225 |
| N = 270 | |||||||
Сообщим R, что мы хотим не более 2 знаков после запятой:
stargazer(subset(cakes, select = c("angle", "temp")),
type = "html",
out = "mytable.htm",
title = "Summary statistics",
notes = "N = 270",
notes.align = 'r',
digits = 2)
| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max |
| angle | 270 | 32.12 | 8.21 | 18 | 26 | 36.8 | 63 |
| temp | 270 | 200.00 | 17.11 | 175 | 185 | 215 | 225 |
| N = 270 | |||||||
Наконец, отрегулируем, какие статистики убрать, а какие - оставить. Уберём из выдачи число наблюдений (оно у нас есть в комментариях), минимум, максимум, нижний и верхний квантили, но зато добавим медиану:
# omit.summary.stat
# median
stargazer(subset(cakes, select = c("angle", "temp")),
type = "html",
out = "mytable.htm",
title = "Summary statistics",
notes = "N = 270",
notes.align = 'r',
digits = 2,
omit.summary.stat = c("n", "min", "max", "p25", "p75"),
median = TRUE)
| Statistic | Mean | St. Dev. | Median |
| angle | 32.12 | 8.21 | 31 |
| temp | 200.00 | 17.11 | 200 |
| N = 270 | |||
На этом возможности stargazer не ограничиваются. Очень рекомендую запросить help и немного порефлексировать над имеющимися опциями.
?stargazer