рекомендации

понедельник, 21 июня 2021 г.

Использование papeR - краткое руководство

Это краткое руководство, которое охватывает некоторые из основных функций пакета R papeR.

Основная цель пакета - упростить статистическую отчетность и, таким образом, облегчить воспроизводимость исследований. Используя такие мощные инструменты, как Sweave или пакеты knitr и xtable, пакет можно легко интегрировать в существующие рабочие процессы.
  • Прежде всего, пакет предоставляет инфраструктуру для обработки меток переменных, которые используются во всех других функциях (labels()).
  • Пакет позволяет создавать (сложные) сводные таблицы наборов данных (summarize()) и легко отображать данные (plot() для помеченных data.frames).
  • Наконец, пакет позволяет расширять сводные таблицы статистических моделей, (возможно) добавляя доверительные интервалы, звезды значимости, отношения шансов и т. д., а также разделяя имена переменных и уровни факторов (prettify()).
Начало работы

Прежде чем мы начнем, нам нужно установить пакет. Пакет можно легко получить из CRAN, например с помощью команды

install.packages("papeR")
Чтобы установить последнюю разрабатываемую версию, можно использовать инструменты разработчика для установки пакетов с GitHub. Тогда нам нужно установить и загрузить devtools, прежде чем мы сможем установить papeR:

install.packages("devtools")
library("devtools")
install_github("hofnerb/papeR")

Теперь мы можем загрузить пакет

library("papeR")

Помеченные data frame

Чтобы использовать все функции пакета, нам сначала нужно создать помеченный data frame. Нам нужны помеченные data frame для использования специальной функции plot() (см. ниже). Все остальные функции не требуют строго помеченных data frame, но могут использовать метки.

Метки в papeR хранятся как атрибуты переменных, т.е. каждая переменная в помеченном data frame имеет атрибут «variable.label», а набор данных получает дополнительный класс «ldf». В других пакетах метки переменных хранятся иначе. Например. функция read.spss() из пакета foreign сохраняет метки переменных как один атрибут набора данных. Пакет papeR также может использовать эти метки.

Установка и извлечение меток

Если мы создадим новый data.frame, мы сможем извлекать и устанавливать метки переменных с помощью функции labels(). В этом руководстве мы используем пакет данных Orthodont nlme. Сначала загрузите данные:

data(Orthodont, package = "nlme")
## keep the original data set for later use
Orthodont_orig <- Orthodont

Чтобы проверить, является ли набор данных помеченным набором данных (т. е. класса ldf), мы можем использовать команду:

is.ldf(Orthodont)
## [1] FALSE

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

labels(Orthodont)
##   distance        age    Subject        Sex 
## "distance"      "age"  "Subject"      "Sex"

Это удобная функция, поскольку мы можем полагаться на тот факт, что у нас всегда будут какие-то метки переменных.

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

labels(Orthodont) <- c("fissure distance (mm)", "age (years)", "Subject", "Sex")

Если мы теперь запросим, ​​является ли Ортодонт помеченным data frame, и извлечем метки, мы получим:

is.ldf(Orthodont)
## [1] TRUE
class(Orthodont)
## [1] "ldf"            "nfnGroupedData" "nfGroupedData"  "groupedData"   
## [5] "data.frame"
Мы видим, что, задавая метки переменных, мы также добавляем во фрейм данных класс ldf. Теперь у нас есть метки:

labels(Orthodont)
##                distance                     age                 Subject 
## "fissure distance (mm)"           "age (years)"               "Subject" 
##                     Sex 
##                   "Sex"

Расширенная маркировка

Мы также можем устанавливать или извлекать метки для подмножества переменных, используя параметр which, который может быть вектором имен переменных или индексов. Давайте возьмем названия distance и age с заглавной буквы, чтобы они соответствовали Subject и Sex:

## set labels for distance and age
labels(Orthodont, which = c("distance", "age")) <- c("Fissure distance (mm)", "Age (years)")
## extract labels for age only
labels(Orthodont, which = "age")
##           age 
## "Age (years)"
## or for the first two variables (i.e., distance and age)
labels(Orthodont, which = 1:2)
##                distance                     age 
## "Fissure distance (mm)"           "Age (years)"

Преобразование в помеченные data frame

Вместо того, чтобы вручную устанавливать метки, мы можем просто преобразовать data frame в помеченный data frame либо с помощью функции as.ldf(), либо с помощью convert.labels(). Фактически, оба вызова ссылаются на одну и ту же функцию (для объекта класса data.frame).

