1 🤖 Автоматизированный отчет в Rmarkdown

1.1 Rmarkdown

1.1.1 Форматирование текста

# Заголовок первого уровня
## Второго
### Третьего

*Курсив*, или _курсив_

**Жирный**, __Жирный__

~~Зачеркнутый~~

![подпись к изображению](изображение.jpg)

[текст ссылки](http://www.ссылка.com)

 Просто текст[^1]
 [^1]: Текст сноски
 

- ненумерованный список
- ненумерованный список

1. нумерованный список
2. нумерованный список

1.1.2 Вставка и опции выполнения кода

“Чанки” кода можно настраивать, что из кода и выдачи показывать

```{r}
 код R

```

Можно вставлять прямо в текст 'r myvalues'

1.1.3 Вводная часть и настройки

---
title: "Лекция 5 - Визуализация и автоматизированные отчеты"
date: "8 марта 2021 г."
output:                 # опции конвертирования кода
  html_document:        # конвертировать в html
    toc: yes            # table of contents - добавить?
    toc_float: yes      # прокручивать содержание?
    code_folding: hide  # свернуть исходный код в чанках?
---

1.2 👉 Попробовать

  1. Создайте документ Rmd
  2. Посмотрите на его структуру
  3. Скомпилируйте отчет в html и Word.
  4. Посмотрите на параметры компиляции.
  5. Поменяйте тему на одну из https://bootswatch.com, дополнив код в “шапке” Rmd-документа (замените default на название темы)
  html_document:
    theme: 
      version: 4
      bootswatch: default
  1. Добавьте также оглавление к этому документу, дополнив код в разделе html_document:, следующей строкой toc: true, можете также добавить toc_float: true, чтобы оглавление всегда отображалось сбоку.

1.3 Конструирование таблиц в Rmarkdown

Варианты:

  1. Для любых дата-фреймов:
  1. Полагаться на умолчания knitr, который компилирует отчеты.
  2. Использовать пакеты, которые генерируют html сами, но при этом в аргументах чанка нужно указать, results='asis'.

Например, пакет kableExtra помогает настроить стиль таблицы:

library(knitr)
library(kableExtra)

kbl.tbl <- kable(mtcars[1:10,], 
                 format = "html"
                 )

kable_styling(kbl.tbl, 
              bootstrap_options = c("hover", "striped", "condensed")
              ) 
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
  1. Для регрессий:
model1 <- lm(mpg ~ cyl , mtcars)
model2 <- lm(mpg ~ cyl + disp , mtcars)
model3 <- lm(mpg ~ cyl + hp, mtcars)

library("texreg")
htmlreg(list(model1, model2, model3))
Statistical models
  Model 1 Model 2 Model 3
(Intercept) 37.88*** 34.66*** 36.91***
  (2.07) (2.55) (2.19)
cyl -2.88*** -1.59* -2.26***
  (0.32) (0.71) (0.58)
disp   -0.02  
    (0.01)  
hp     -0.02
      (0.02)
R2 0.73 0.76 0.74
Adj. R2 0.72 0.74 0.72
Num. obs. 32 32 32
p < 0.001; p < 0.01; p < 0.05
# альтернатива:
#stargazer::stargazer(model1, model2, model3, type="html", digits=2)
  1. Для структурных моделей semTable():
library(lavaan)

path1 <- sem("cyl ~ disp;
             disp ~ hp",
             data = mtcars)


library(semTable)
semTable(path1, type = "html")
Model
Estimate Std. Err. z p
Regression Slopes
cyl
disp 0.01 0.00 11.82 .000
disp
hp 1.43 0.20 7.31 .000
Residual Variances
cyl 0.58 0.14 4.00 .000
disp 5571.37 1392.84 4.00 .000
hp 4553.96+
Fit Indices
χ2 7.26(1) .007
CFI 0.93
TLI 0.79
RMSEA 0.44
+Fixed parameter


2 Дэшборды в .Rmd

Пример: dashboard_example.html

Руководство https://bookdown.org/yihui/rmarkdown/dashboards.html и галерея с примерами https://rmarkdown.rstudio.com/flexdashboard/index.html

2.1 👉 Познакомиться

  1. Установите пакет flexdashboard
  2. Создайте новый Rmd файл по шаблону flexdashboard
  3. Скомпилируйте дэшборд, нажав кнопку 🧶Knit.
  4. Сравните результат и код, его создавший.

3 👉 Самостоятельно

  1. Соберите все графики об употреблении алкоголя в Европе и отдельно в Австрии в автоматический Rmarkdown.

  2. Дополните отчет двумя частотными таблицами, подсчитав частоты переменных “частота употребления” alcfreq и “частота чрезмерного употребления” alcbnge по странам.

  3. Добавьте одно предложение описания кластеров с цифрами, напрямую запрашиваемыми из R через вставку В среднем в Европе выпивают 'r mean(ess$alcohol)' граммов алкоголя в неделю.

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

  5. Скройте исходный код, прописав в каждом из чанков echo = FALSE и уберите предупреждающие соообщения message=FALSE.

  6. Скомпилируйте отчет в формате html.

  7. Поместите этот отчет в шаблон дэшборда и скомпилируйте.

4 ⭕️ Bonus: Мини-приложения в shiny

4.1 👉 Попробуйте

  1. Создайте новый документ/проект Shiny.
  2. Рассмотрите структуру пробного кода.
  3. Запустите приложение

4.2 Как устроены shiny-приложения

http://shiny.rstudio.com/gallery/kmeans-example.html

4.3 Создание своего приложения

Попробуем сделать визуализацию факторных нагрузок в зависимости от метода вращения.

4.3.1 UI:

  1. Используйте пробный код из документа Shiny и измените его, поменяв название и айди слайдера.
  2. Добавьте новый элемент управления в ui, это выпадающий список с методами вращения:
       selectInput(inputId = "rot.method",
                   label = "Rotation method",
                   choices = c("none", "Varimax", "geominQ", "infomaxT", "oblimin"),
                   selected = "none"
                   )
                   
  1. Поменяйте название (айди) графика на более подходящее.

Все значения элементов пользовательского интерфейса доступны в серверной части в обхъектах типа input$XXX, где ХХХ - это их айди.

4.3.2 Server

  1. Добавьте код, считывающий и подготавливающий данные для факторного анализа.

  2. Внутри функции renderPlot() напишите код, создающий график факторных нагрузок первых двух факторов. Вместо метода вращения и количества факторов укажите соответственно input$rot.metod и input$n.factors (или те айди, которые вы указали в UI).

  3. Пропишите в самом начале файла server все библиотеки, которые потребуются для исполнения кода (это будут точно ggplot2, shiny, GPArotation).

  4. Попробуйте запустить приложение. Посмотрите на ошибки, если они появились и попробуйте исправить.

Должно получиться что-то вроде такого: http://apps.maksimrudnev.com/rotation/

5 О тесте

Три блока вопросов:

  • базовый R

    • найдите ошибку в коде dat$newvar <- recode(dat$oldvar, "1==2, 2==1, else==NA"),
    • создайте новую переменную как разницу eduyrs и age,
    • перекодируйте “город” в 1, “деревня” в 2.
  • структурные уравнения

    • напишите код lavaan для непрямого эффекта age на happy, последовательно опосредованного health и hedonism;
    • напшите код lavaan для изображенной на диаграмме факторной модели;
    • если к этой модели добавить переменную gender так, чтобы она влияла на первый фактор, какими статистиками согласия можно будет сравнить исходную модель с получившейся?
  • графики

    • напишите код, воспроизводящий следующий график,
    • измените следующий код, чтобы форма маркеров отражала тип поселения (domicil) и назовите ось х “Возраст”,
    • каким символом в markdown обозначаются заголовки?



Максим Руднев, 2018-2021 на основе RMarkdown.