gtsummary
и flextable
Мы продолжаем изучать язык R и язык разметки текста R Markdown для того, чтобы научиться их использовать для анализа и представления результатов научных исследований. В рамках предыдущей темы мы научились создавать документ в R Markdown и наполнять его содержимым на основе готовых шаблонов и примеров кода, разобранных на предыдущих занятиях.
Следующий этап – научиться использовать синтаксис R Markdown для подготовки рукописи научной статьи. В рамках данной темы мы научимся создавать такой документ R Markdown, при “сшивке” которого в формате Word будут соблюдены требования научного журнала к формату текста, шрифтам, заголовкам к таблицам и графикам, а также расширим наши познания в области обработки и анализа данных на языке R.
Решение данной задачи предполагает рассмотрение следующих вопросов:
Чтобы ответить на эти вопросы, рассмотрим основные части документа R Markdown, помогающие нам выполнить нашу задачу. Еще раз уточним, что возможности R Markdown гораздо шире, и, если быть до конца честными, добавим, что подготовка документов в html или pdf – дело более простое и приятное, чем его использование для форматирования документа в формате Word. Большинство существующих учебных материалов и готовых кейсов как правило рассматривают именно эти форматы. Однако, учитывая, что большинство российских журналов, в том числе журнал, на требования которого мы будем ориентироваться, по-прежнему принимают рукописи в формате Word, мы будем учиться использовать R Markdown именно для этого.
Типичная структура документа, выполненного в R Markdown, включает следующие блоки:
Когда пользователь создает документ R Markdown (напомним, что для этого нужно в программе R Studio выбрать File - New File - R Markdown
, а затем указать формат документа, его название и автора), то первое, что он видит в окне после того, как откроется новый файл .Rmd
, – это основные сведения о документе (то, что находится между строками, обозначенными тремя пунктирными линиями ---
. Мнимальный набор элементов блока YAML включает:
YAML — это язык для хранения информации в формате, понятном человеку (human-readable). Эта аббревиатура сначала расшифровывалась как «Yet another markup language» - «Ещё один язык разметки». Однако, позже ее изменили на «YAML Ain’t Markup Language» -— «YAML не язык разметки», чтобы отличать его от настоящих языков разметки, таких, например, как xml или html.
Блок YAML предназначен для хранения метаданных – дополнительной информации о документе, которая может автоматически обрабатываться поисковыми системами. В сфере научной информации помимо названия и сведений об авторах метаданные обычно включают также аффилиацию авторов – их принадлежность к какой-либо научной или образовательной организации, электронный адрес, аннотацию статьи и ключевые слова. Расширенный вариант метаданных может также содержать информацию о количестве слов в документе, наличии графического материала, даты принятия статьи к печати и т. д.
При подготовке итогового проекта по написанию научной статьи с использованием информационных технологий для данного курса мы будем руководствоваться требованиями научного журнала Алтайского государственного университета «Society and Security Insights».
В руководстве авторов журнала приводится пример метаданных, они достаточно традиционные:
Чтобы создать такие метаданные в формате ворд, нужно изменить блок YAML в R Markdown, добавив туда недостающие элементы:
title: "Название статьи"
author:
- И. И. Иванов^1^, П. П. Петров^2^
date: ^1^Алтайский государственный университет, Барнаул, Россия, ivanov@mail.ru, ^2^Московский государственный университет, Москва, Россия, petrov@mail.ru
abstract: |
Аннотация статьи.
*Ключевые слова*: ключевое слово1, ключевое слово2.
В результате после “сшивки” получится примерно следующее:
Это почти то, что нужно, однако, цвет заголовков, шрифты, выравнивание текста, абзацы и межстрочные интервалы не совсем соответствуют требованиям журнала. Что делать? Как настроить R Markdown и Word, чтобы текст соответствовал нашим правилам?
Для форматов html и pdf в R Markdown создано огромное количество готовых шаблонов, позволяющих создавать научные статьи, оформленные по требованиям журналов и международных конференций, включая такие как:
Большой интерес представляет также библиотека papaja, позволяющая с помощью R Markdown создать манускрипты статей, соответствующий требованиям Американской психологической ассоциации American Psychological Association - APA. Стиль APA (сейчас действует уже 7-я версия) является одним из наиболее используемых в социальных и поведенческих науках, в области коммуникации, бизнеса и образования, а также в других областях науки и практики. Можно с уверенностью сказать, что овладение навыками оформления статьей в соответствии со стилем APA является необходимым для всех исследователей, стремящихся к высоким стандартам научной деятельности.
Для стиля APA типично использование внутритекстовых ссылок на авторов в формате (Автор, год издания) и особым образом оформленного списка используемых источников.
На сайте проекта papaja`на GitHub можно найти примеры как использовать данную библиотеку не только для оформления метаданных, но для представления результатов статистического анализа, оформления ссылок на литературные источники, графики и иллюстрации, создания перекрестных ссылок.
Для работы в Microsoft Word специалистами R Studio и авторами R Markdown сделано гораздо меньше, несмотря на то, что многие издательства да и образовательные организации по-прежнему предпочитают принимать рукописи статей, диссертаций, монографий именно в формате doc/docx. Судя по сообщениям на тематических форумах, совмещение Word и R Markdown является актуальным для многих исследователей. Между тем, несмотря на существенный разрыв в возможностях форматирования, для работы с Word (а также с Power Point) также созданы очень продвинутые инструменты, такие например, как Officer, Officedown, Flextables (автор - David Gohel и его коллеги из французской компании ArtData, специализирующейся на разработке технологических решений, связанных с использованием языка R – см. сайт.
Для создания шаблона в Word воспользуемся возможностями библиотеки officedown и технологией, преложенной Yihui Xie. Ее суть заключается в следующем:
Важно: Если работа со стилями в программе MS Word для вас является новой, рекомендуем обратиться к дополнительным информационным материалам, и прочитать соответствующие источники, например, здесь или здесь.
Шаг 3. Сохранить документ со всеми настройками в той папке, которую вы планируете использовать для написания статьи в R Markdown. Обычно этот файл называют “template.docx”.
Шаг 4. В Файлe .Rmd
в качестве формата вывода (output) указать не только формат word_document, но и файл, используемый в качестве шаблона:
output:
officedown::rdocx_document:
reference_docx: template.docx
Вот короткое видео, в котором показано, как создать такой шаблон, изменить стили и использовать шаблон в R Markdown:
Для целей нашего курса был создан готовый шаблон по требованиям журнала Society & Security Insights. Он находится в приложении к практическому занятию, его нужно скачать и сохранить в папку, где Вы будете готовить свою итоговую статью.
Второй элемент анатомии R Markdown - это сам текст, в который мы можем интегрировать различные визуальные и графические атрибуты, без которых невозможно представить современную научную статью, опирающуюся на результаты эмпирических исследований (в особенности выполненных в рамках “количественной” парадигмы) - формулы, таблицы с описательными статистическими показателями, графики и другие иллюстративные материалы.
Большим преимуществом R Markdown и причиной его популярности является простота включения данных элементов и легкость синтаксиса. Кроме того, для удобства запоминания создано огромное количество обучающих материалов и так называемых cheat sheets – инфографики, где в сжатой форме представлены основы работы в R Markdown и наиболее часто встречающиеся ситуации. Эти информационные материалы можно найти в свободном доступе в Интернете или через меню программы R Studio в разделе help:
Вот как выглядит один из таких cheat sheet:
Разберем наиболее важные элементы синтаксиса, которые могут нам пригодиться для написания научной статьи:
Для создания заголовков используется знак решетки (хэштэг) – #
:
Вот такой синтаксис в маркдауне:
# Заголовок первого уровня
## Заголовок второго уровня
### Заголовок третьего уровня
при конвертации будет отображен как:
Когда документ будет переформатирован в Word, для оформления будут использованы стили для различных заголовков.
В процессе написания статьи в авторов довольно часто возникает необходимость выделить какую-то часть текста, например, важные термины или определения. Лучше всего это сделать с помощью полужирного шрифта или курсива. В маркдауне такое выделение сделать очень просто.
Для создания курсива слово нужно обрамить с помощью звездочек или знаков нижнего подчеркивания: *выделяемое слово*
и _выделяемое слово_
отобразятся как выделяемое слово.
Для полужирного шрифта понадобятся двойные звездочки: **слово, которое нужно выделить**
будет выглядеть как слово, которое нужно выделить.
Затронем еще один важный момент, связанный с форматированием текста – различение знаков тире и дефиса. Дефис – это орфографический знак в виде короткой черточки, который отличается от тире начертанием и тем, что он употребляется для соединения сложных слов, а также ставится между частями слов. Тире – это пунктуационный разделительный знак, который употребляется между членами предложения и простыми предложениями в составе сложных.
С дефисом обычно проблем не бывает, а вот с тире, особенно в научных публикациях, возникают сложности.
При форматировании текста нужно помнить, что тире бывает средним (его еще называют коротким) и длинным.
Короткое тире еще называют «эн-дэш», «n-dash», потому что его длина равна ширине буквы N. Короткое тире ставится между числами, например, 5–10.
Длинное тире еще называют «эм-дэш», «m-dash», потому что его длина равна ширине буквы M.
Чтобы в маркдауне поставить короткое тире нужно использовать двойной дефис --
, а для длинного тире - тройной ---
. Вот и все, и никаких сложностей.
Гиперссылки создаются с помощью сочетания квадратных и круглых скобок: [текст](адрес)
, например, [RStudio](https://www.rstudio.com)
будет выглядеть как RStudio.
Синтаксис для картинок и изображений очень похож: нужно просто добавить восклицательный знак, например, 
. В скобках можно указывать как адрес изображения к Интернете, так и путь к файлу, сохраненному в компьютере.
Пример: 
Рисунок 1. Милый котик.
Затекстовые ссылки оформляются внутри квадратных скобок после знака каретки ^[]
, например, вот так: 1. Такие ссылки нумеруются автоматически, используется сквозная нумерация.
Формулы в маркдауне могут быть встроены непосредственно в текст с помощью так называемого построчного кода (inline code), либо с помощью TeX-нотации.
Так, знаки “тильда” (~) позволяют создать подстрочные знаки (например, код H~3~PO~4~
позволит записать формулу H3PO4), а знаки каретки (^) используются для обозначения надстрочных элементов (например, набрав Cu^2+^
получим Cu2+, а x^2^
x2).
Возможно, нам понадобятся греческие буквы, их можно получить с помощью формул TeX: $\alpha$, $\beta$, $\sigma$, $\mu$
– α, β, σ, μ.
Чтобы пометить какой-то код как код и не выполнять его, нужно обернуть его в одинарные кавычки: code
.
Пример более сложных формул, созданных с помощью нотации TeX:
$$
E = mc^2
$$
E=mc2
$$
\sum_{i = 1}^{n}{(\bar{x} - x_i)^2}
$$
n∑i=1(ˉx−xi)2
$$
Y \sim X\beta_0 + X\beta_1 + \epsilon
$$
Y∼Xβ0+Xβ1+ϵ Wiki-учебник по математическим формулам в TeX/LaTeX
Как в теоретической, так и практической части научной статьи авторы часто структурируют информацию и представляют ее в виде списков, нумерованных или маркированных.
Нумерованные списки представляют собой набор фрагментов текста, объединенных общим смыслом, с их порядковыми номерами. В качестве нумерующих элементов обычно выступают арабские цифры (1, 2, 3, …).
Для создания нумерованных списков в R Markdown нужно просто использовать цифры в начале строки:
1. Первый элемент нумерованного списка
2. Второй элемент нумерованного списка
3. Третий элемент нумерованного списка
Маркированный список определяется тем, что перед каждым элементом списка добавляется небольшой маркер, обычно в виде закрашенного кружка.
В маркдауне такие списки создаются с помощью дефисов (-) и табуляции:
- первый элемент маркированного списка
- второй элемент маркированного списка
- элемент более низкого уровня
- еще один элемент
- третий элемент маркированного списка
Вот как это будет выглядеть в Word:
Наверное, самая главная часть маркдауна связана с обработкой эмпирических данных и создания табличных и графических объектом с помощью языка R. Если бы нам был нужен только текст, без каких-либо рассчетов, то маркдаун нам мог бы помочь только с форматированием текста и его структурированием.
Мы исходим из того, что при написании научной статьи мы обязательно будем использовать результаты проведенных социологических исследований, обрабатывать их и презентовать результаты нашего анализа.
Приведем пример анализа данных социологических опросов населения приграничных регионов России по вопросам, касающимся возвратной миграции.
Прежде чем что-то посчитать и описывать, мы должны получить доступ к данным.
Для этого, мы, во-первых, должны скопировать файл с данными исследования в формате .sav
в ту же папку, где будем писать статью, чтобы не прописывать путь к нему (можно не копировать, тогда путь следует указывать полностью).
Во-вторых мы должны установить (если раньше не устанавливали) и загрузить библиотеки для анализа. В рамках регодняшнего занятия нам понадобятся следующие библиотеки:
В некоторых примерах, представленных ниже, используются другие библиотеки. Для их воспроизведения указанные в начале каждого чанка библиотеки также необходимо установить на компьютер перед запуском.
library(haven)
library(sjmisc)
library(dplyr)
library(flextable)
library(gtsummary)
library(ggplot2)
После того, как мы загрузили библиотеки, импортируем базу данных:
df<-read_sav("База_НШ_ВМ_2020_от 21.12.2020.sav", user_na = TRUE)
Теперь мы можем параллельно писать код на R, обрабатывать наши данные с помощью различных методов и процедур, и описывать результаты, не думая о том, как они будут выглядеть в текстовом редакторе, поскольку все настройки уже сохранены в шаблоне - template.docx.
Например, мы описываем нашу выборочную совокупность и хотим проанализировать распределение респондентов по регионам исследования.
Поскольку большинство наших переменных являются факторными (содержат номинальные или порядковые данные), для корректного отображения меток желательно применить функцию as_factor
из библиотеки sjmisc
ко всей базе данных.
df<-as_factor(df)
Если нам нужны простые частоты, не проценты, одним из простых решений будет функция table ()
, с которой мы уже встречались на предыдущих занятиях:
table(df$V004)
##
## Алтайский край Псковская область Саратовская область
## 408 205 471
## Новосибирская область Приморский край Забайкальский край
## 483 454 431
## Другое
## 86
Чтобы выполнить этот фрагмент кода в маркдауне, нужно нажать на зеленый треугольник справа.
Вот этот треугольник:
Поскольку в настройках мы укажем, что не желаем выводить сам код knitr::opts_chunk$set(echo = FALSE)
мы его будем видеть только в маркдауне, а в Word будет уже сохраняться готовый текст, графики и таблицы.
Если нам нужны не абсолютные, а относительные частоты по отдельным вопросам, для которых мы не собираемся делать какие-то таблицы или графики (то есть эти данные нужны только для описания), то для этой цели можно использовать функцию как flat_table
из библиотеки sjmisc
.
Например, мы хотим узнать пропорции по полу во всех регионах исследования.
flat_table(df, Q38, margin = "cell")
## x Женщина Мужчина
##
## 64.63 35.37
Мы видим, что в наших исследованиях приняло участие гораздо больше женщин (65%), чем мужчин (35%).
Если нужна двумерная таблица, функция flat_table
также подойдет (так же как и функции prop.table
, sjt.xtab
, с которыми мы встречались на предыдщих занятиях, здесь дело скорее вкуса, чем функциональности):
Например, посмотрим, распределение по полу в зависимости от региона:
flat_table(df, V004, Q38, margin = "row")# df - наша база данных, V004 Q38 - пересенные для строк и столбцов, margin = "row" - процент по строке
## Q38 Женщина Мужчина
## V004
## Алтайский край 63.36 36.64
## Псковская область 68.69 31.31
## Саратовская область 62.58 37.42
## Новосибирская область 69.31 30.69
## Приморский край 60.14 39.86
## Забайкальский край 66.43 33.57
## Другое 60.49 39.51
Выглядит не очень с точки зрения оформления, зато мы быстро получили результаты и можем их описать. Видим, что женщины превалируют во всех регионах, из доля составляет более 60%, в Новосибирской области - 69%.
Между тем, очевидно, что для хорошей статьи описания результатов частотного анализа недостаточно, требуется представлять результаты комплексно, сразу по нескольким переменным, часто с учетом группировки, и приводить доказательства значимости имеющихся различий на основе применения статистичеких методов.
gtsummary
и flextable
Предположим, что для нашей будущей статьи мы хотим создать большую таблицу, содержащую распределения сразу по нескольким переменным, описывающим все важные демографические и социальные характеристики, такие как пол, возраст по группам, социальный статус, в том числе - с учетом региональных различий. Желательно также посчитать, являются ли эти различия значимыми, используя для этого критерий хи-квадрат Пирсона.
Библиотека gtsummary
была создана специально для того, чтобы быстро создавать гибкие с точки зрения форматирования таблицы с описательными статистиками и результатами регрессионного анализа, оформленные по стандартам для научных публикациий.
Мы настоятельно рекомендуем посетить сайт проекта и подробно ознакомиться с возможностями данной библиотеки. https://www.danieldsjoberg.com/gtsummary/index.html
Для начала создадим общую таблицу, где в строках будут располагаться данные по возрасту, полу, региону проживания, социальному статусу, а также наличию гражданства другой страны.
table<-df %>%
select(V004, Q38, age_cats, Q39, Q49) #отберем нужные переменные в отдельный сет и сохраним его под именем table
# создадим таблицу
table %>%
tbl_summary(missing="no") #функция tbl_summary позволяет создать комплексные таблицы
Characteristic | N = 2,5381 |
---|---|
Укажите регион, в котором Вы проживаете? | |
Алтайский край | 408 (16%) |
Псковская область | 205 (8.1%) |
Саратовская область | 471 (19%) |
Новосибирская область | 483 (19%) |
Приморский край | 454 (18%) |
Забайкальский край | 431 (17%) |
Другое | 86 (3.4%) |
Отметьте, пожалуйста, Ваш пол | |
Женщина | 1,584 (65%) |
Мужчина | 867 (35%) |
Возраст (по группам) | |
До 29 лет | 447 (19%) |
30-49 лет | 1,194 (50%) |
50 лет и старше | 766 (32%) |
Ваше основное занятие в настоящее время | |
Руководитель организации, отдела, подразделения | 427 (17%) |
Наемный работник, сотрудник организации | 1,162 (48%) |
Государственный и муниципальный служащий | 297 (12%) |
Индивидуальный предприниматель, фермер | 117 (4.8%) |
Неработающий пенсионер | 120 (4.9%) |
Студент, учащийся | 120 (4.9%) |
В данный момент не работаю | 85 (3.5%) |
Другое | 115 (4.7%) |
Если ли у Вас гражданство другой страны (не России) в настоящий момент? | |
Да | 32 (10%) |
Нет | 286 (90%) |
1
n (%)
|
В принципе, очень неплохо. Добавим группировку по региону и поменяем заголовок у переменных с “Characteristic” на “Характеристику”:
table %>%
tbl_summary(by=V004, missing="no") %>%#by=V004 - так мы обозначаем группирующую переменную
modify_header(#функция, позволяющая изменить заголовок
update = list(
label ~ "Характеристика" #
)
)
Характеристика | Алтайский край, N = 4081 | Псковская область, N = 2051 | Саратовская область, N = 4711 | Новосибирская область, N = 4831 | Приморский край, N = 4541 | Забайкальский край, N = 4311 | Другое, N = 861 |
---|---|---|---|---|---|---|---|
Отметьте, пожалуйста, Ваш пол | |||||||
Женщина | 249 (63%) | 136 (69%) | 286 (63%) | 323 (69%) | 264 (60%) | 277 (66%) | 49 (60%) |
Мужчина | 144 (37%) | 62 (31%) | 171 (37%) | 143 (31%) | 175 (40%) | 140 (34%) | 32 (40%) |
Возраст (по группам) | |||||||
До 29 лет | 161 (41%) | 15 (7.8%) | 82 (18%) | 42 (9.2%) | 57 (13%) | 76 (18%) | 14 (18%) |
30-49 лет | 164 (42%) | 92 (48%) | 230 (52%) | 242 (53%) | 202 (47%) | 223 (54%) | 41 (51%) |
50 лет и старше | 67 (17%) | 86 (45%) | 133 (30%) | 174 (38%) | 169 (39%) | 112 (27%) | 25 (31%) |
Ваше основное занятие в настоящее время | |||||||
Руководитель организации, отдела, подразделения | 47 (12%) | 34 (17%) | 73 (16%) | 98 (21%) | 103 (24%) | 54 (13%) | 18 (22%) |
Наемный работник, сотрудник организации | 170 (44%) | 90 (45%) | 255 (56%) | 236 (51%) | 198 (46%) | 185 (45%) | 28 (34%) |
Государственный и муниципальный служащий | 28 (7.2%) | 31 (16%) | 57 (12%) | 61 (13%) | 57 (13%) | 46 (11%) | 17 (21%) |
Индивидуальный предприниматель, фермер | 68 (17%) | 1 (0.5%) | 2 (0.4%) | 9 (1.9%) | 8 (1.8%) | 27 (6.5%) | 2 (2.4%) |
Неработающий пенсионер | 21 (5.4%) | 20 (10%) | 5 (1.1%) | 21 (4.5%) | 10 (2.3%) | 36 (8.7%) | 7 (8.5%) |
Студент, учащийся | 23 (5.9%) | 3 (1.5%) | 37 (8.1%) | 6 (1.3%) | 25 (5.8%) | 23 (5.5%) | 3 (3.7%) |
В данный момент не работаю | 18 (4.6%) | 5 (2.5%) | 8 (1.8%) | 11 (2.4%) | 13 (3.0%) | 26 (6.3%) | 4 (4.9%) |
Другое | 14 (3.6%) | 15 (7.5%) | 20 (4.4%) | 25 (5.4%) | 20 (4.6%) | 18 (4.3%) | 3 (3.7%) |
Если ли у Вас гражданство другой страны (не России) в настоящий момент? | |||||||
Да | 8 (19%) | 6 (12%) | 3 (4.8%) | 5 (8.3%) | 4 (6.8%) | 1 (3.7%) | 5 (28%) |
Нет | 35 (81%) | 43 (88%) | 59 (95%) | 55 (92%) | 55 (93%) | 26 (96%) | 13 (72%) |
1
n (%)
|
Прочитать подробнее о функции tbl_summary, ее атрибутах, с подробным разбором примеров и возможностей изменения таблицы: http://www.danieldsjoberg.com/gtsummary/articles/tbl_summary.html
Можно сделать и простую двумерную таблицу:
table %>%
tbl_cross(row = Q38, col = Q39, percent = "cell", missing="no", ) %>%
add_p(test="chisq.test") %>%
modify_header(#функция, позволяющая изменить заголовок
update = list(
label ~ "**Характеристика**" #
)
) %>%
modify_caption("**Взаимосвязь пола и возраста** (N = {N})")
## FALSE observations with missing data have been removed.
Характеристика | Ваше основное занятие в настоящее время | Total | p-value1 | |||||||
---|---|---|---|---|---|---|---|---|---|---|
Руководитель организации, отдела, подразделения | Наемный работник, сотрудник организации | Государственный и муниципальный служащий | Индивидуальный предприниматель, фермер | Неработающий пенсионер | Студент, учащийся | В данный момент не работаю | Другое | |||
Отметьте, пожалуйста, Ваш пол | <0.001 | |||||||||
Женщина | 247 (10%) | 760 (31%) | 209 (8.6%) | 58 (2.4%) | 84 (3.5%) | 78 (3.2%) | 62 (2.6%) | 72 (3.0%) | 1,570 (65%) | |
Мужчина | 178 (7.3%) | 396 (16%) | 85 (3.5%) | 59 (2.4%) | 34 (1.4%) | 42 (1.7%) | 22 (0.9%) | 43 (1.8%) | 859 (35%) | |
Total | 425 (17%) | 1,156 (48%) | 294 (12%) | 117 (4.8%) | 118 (4.9%) | 120 (4.9%) | 84 (3.5%) | 115 (4.7%) | 2,429 (100%) | |
1
Pearson's Chi-squared test
|
К сожалению, библиотека gtsummary
, также как и библиотека gt
, на основе которой она была создана, не поддерживает формат Word, однако в ней есть функция as_flex_table, позволяющая преобразовать таблицу в класс {flextable} и далее использовать возможности форматирования, заложенные в эту библиотеку.
С помощью flextable можно создавать очень красивые таблицы, на сайте проекта есть впечатляющая галерея:
Подробно изучить возможности библиотеки можно в интерактивном учебнике: https://ardata-fr.github.io/flextable-book/
Логистическая регрессия является одним из часто используемых методов регрессии, достаточно легким для применения, интерпретации результатов и тестирования гипотез. Зависимая переменная которая должна быть представлена в дихотомическом виде (0 – событие не произошло, 1 – событие произошло). Примеров таких зависимых переменных может быть множество: заболел человек или нет, приняли ли его на работу или нет. Задача такого моделирования заключается в предсказании будущего события на основе имеющихся данных об уже произошедших ранее событиях такого же рода. В качестве независимых переменных могут выступать как количественные переменные (возраст, доход, стаж работы), так и категориальные (пол, национальность, место проживания и т.д.).
Предположим, мы хотели бы построить такую предсказательную модель для переменной Q35_SQ005, в которой содержатся данные о планах переехать в другую страну.
Рассмотрим простой случай, когда в качестве зависимых будут выступать всего две переменных – пол и возраст. Создадим модель на основе метода GLM – обобщенных линейных моделей, включающего различные варианты линейной регрессии, в том числе – логистической регрессии (binomial logistic).
# Формула задается с помощью знака тильды и операторов сложения: слева от тильды располагается зависимая переменная, справа - независимые факторы
m1 <- glm(Q35_SQ005 ~ Q38 + age, df, family = binomial)
tbl_regression(m1, exponentiate = TRUE, pvalue_fun = ~style_pvalue(.x, digits = 2)) #tbl_regression - функция, создающая таблицу для представления результатов регрессионного анализа, m1 - наша модель, exponentiate = TRUE --этот аргумент задает перевод коэффициентов регрессии в отношение шансов, pvalue_fun = ~style_pvalue(.x, digits = 2 -- этот аргумент нужен для форматирования уровня значимости - с двумя знаками после запятой
Characteristic | OR1 | 95% CI1 | p-value |
---|---|---|---|
Отметьте, пожалуйста, Ваш пол | |||
Женщина | — | — | |
Мужчина | 1.69 | 1.19, 2.39 | 0.003 |
Возраст | 0.95 | 0.94, 0.96 | <0.001 |
1
OR = Odds Ratio, CI = Confidence Interval
|
В результате такого анализа можно оценить, является ли фактор, который мы выбрали в качестве независимой переменной, значимым, а также проанализировать отношение шансов (OR - odds ratio) - изменение вероятности попадания в группу риска (уволенных, заболевших, решившихся на переезд) в зависимости от значений независимой переменной.
В рассмотренном примере оба фактора имеют высокую статистическую значимость – p < 0,05. При этом у мужчин вероятность решиться на переезд в другую страну почти на 70% выше, чем у женщин, а вот с возрастом шансы на переезд снижаются – в среднем на 5% с каждым годом.
Диаграммы и графики позволяют представить результаты научного исследования наглядно, быстро оценить и сравнить нужные величины. Графический материал должен дополнять текст работы, иметь сквозную нумерацию и письменное пояснение к каждому объекту.
При подготовке научной статьи или диссертации графический материал часто компонуют и оформляют в отдельное приложение. Иллюстративный материал к научной работе часто ложится в основу презентации для ее защиты.
Создание красивых графиков является одной из сильных сторон R, авторы создали целую галерею, не только иллюстрирующую возможности данного языка, но и содержащую примеры кода, используемого для создания разных типов графиков:
Галерея графиков в R: https://www.r-graph-gallery.com/index.html
Выбор графика зависит от нескольких факторов. Прежде всего, большую роль играет природа данных, используемых для визуализации. Для количественных переменных подойдут гистограммы (histograms), ящичные диаграммы (boxplots) и графики плотности (density plots), для категориальных переменных – столбчатые диаграммы (barplots), радарные графики (radar plots), «леденцовые» диаграммы (lollipop plots). Второй значимый фактор – вид анализа. Сравнение выраженности признака по группам требует одних графиков, а многомерные методы, такие как факторный анализ, дискриминантный анализ или анализ соответствий - совсем других. Безусловно, в рамках нескольких занятий научиться всему не получится, но мы рассмотрим несколько интересных графических решений, которые можно взять на вооружение при написании научной статьи.
Пример графика для вопроса с множественным ответом:
# questionr - библиотека, позволяющая анализировать таблицы с множественными ответами
library(questionr)# прежде чем выполнить эту строку, установите пакет questionr на свой комьютер
# Объединим все подвопросы вопроса Q16 в один набор и сохраним его как отдельный объемт
Q16<-df %>%
select(contains("Q16_SQ"))
# создадим таблицу и сохраним ее как датафрейм
Q16tab<-Q16 %>%
multi.table(true.codes=list("Да"), freq=TRUE) %>% #true.codes=list("Да") - обозначаем вариант ответа, используемый для подсчета частот и процентов, freq=TRUE - вывод процентов, а не только частот
as.data.frame()
#создадим переменную с вариантами ответа (сокращенный вариант)
Q16tab$quest<-c("Надо поддерживать всех", "Надо поддерживать въезд в страну русского и русскоязычного населения", "Надо поддерживать въезд молодых и образованных граждан", "Надо поддерживать соотечественников разных национальностей из стран бывшего СССР", "Надо ограничить въезд в страну для всех категорий мигрантов")
# переименуем переменную с процентами
names(Q16tab)[2]<-"Proc"
# создадим график
ggplot(Q16tab, aes(x=quest, y=Proc))+#задаем, какая переменная будет по оси xб а какая по оси y
geom_segment( aes(x=quest, xend=quest, y=0, yend=Proc)) +#эта строка задает длину палочки "леденца"
geom_point( color="blue", size=6, alpha=0.6) +#это сам леденец - кругляшок на палочке, color="blue" - цвет "леденца", size=5 - размер, alpha=0.6 - уровень прозрачности
coord_flip() + #переворачиваем график на 90 градусов, чтобы сделать его горизонтальный вариант
theme_bw() +#устанавливаем тему графика на минимальную - без серого фона и лишних линий
xlab(" ") + #убираем подписи к оси x
ylab(" ")+ #убираем подписи к оси y
geom_label(aes(quest, Proc+1.5, label = Proc), colour = "darkred", nudge_x = 0.35, size = 4)# делаем подписи к каждому "леденцу" в виде значений процентов, которые будут отображаться темно-красным цветом
Создадим график корреляций для вопроса Q2 в котором измеряется выраженность различных идентичностей – государственно-национальной (близость с общностью жителей России), региональной, местной, этнической, конфессиональной, поколенческой, политической:
library(corrplot)# - нам понадобится библиотека corrplot
#мы должны заново загрузить нашу базу, чтобы категориальные переменные отображались цифрами
df<-read_sav("База_НШ_ВМ_2020_от 21.12.2020.sav", user_na = TRUE)
#отбираем переменные в отдельный сет:
Q2<-df %>%
select(contains("Q2_SQ")) %>%
na.omit()
# переименовываем переменные, чтобы вместо кода вопроса были буквы от a до n:
names(Q2)<-letters[1:7]
#считаем корреляции по методу Спирмена
M = cor(Q2, method="spearman")
#делаем график
corrplot.mixed(M, number.cex= 7/ncol(M))
R Markdown позволяет легко интегрировать списки литературы, созданные с помощью Mendeley, Zotero и других библиографических менеджеров, в создаваемый документ.
Для того, чтобы включить готовый список источников, необходимо в блоке метаданных YAML указать файл со списом источников в формате .bib
:
output: officedown::rdocx_document:
reference_docx: template.docx
bibliography: references.bib
где база данных BibTeX это текстовый файд с расширением *.bib
содержащий библиографические данные типа:
@Manual{R-base,
title = {R: A Language and Environment for Statistical
Computing},
author = {{R Core Team}},
organization = {R Foundation for Statistical Computing},
address = {Vienna, Austria},
year = {2019},
url = {https://www.R-project.org},
}
Внутри текста источники могут цитироваться напрямую с помощью синтаксиса @key
, где key – это ключевое слово, находящееся в первой строчке записи, например, R-base
. Чтобы заключить источник в скобках, нужно использовать квадратные скобки – [@key]
. При цитировании нескольких источник, каждый источник разделяется точкой с запятой, например, [@key-1; @key-2; @key-3]
.
По умолчанию в маркдауне используется чикагский формат представления цитат и источников. Чтобы использовать другой стиль, пользователь должен указать имя csl-файла, содержащего настройки стиля цитирования (CSL – Citation Style Language), в блоке метаданных, например:
output: html_document
bibliography: references.bib
csl: biomed-central.csl
Где найти такой файл? Можно воспользоваться репозиторием Zotero Style Repository, содержащим огромное количество библиотек библиографических стилей, доступных для скачивания.
Итак, в рамках данной лекции мы подробно разобрали структуру документа в R Markdown и основные элементы, используемые в каждой части. Задача практического занятия - отработать навыки написания текста и обработки данных с помощью R и R Markdown.
Копилка дополнительных источников для совершенствования навыков кодирования на R, проведения различных видов анализа и визуализации результатов исследования:
Так выглядит затекстовая ссылка.↩︎