Хотя as.ldf() можно рассматривать как классический аналог is.ldf(), название функции convert.labels() основано на том факте, что эти функции либо преобразуют имена переменных в метки, либо преобразуют метки других переменных в papeR - тип переменных labels. Следовательно, эти функции могут, например, использоваться для преобразования меток из наборов данных, которые импортируются с помощью функции read.spss(), в метки переменных типа papeR.

Если метки переменных не указаны, используются исходные имена переменных.

Orthodont2 <- convert.labels(Orthodont_orig)
class(Orthodont2)
## [1] "ldf"            "nfnGroupedData" "nfGroupedData"  "groupedData"   
## [5] "data.frame"
labels(Orthodont2)
##   distance        age    Subject        Sex 
## "distance"      "age"  "Subject"      "Sex"

Построение помеченных data frame

Для data frame класса ldf существуют специальные функции построения графиков:

par(mfrow = c(2, 2))
plot(Orthodont)


Как видно, тип графика определяется автоматически в зависимости от типа данных, а метка оси определяется labels().

Чтобы получить групповые сравнения, мы можем использовать сгруппированные графики. Чтобы построить график всех переменных в группах Sex, можно использовать команды:

par(mfrow = c(1, 3))
plot(Orthodont, by = "Sex")


Мы также можем построить все на основе метрического переменного расстояния.

par(mfrow = c(1, 3))
plot(Orthodont, with = "distance")

Чтобы отобразить только подмножество данных, скажем, все, кроме Subject, в зависимости от расстояния и убрать линию регрессии, мы можем использовать команды:

par(mfrow = c(1, 2))
plot(Orthodont, variables = -3, with = "distance", regression.line = FALSE)

Обратите внимание, что мы снова можем использовать имена переменных или индексы, чтобы указать переменные, которые должны быть визуализированы.

Сводные таблицы

Можно использовать команду summarize() для автоматического создания сводных таблиц либо для числовых переменных (т. е. переменных, где is.numeric() имеет значение TRUE), либо для категориальных переменных (где is.factor() имеет значение TRUE). Мы извлечем сводную таблицу для числовых переменных набора данных Orthodont:

data(Orthodont, package = "nlme")
summarize(Orthodont, type = "numeric")
##              N    Mean   SD    Min Q1 Median Q3  Max
## 1 distance 108   24.02 2.93   16.5 22  23.75 26 31.5
## 2      age 108   11.00 2.25    8.0  9  11.00 13 14.0

Аналогичным образом мы можем извлечь сводную таблицу для всех факторных переменных. Поскольку одним из факторов является Subject, имеющий 27 уровней, каждый с 4 наблюдениями, мы исключаем его из сводной таблицы и рассматриваем только Sex.

summarize(Orthodont, type = "factor", variables = "Sex")
##        Level    N    %
## 1 Sex   Male   64 59.3
## 2     Female   44 40.7

Опять же, что касается графиков, можно указать группы для получения сгруппированной статистики:

summarize(Orthodont, type = "numeric", group = "Sex", test = FALSE)
##               Sex    N    Mean   SD    Min Q1 Median    Q3  Max
## 1 distance   Male   64   24.97 2.90   17.0 23  24.75 26.50 31.5
## 2          Female   44   22.65 2.40   16.5 21  22.75 24.25 28.0
## 3      age   Male   64   11.00 2.25    8.0  9  11.00 13.00 14.0
## 4          Female   44   11.00 2.26    8.0  9  11.00 13.00 14.0

По умолчанию также проводятся тесты на групповые различия:

summarize(Orthodont, type = "numeric", group = "Sex")
##               Sex    N    Mean   SD    Min Q1 Median    Q3  Max   p.value
## 1 distance   Male   64   24.97 2.90   17.0 23  24.75 26.50 31.5    <0.001
## 2          Female   44   22.65 2.40   16.5 21  22.75 24.25 28.0          
## 3      age   Male   64   11.00 2.25    8.0  9  11.00 13.00 14.0     1.000
## 4          Female   44   11.00 2.26    8.0  9  11.00 13.00 14.0

Конвертация резюме в PDF

Пока что у нас есть только стандартный вывод R. Тем не менее, любую из этих сводных таблиц можно легко преобразовать в код LaTeX с помощью пакета xtable. В papeR определены две специальные функции xtable.summary() и print.xtable.summary() для простого и удобного преобразования. В Sweave мы можем использовать команды:

<<echo = FALSE, results = tex>>=
xtable(summarize(Orthodont, type = "numeric"))
xtable(summarize(Orthodont, type = "factor", variables = "Sex"))
xtable(summarize(Orthodont, type = "numeric", group = "Sex"))
@
и в knitr мы можем использовать команды:

<<echo = FALSE, results = 'asis'>>=
xtable(summarize(Orthodont, type = "numeric"))
xtable(summarize(Orthodont, type = "factor", variables = "Sex"))
xtable(summarize(Orthodont, type = "numeric", group = "Sex"))
@
чтобы получить следующий PDF-файл:


Вывод LaTeX

Обратите внимание, что по умолчанию для booktabs в print.xtable.summary установлено значение TRUE, и поэтому в заголовке отчета LaTeX требуется \usepackage {booktabs}. Для получения подробной информации о сводных таблицах LaTeX см. специальную виньетку, которую можно получить, например, с помощью vignette("papeR\_with\_latex", package = "papeR"). См. также там более подробную информацию о сводных таблицах в целом.

Преобразование сводных таблиц в Markdown

Для получения вывода markdown мы можем использовать, например, функцию kable() из пакета knitr для сводных объектов:

```{r, echo = FALSE, results = 'asis'}
library("knitr")
kable(summarize(Orthodont, type = "numeric"))
kable(summarize(Orthodont, type = "factor", variables = "Sex", cumulative = TRUE))
kable(summarize(Orthodont, type = "numeric", group = "Sex", test = FALSE))
```
что дает следующие результаты:

NMeanSDMinQ1MedianQ3Max
distance10824.022.9316.52223.752631.5
age10811.002.258.0911.001314.0
LevelN% %
SexMale6459.359.3
Female4440.7100.0

SexNMeanSDMinQ1MedianQ3Maxp.value
1distanceMale6424.972.9017.02324.7526.5031.5<0.001
1.1Female4422.652.4016.52122.7524.2528.0
2ageMale6411.002.258.0911.0013.0014.01.000
2.1Female4411.002.268.0911.0013.0014.0
Настройка вывода модели

Чтобы преобразовать вывод линейной модели, можно использовать функцию prettify(). Эта функция добавляет доверительные интервалы, правильно печатает p-значения, добавляет звездочки значимости к выходным данным (при желании) и дополнительно добавляет красивое форматирование для факторов.

linmod <- lm(distance ~ age + Sex, data = Orthodont)
## Extract pretty summary
(pretty_lm <- prettify(summary(linmod)))
##                 Estimate CI (lower) CI (upper) Std. Error   t value Pr(>|t|)
## 1 (Intercept) 17.7067130 15.5014071 19.9120189 1.11220946 15.920304   <0.001
## 2         age  0.6601852  0.4663472  0.8540231 0.09775895  6.753194   <0.001
## 3 Sex: Female -2.3210227 -3.2031499 -1.4388955 0.44488623 -5.217115   <0.001
##      
## 1 ***
## 2 ***
## 3 ***

Результирующую таблицу теперь можно отформатировать для печати с помощью таких пакетов, как xtable для LaTeX, которые можно использовать в файлах .Rnw с параметром results = 'asis' (в knitr) или results = tex (в Sweave).

xtable(pretty_lm)

В файлах markdown (.Rmd) вместо этого можно использовать функцию kable() с параметром chunk results = 'asis'. Результат выглядит следующим образом:

kable(pretty_lm)

EstimateCI (lower)CI (upper)Std. Errort valuePr(>|t|)
(Intercept)17.706713015.501407119.91201891.112209515.920304<0.001***
age0.66018520.46634720.85402310.09775896.753194<0.001***
Sex: Female-2.3210227-3.2031499-1.43889550.4448862-5.217115<0.001***
Поддерживаемые объекты

В настоящее время функция prettify реализована для объектов следующих классов:
  • lm (линейные модели)
  • glm (обобщенные линейные модели)
  • coxph (модели пропорциональных рисков Кокса)
  • lme (линейные смешанные модели; реализовано в пакете nlme)
  • mer (линейные смешанные модели; реализовано в пакете lme4, версия <1.0)
  • merMod (линейные смешанные модели; реализовано в пакете lme4, версия> = 1.0)
  • anova (объекты anova)
Выводы и перспективы

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

papeR находится в стадии активной разработки. Запросы функций, отчеты об ошибках или патчи, которые либо добавляют новые функции, либо исправляют ошибки, всегда приветствуются. Пожалуйста, используйте страницу GitHub.

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

Отправить комментарий