library(knitr) library(tikzDevice) activate_tikz <- function() { # tikz plots options options(tikzDefaultEngine = "xetex") # cash font metrics for speed: # options(tikzMetricsDictionary = "./tikz_metrics") add_xelatex <- c("\\defaultfontfeatures{Ligatures=TeX, Scale=MatchLowercase}", "\\setmainfont{Linux Libertine O}", "\\setmonofont{Linux Libertine O}", "\\setsansfont{Linux Libertine O}", "\\newfontfamily{\\cyrillicfonttt}{Linux Libertine O}", "\\newfontfamily{\\cyrillicfont}{Linux Libertine O}", "\\newfontfamily{\\cyrillicfontsf}{Linux Libertine O}") options(tikzXelatexPackages = c(getOption("tikzXelatexPackages"), add_xelatex)) # does remove warnings: # it is important to remove fontenc package wich is loaded by default options(tikzUnicodeMetricPackages = c("\\usetikzlibrary{calc}", "\\usepackage{fontspec, xunicode}", add_xelatex)) opts_chunk$set(dev = "tikz", dev.args = list(pointsize = 11)) } activate_png <- function() { opts_chunk$set(dev = "png", dpi = 300) } colFmt <- function(x, color) { outputFormat <- opts_knit$get("rmarkdown.pandoc.to") if (outputFormat == "latex") { result <- paste0("\\textcolor{", color, "}{", x, "}") } else if (outputFormat %in% c("html", "epub")) { result <- paste0("<font color='", color, "'>", x, "</font>") } else { result <- x } return(result) } outputFormat <- opts_knit$get("rmarkdown.pandoc.to") if (outputFormat == "latex") { # activateTikz() activate_png() # другую тему для ggplot2 выставить? } library(broom)
library(tidyverse) # рабочие кони library(sandwich) # оценка Var для гетероскедастичности library(lmtest) # тест Бройша-Пагана library(data.table) # манипуляции с данными library(reshape2) # преобразование длинных таблиц в широкие
Поехали!
Алексей Гагарин
Казалось бы, чего проще — поставить программу?! Однако не всегда всё идёт гладко, поэтому подробности в студию:
В России проблем не две, как думают многие, а три: дураки, дороги и русские буквы в именах файлов. Самая распространённая проблема, с которой мне доводилось бороться не один раз, — это русские буквы и пробелы в названиях файлов и папок под Windows.
```{block, type="warning"} Если ты используешь Windows, то никогда при серьёзной работе не используй русские буквы и пробелы в названиях файлов и папок.
Папку с котиками можно оставить под названием `мои котики` :) Заповедь о русских буквах легко нарушить даже не осознавая этого. Если имя пользователя Windows написано русскими буквами, например, `Машенька`, то по умолчанию все документы этого пользователя будут находиться в папке `C:/Users/Машенька/Documents/`. ```{block, type="warning"} Для серьёзной работы под Windows нужно создать нового пользователя с английским именем, например, `Mashenka`.
Переименование старого пользователя не помогает, проверено. После создания нового пользователя можно перенести документы из старой папке C:/Users/Машенька/Documents/
в новую C:/Users/Mashenka/Documents/
.
Правильное имя пользователя без пробелов и русских букв значительно снижает риск дальнейших проблем.
Набор легковооружённого кавалериста включает в себя всего две программы, R и Rstudio. Лишь в небольшой части разделов этого учебника тебе потребуется установка дополнительного софта.
R — это язык программирования ориентированный на статистический анализ данных, а Rstudio — гламурная графическая оболочка к R. Rstudio не может работать без R. Никаких принципиально новых возможностей Rstudio к R не добавляет, но здорово упрощает жизнь!
Устанавливаем R.
Заходим на официальный сайт
Кликаем Download R for Windows
Выбираем base
. Это не какая-то ограниченная, базовая версия, а самая настощая полная версия R.
Кликаем Download R 3.3.x for Windows
Запускаем установщик.
На вопрос установщика, куда устанавливать R, указываем папку C:\R
.
Проблема в том, что по умолчанию R ставится в папку C:\Program files\...
. В имени папки есть пробел, который иногда приводит к проблемам. Чтобы не играть в лотерею с проблемами, лучше выбрать папку C:\R
или любую другую без русских букв и пробелов.
Заходим на официальный сайт
Кликаем R-3.3.x.pkg
Запускаем установщик.
Раньше при установке R пользователь должен был выбрать зеркало, с которого скачивать R. Это пугало новичков! Разработчики не сразу поставили автоматический выбор зеркала. Выбор ещё остался при установке пакетов. Можно смело брать любое, например, самое первое, 0-cloud
.
Linux на примере Ubuntu 16.04 Xenial: ```{bash, "install_R_linux", eval=FALSE} sudo echo "deb http://cran.rstudio.com/bin/linux/ubuntu xenial/" | sudo tee -a /etc/apt/sources.list gpg --keyserver keyserver.ubuntu.com --recv-key E084DAB9 gpg -a --export E084DAB9 | sudo apt-key add - sudo apt-get update sudo apt-get install r-base r-base-dev
### Установка R для суровых челябинцев {#r_chelyabinsk} Вместо классического R можно поставить конкурирующий [дистрибутив R от Microsoft](https://mran.microsoft.com/download/), MRO. Отличия MRO от классического R: 1. Работает только с 64-битным процессором 1. Использует быструю библиотеку MKL для операций с матрицами 1. По умолчанию ставит не самые свежие пакеты, а версии пакетов, выпущенные на заданную дату. Это удобная особенность позволяет легко воспроизвести результаты работы, даже если какой-нибудь пакет кардинально изменился. Суровые челябинские мужики могут самостоятельно настроить R на использование быстрых библиотек для матричных операций: Macos: настраиваем оптимизированную под мак библиотеку: ```{bash, "macos_blas", eval=FALSE} cd /Library/Frameworks/R.framework/Resources/lib ln -sf /System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Versions/Current/libBLAS.dylib libRblas.dylib
Macos: восстанавливаем дефолтную библиотеку R: ```{bash, "macos_default_blas", eval=FALSE} cd /Library/Frameworks/R.framework/Resources/lib ln -sf libRblas.0.dylib libRblas.dylib
На линуксе можно поэкспериментировать с [выбором разных BLAS](http://edustatistics.org/nathanvan/2013/07/09/for-faster-r-use-openblas-instead-better-than-atlas-trivial-to-switch-to-on-ubuntu/) ### Rstudio {#install_Rstudio} Оболочка Rstudio открытая и бесплатная. Есть платная версия Rstudio, платной в ней является круглосуточная поддержка пользователей. И иногда оболочку Rstudio путают с программой для восстановления данных R-studio, которая полностью платная. 1. Скачиваем [текущую версию Rstudio Desktop](https://www.rstudio.com/products/rstudio/download/). 2. Запускаем установщик. 3. Под Windows на вопрос установщика, куда устанавливать Rstudio, указываем папку `C:\Rstudio`. Проблема с Rstudio потенциально та же, что и с R: могут возникнуть трудности при использовании папки с русскими буквами и пробелами, а по умолчанию Rstudio ставится в `C:\Program Files\...`. Любители заглянуть вперёд и опробовать новые фишки могут [поставить preview-версию Rstudio](https://www.rstudio.com/products/rstudio/download/preview/). Теоретически подобная бета-версия может быть менее устойчивой, чем обычная. По моему опыту никаких проблем со стабильностью в preview-версии не было, а приятные плюшки, ещё не вошедшие в текущую версию, есть :) #### Настройка Rstudio: 1. Заходим в Tools - Global options - General: - Убираем галочку `Restore .Rdata into workspace at startup`. - В разделе `Save workspace to .Rdata on exit` выбираем `Never` Rstudio по умолчанию при выходе сохраняет все объекты в памяти в файл, который затем подгружается при старте. Это плохая привычка. Постепенно в этом `.Rdata` файле будет накапливаться мусор. Рано или поздно мусора станет так много, что либо загрузка Rstudio будет занимать немерено времени, либо при загрузке будет происходить ошибка. 2. Заходим в `Tools` - `Global options` - `Sweawe`: - В разделе `Weave .Rnw files using` выбираем `knitr`. Для связи R с \LaTeX мы будем использовать более передовой `knitr`. Первопроходец Sweave сделал прекрасную работу, и его подвиги мы будем помнить и чтить :) 3. Заходим в `Tools` - `Global options` - `Code` - `Diagnostics`: - Выставляем все галки! Настоящие леди и джентельмены, а также синьоры и синьориты, пишут стильный код! ## Тяжёловооружённая кавалерия {#other_programs} Помимо минимального набора из R и Rstudio любопытный читатель может ознакомиться с другими полезными программами. Для этих программ я привожу скорее ссылки, а не пошаговые инструкции по установке. ### LaTeX {#install_Latex} \LaTeX — это система для создания красивых структурированных текстов. Читается «Латех». Пользоваться Вордом для написания курсовых или научных статей — это дурной вкус. \LaTeX дарит возможность писать красивые математические формулы. В силу простоты текстового формата для хранения документов \LaTeX идеально подходит для взаимодействия с другими программами. Связав R и \LaTeX с помощью грамотного программирования, можно в один клик обновлять сложные отчёты при получении новых данных или избегать ошибок, связанных с копированием результатов вычислений в презентацию. Под Linux основной дистрибутив \LaTeX — это TeXLive. Лучше всего поставить [свежую версию TeXLive руками](https://www.tug.org/texlive/acquire-netinstall.html). После ручной инсталляции нам надо убедить Ubuntu, что ей не надо ставить \LaTeX из своего репозитория: ```{bash, "post_latex", eval=FALSE} sudo apt-get install equivs freeglut3 mkdir -p /tmp/tl-equivs && cd /tmp/tl-equivs wget http://www.tug.org/texlive/files/debian-equivs-2016-ex.txt cp -f debian-equivs-2016-ex.txt texlive-local equivs-build texlive-local sudo dpkg -i texlive-local_2016-2_all.deb
Под Macos основной дистрибутив \LaTeX — это Mactex.
Под Windows существует два конкурирующих дистрибутива — TexLive и Miktex. Я лично рекомендую TexLive. Если выбирать Miktex, то для установки полноценного теха надо скачать не Basic Miktex, а Net Installer!
```{block, type="warning"} Важно ставить полную версию \LaTeX со всеми пакетами!
Полная установка может занять больше часа, и занять несколько гигабайт жёсткого диска, но красивые документы того стоят. Если нет необходимости делать красивые структурированные документы в `pdf` формате, то без \LaTeX можно обойтись. В данном учебнике не будет серьёзного введения в \LaTeX, мы только затронем вопрос взаимодействия R-\LaTeX. Хорошим введением в \LaTeX будет: Воронцов, [LaTeX в примерах](http://www.ccas.ru/voron/download/voron05latex.pdf)^[Единственным неудачным советом в книжке Воронцова, пожалуй, является выбор кодировки СP1251, правильнее выбирать UTF-8.] ### git-клиент {#install_git} Git — это система контроля версий. Она позволяет разным авторам работать над одним проектом. Если что-то пошло не так, то можно вернуться на любой момент времени в прошлом — это бывает очень полезно :) Тру-программеры работают с git из командной строки, а новичкам здорово облегчит жизнь git с графической оболочкой. Для windows и macos есть оболочка Github Desktop, доступная на [desktop.github.com](https://desktop.github.com/). В качестве альтернативы Github Desktop есть кросс-платформенный и бесплатный для некоммерческих проектов [Smartgit](http://www.syntevo.com/smartgit/). Будь осторожен при установке: надо вовремя поставить галочку на бесплатной версии. Иначе установится демка на 15 дней. Если ты хочешь освоить git как тру-программер, то можешь начать с бесплатного курса try-git на [codeschool.com](https://www.codeschool.com/courses/try-git). Немного стартовых настроек в командной строке macos/linux: ```{bash, "git_setup", eval=FALSE} git config --global user.name "Ivan Ivanov" git config --global user.email Ivan_Ivanov@ivanov_mail.com
Самое важное: Word — это не текстовый редактор! Текстовый редактор — это
программа с помощью которой редактируют файлы с простым текстовым содержимым, а
Word сохраняет файлы в специальном формате, где кроме текста сохраняется ещё
куча дополнительной информации. Расширение у текстового файла может быть
довольно произвольным, .txt
, .md
, .R
, .tex
и так далее.
Текстовых редакторов много. Я советую кросс-платформенный открытый и бесплатный Atom. Скачать его можно на atom.io. Изнутри самого редактора Atom можно установить кучу плагинов. С помощью плагинов можно подсвечивать синтаксис различных языков или превратить Atom в приличную среду разработки :)
Дополнительные плагины для Atom ставятся через меню Atom - Preferences - Install. Для работы с R и \LaTeX советую поставить плагины language-markdown
, language-knitr
, atom-beautify
.
jupyter — это браузерная оболочка для кучи языков программирования. Сокращение jupyter намекает на три языка наиболее пригодных для научных вычислений: julia, python и R. Проще всего установить дистрибутив Anaconda, в него входит и python, и jupyter.
Есть две версии python: вторая и третья. Третья — более новая, но под вторую написано много того, что под третьей ещё не рабоет. Если не знаешь, какой python тебе нужен, значит, тебе нужен третий.
Далее нужно зарегистрировать R в jupyter'е:
Запускаем R. Под Linux и Macos важно запустить R из командной строки. Именно из командной строки, а не из под Rstudio, иначе чуда не произойдёт.
Далее инструкция с github.com/IRkernel/IRkernel:
install.packages(c('repr', 'IRdisplay', 'crayon', 'pbdZMQ', 'devtools')) devtools::install_github('IRkernel/IRkernel') IRkernel::installspec() # to register the kernel in the current R installation
Запуск jupyter из командной строке на Linux/Macos: ```{bash, "run_jupyter", eval=FALSE} jupyter notebook
Чтобы работало сохранение pdf
с русскими буквами нужно руками подменить дефолтный шаблон.
Многие пользователи, привыкшие к Ворду, тяжело переходят на \LaTeX. Ведь в текстовом редакторе не видно формулу в привычном виде, а виден только её код. Редактор LyX заполняет эту нишу: используя за кадром тех, он показывает пользователю формулы, таблицы и рисунке в естественном виде. При этом LyX отлично взаимодействует с R.
Недостатком LyX, пожалуй, является его невысокая популярность. Пользователи, боящиеся \LaTeXа, сидят в Ворде, а те, кто понял прелести \LaTeXа, уже не хотят ничего вспомогательного :)
Windows и Macos: скачиваем с lyx.org.
Linux (Ubuntu 16.04): ```{bash, "linux_lyx", eval=FALSE} sudo add-apt-repository ppa:lyx-devel/release sudo apt-get update sudo apt-get install lyx
### Шрифты {#install_font} При создании готовых документов автору нужно подумать о шрифте! У windows и macos есть встроенные программы управления шрифтами. Для linux (Ubuntu 16.04) просмотрщик шрифтов легко поставить: ```{bash, "install_font", eval=FALSE} sudo add-apt-repository ppa:font-manager/staging sudo apt-get update sudo apt-get install font-manager
Шрифты могут быть записаны в разных форматах. Основные — это TTF, OTF и Post-script. Рядовой пользователь может смело выбирать TTF или OTF, а Post-script нужен скорее дизайнерам и типографам.
В pdf-версии данного учебника используется шрифт Linux Libertine OTF. Он открытый, бесплатный и содержит буквы как русского, так и многих других алфавитов. Скачать можно на linuxlibertine.org.
Pandoc — это конвертер текстовых форматов. Он умеет превращать файлы в формате маркдаун, md
, во всё, что движется: tex
, pdf
, docx
, epub
, html
, ...
Pandoc входит комплект Rstudio, поэтому отдельно его ставить не нужно.
Впрочем, можно поставить Pandoc и отдельно, без Rstudio. Под windows и macos можно скачать установщик с официального сайта pandoc.org.
А под linux (Ubuntu 16.04) можно поставить pandoc из командной строки: ```{bash, "install_pandoc", eval=FALSE} sudo apt-get install pandoc pandoc-citeproc
### gretl {#install_gretl} Тебе страшно? Ты боишься R, а регрессию надо построить через 5 минут? Тогда разумное спасение — это эконометрический пакет gretl. Для gretl не обязательно учиться программировать: статистические тесты, графики и эконометрические модели доступны через меню. Кроме того, gretl даёт возможность пользователю взаимодействовать с R, что спасает в тех случаях, когда возможностей gretl не хватает. Естественно, gretl кросс-платформенный открытый и бесплатный, скачать можно с официального сайта [gretl.sourceforge.net](http://gretl.sourceforge.net/). ## Весёлый калькулятор {#funny_calc} R можно использовать как весёлый калькулятор: ```r 5 + 9
Что-нибудь более интересное, например, $4! + 2^3 + C_4^2$:
a <- factorial(4) b <- 2^3 a + b + choose(n = 4, k = 2)
Признайся, ты всегда мечтал пошалить? Давай, пока никто не видит, поделим на ноль?
a <- 1 / 0 a
Что можно делать с бесконечностью, Inf
?
1 / (Inf - 9)
Возьмём арктангенс!
atan(Inf)
Ба! Да это же $\pi/2$:
pi / 2
Но с неопределенностью ничего не поделаешь:
0 / 0
Сокращение NaN означает «Not a Number», такой объект возникает в результате запрещённых арифметических операций.
Также в дебрях R живёт другой интересный зверь — NA, «Not Available», пропущенное наблюдение. Наблюдение может быть пропущенным по разным причинам: может быть его не было изначально, а может оно родилось в результате запрещённых арифметических операций. Поэтому всякое NaN является NA, но не всякое NA является NaN. Проверять, является ли что-либо NA или NaN, можно так:
is.na(0 / 0) is.nan(0 / 0) a <- NA is.na(a) is.nan(a)
Вектор из чисел по порядку:
a <- 3:10 a
Вектор из одинаковых чисел:
b <- rep(777, times = 5) b
Вектор из конкретных чисел:
vect <- c(5, -4, 1) vect
Что можно делать с вектором?
sum(vect)
Хотите среднее арифметическое?
mean(vect)
Если в векторе есть пропущенные значение, NA
, то есть два варианта подсчёта среднего:
v_na <- c(1, 2, 3, NA) mean(v_na) mean(v_na, na.rm = TRUE)
Команда mean(v_na)
выдаст NA
, а команда mean(v_na, na.rm = TRUE)
удалит из вектора все NA
и потом посчитает среднее.
Ещё одна полезная штучка — количество элементов в векторе:
length(b)
Выберем из вектора $s$ значения больше $0$:
# случайная выборка из 40 равномерно распределённых на [-3;1] чисел: s <- runif(40, min = -3, max = 1) b <- s[s > 0] # отбираем те s, что больше нуля b
С точки зрения R, s > 0
— это вектор из TRUE/FALSE:
s > 0
В отличие от python и C++ элементы вектора в R нумеруются начиная с первого.
Можно выбрать конкретные $s$, например с 6-го по 20-ое:
s[6:20]
Хочу 5-ый, 7-ой и 13-ый элементы вектора!
s[c(5, 7, 13)]
Можно узнать, сколько значений s
больше нуля:
sum(s > 0)
Правда ли, что 0.4 + 0.1 равно 0.5?
0.4 + 0.1 == 0.5
А правда ли, что 0.4 - 0.1 равно 0.3?
0.4 - 0.1 == 0.3
Хм, что-то Марь Иванна в школе другое говорила...
Почему так случилось? Компьютер хранит числа в памяти в двоичной системе счисления. В двоичной системе обычное число 0.1 будет записываться в виде бесконечной периодической дроби. Следовательно, без дополнительных ухищрений храниться в памяти абсолютно точно оно не может. Поэтому де-факто компьютер хранит в памяти округленную версию от 0.4, 0.1 и 0.3. В данном случае при вычитании ошибки округления не компенсируют друг друга.
Мораль из этого примера проста: ```{block, type="warning"} При операциях с дробными числами помни: компьютер считает примерно!
Скорее всего, проверка точного равенства потенциально дробных чисел не нужна. Вместо неё бывает осмысленна проверка примерного равенства: ```r all.equal(0.4 - 0.1, 0.3)
Единственный нюанс. Оператор ==
выдаёт результат типа TRUE
/FALSE
, а функция all.equal
может выдать развёрнутый ответ текстом. Поэтому, если нужно использовать функцию all.equal
после проверки условия if
, то её нужно обрамить в isTRUE
:
if (isTRUE(all.equal(a, b))) { ... }
....
Если текст программы содержит русские или другие неанглийские буквы, например, в комментариях, то при сохранении файла Rstudio предложит выбрать кодировку.
картинка
Кодировка определяет какой конкретно числовой код будет сопоставлен в записанном
файле каждой букве. Например, букве ё
в кодировке UTF-8 сопоставлен
десятичный^[Если шестнадцатиричный, то 0451. Ради интереса можно посмотреть
сопоставление букв и их кодов в UTF-8, например, на
unicode-table.com] код 1105.
Для русского языка есть несколько распространённых кодировок: UTF-8 и CP1251. Linux и Macos используют по умолчанию кодировку UTF-8, а вот Windows^[На самом деле всё немного хитрее и сама Windows технически использует UTF-16, а вот многие приложения под ней — CP1251.] сохраняет простые текстовые файлы в кодировке CP1251.
Если русскоязычный файл записать в одной кодировке, а пытаться открыть с помощью другой, то мы увидим на экране "кракозябры". Поэтому хорошо, когда все используют одну кодировку. Кодировка UTF-8 более универсальна, чем CP1251. Например, с помощью кодировки UTF-8 в одном тексте можно использовать и русские буквы и французские акценты и китайские иероглифы.
```{block, type="warning"} Мы всегда будем использовать кодировку UTF-8.
## Установка и подключение пакетов {#packages} Одна из сильных сторон R — это открытость: каждая домохозяйка может написать свой пакет для R и выложить его в публичное пользование. Основные операции, например, сложение и умножение чисел или построение множественной регрессии, реализованы в базовом R и не требуют подключения пакетов. Более сложные операции, например, работа с панельными данными или построение сложных графиков, требуют подключения дополнительных пакетов. Каждый пакет содержив в себе набор функций, расширяющих возможности R. Для R написано более 10 тысяч пакетов. Среди них есть и откровенный мусор, и бриллианты, например, `ggplot2`, настолько ценные, что их копируют в другие языки программирования. Скорее всего нужный тебе пакет можно найти: 1. В официальном хранилище пакетов R, CRAN. Здесь пакеты прошли минимальное тестирование. Это отнюдь не гарантия качества пакета, но всё же серьёзный, давно функционирующий пакет, наверняка, будет выложен на CRAN. 2. В системе репозиториев [github.com](https://github.com/). Здесь, как правило, разработчики публикуют более свежие версии пакетов, ещё не выложенные на CRAN, или молодые пакеты в процессе разработки. 3. В хранилище пакетов для биологов `bioconductor`. Это своя отдельная экосистема пакетов R со специальным инсталлятором, блэкджеком и поэтэссами. Есть и другие хранилища пакетов, например, R-forge, [r-forge.r-project.org](http://r-forge.r-project.org/) и Rforge, [rforge.net](https://rforge.net/), но они гораздо менее популярны. Чтобы начать использовать какой-нибудь пакет R нужно сделать две вещи: 1. Установить пакет Установка означает, что пакет будет скачан из Интернета и сохранён в специальной папке на жёстком диске. Установка пакета выполняется **один раз**. Каждый раз при использовании пакета устанавливать его **не нужно**. Переустанавливать пакет имеет смысл, только если вышла новая его версия. 2. Подключить пакет (attach package) Подключение пакета выполняется **каждый раз** перед его использованием. Пакеты подключаются командой `library("имя пакета")`. Очень часто **пакеты** R ошибочно называют библиотеками. **Библиотека** — это папка на жёстком диске компьютера, где хранятся пакеты. Для установки различных пакетов, работающих с Интернетом под Linux может потребоваться установка дополнительных библиотек: ```{bash, "linux_web", eval=FALSE} sudo apt-get install libssl-dev libcurl4-openssl-dev libxml2-dev
С репозитория CRAN пакет ставится командой R:
install.packages("имя пакета")
В Rstudio установить пакет с репозитория CRAN можно через меню: Tools
- Install
packages. Далее нужно набрать название пакета, можно указать сразу несколько
названий через пробел, и нажать Install
.
```{block, type="warning"} Главное при установке пакета — не бояться сообщений красным цветом!
Любые **сообщения** (messages) R выводит красным цветом и по неопытности их можно принять за ошибку, что скорее всего не так. Ошибка всегда сопровождается словом `r colFmt("Error", "red")`. Если слова `r colFmt("Error", "red")` нет, то всё идёт по плану! Почему R использует красный цвет? Потому, что установка пакета — это потенциально опасное действие, как и установка любой программы. Пакеты на официальном репозитории CRAN проходят определённую проверку, но если ты используешь R для многомиллионных сделок каждый день, то неплохо бы точно знать, что ты ставишь :) Для примера установим с репозитория CRAN пакет для построения графиков `ggplot2`: ```r install.packages("ggplot2")
Напомним, что установка пакетов выполняется один раз.
bioconductor
{#bioconductor}О пакетах для биологов подробно написано на официальном сайте bioconductor.org. Поставить основную часть подборки можно парой команд:
source("https://bioconductor.org/biocLite.R") biocLite()
Также можно поставить и любой конкретный пакет из биологической подборки. Например, поставим пакет mygene
для перевода наименований генов из одной системы в другую:
biocLite("mygene")
После того, как пакет ggplot2
установлен можно его подключить
library("ggplot2")
И начать использовать :) Здесь мы лишь быстренько построим гистограмму для случайной выборки из нормального распределения, а с красотами ggplot2
ознакомимся позже:
x <- rnorm(100) qplot(x)
Функция qplot
содержится в пакете ggplot2
. Если пакет не установлен, или установлен, но не подключен, то R выдаст ошибку Error: could not find function "qplot"
.
Иногда разумно использовать команды из какого-нибудь пакета не подключая его командой library
. Тогда надо явно указать имя пакета перед функцией, как в C++:
x <- rnorm(100) ggplot2::qplot(x)
При подключении пакета, как и при его установке, не стоит пугаться сообщений
красным шрифтом. Только явное слово Error
говорит об ошибке. Кроме того, часто
можно столкнуться с предупреждением (warning) о том, что пакет был создан
для более новой версии R.
r colFmt("Warning message: package 'xxx' was built under R version 3.3.1",
"red")
Это нестрашно. Это означает лишь, что у разработчика пакета xxx
установлена
более свежая версия R, чем у тебя. Обновлять R на своём компьютере при каждом
его мелком обновлении, пожалуй, неразумно, но раз в полгода стоит.
```{block, type="warning"} Правила хорошего тона советуют подключать все нужные пакеты в начале скрипта.
Часть пакетов, например, пакет `stats`, входит в ядро R. Пакеты из ядра R не требуется подключать явно, поэтому функции из пакета `stats` доступны и без выполнения `library("stats")`. ### Установка пакетов с репозитория на github Установить пакет с github.com немногим сложнее. Здесь надо знать не только название пакета, но и название репозитория, где пакет хранится. Часто название репозитория — это фамилия автора пакета. Официальной классификации всех пакетов R на github нет. Можно воспользоваться поисковиком github-пакетов на [r-how.com/packages/github_repo](https://r-how.com/packages/github_repo) или погуглить. Кроме того, для установки пакетов с github.com потребуется установить вспомогательный пакет для разработчиков, `devtools`: ```r install.packages("devtools")
После того, как devtools
установлен, мы можем устанавливать любой пакет с репозиториев на github. Например, установим самую свежую версию графического пакета ggplot2
с репозитория tidyverse
:
devtools::install_github("tidyverse/ggplot2")
Джентельменский набор пакетов R зависит от сферы деятельности, но практически
всем, сталкивающимся с анализом данных, пригодится пакет-коллекция tidyverse
. Ставится коллекция tidyverse
стандартно:
install.packages("tidyverse")
Например, в коллекцию tidyverse
входят:
ggplot2
для построения шикарных двумерных графиковtidyr
для причёсывания наборов данныхreadr
для чтения данныхdplyr
для манипуляций с даннымиforcats
для работы с качественными даннымиПодключить пакет-коллекцию можно одной командой:
library("tidyverse")
В официальном классификаторе пакетов R cran.r-project.org/web/views можно найти тематические подборки по эконометрике, временным рядам и другим сюжетам. В R для всего есть пакет :) Для того, чтобы установить тематическую подборку пакетов тоже есть пакет, называется ctv
. Поставим пакет ctv
и с помощью него установим эконометрическую подборку пакетов:
install.package("ctv") ctv::install.views("Econometrics")
Каждый пакет из подборки подключается своей отдельной командой. Например, после установки подборки Econometrics
можно подключить пакет quantreg
для квантильной регрессии:
library("quantreg")
И, конечно, чтобы найти нужный пакет можно погуглить или поискать похожий вопрос на stats.stackexchange.com.
Прежде всего неплохо бы знать, где лежит на жёстком диске файл с нужными данными. Напомню, что названия файлов и папок не должны содержать русских букв и пробелов!
У R есть понятие рабочей папки (working folder). В рабочей папке R ищет все требуемые файлы. Одно из простых решений — указать в качестве рабочей папки ту, где лежит нужный файл и далее прочитать его.
Допустим, нужный нам файл лежит в папке C:/project_A/data/
. Тогда для
установки рабочей папки достаточно выполнить команду:
setwd("C:/project_A/data/")
Вместо этой команды можно воспользоваться меню Rstudio: Session
- Set working directory
- Choose directory
. Далее выбрать нужную папку и нажать Open
.
После этого можно прочитать нужный нам файл. Начнём с пакета rio
позволяющего импортировать данные практически любого типа. На самом деле авторы пакета rio
просто объединили усилия многих разработчиков в единую команду. И получилось хорошо :)
Хочешь загрузить данные в формате .csv
? Пожалуйста!
data <- rio::import("имя_файла.csv")
Хочешь загрузить данные в формате .xlsx
? Пожалуйста!
data <- rio::import("имя_файла.xlsx")
Однако не всегда всё идёт гладко, поэтому остановимся подробнее на распространённых форматах хранения данных.
— Иван, ты знаешь, у нас в Чили есть нестандартные обозначения. Мы используем десятичную запятую вместо точки, умножение пишем точкой, а не крестиком, деление — двумя точками, а при измерении температуры пользуемся градусами Цельсия. Я уверен, что ты сможешь поправить все по-своему, как привыкли дети в России.
— Разумеется, Раймундо, сделаем. Это не составит труда.
Со стены Ивана Высоцкого вконтакте
Формат .csv
, comma separated values, «значения разделённые запятыми», является самым простым и, пожалуй, самым распространённым. Практически любой статистический софт умеет читать и сохранять данные в формате .csv
. Поэтому часто .csv
файлы используют, чтобы перебросить данные из одной программы в другую.
Классический .csv
файл выглядит примерно так:
id, height, weight, sex 1, 180, 80.5, Male 2, 160, 62.5, Female 3, 150, 51.0, Female 4, 170, 83.5, Male ...
В первой строке .csv
файла, как правило, через запятую перечислены названия переменных. В последующих строках идут сами данные. Название формата, comma separated values
означает, что по стандарту различные переменные должны быть разделены запятыми. Целая часть числа должна отделяться от дробной точкой.
Классический, соответствующий стандарту, .csv
файл прекрасно импортируется командой import
из пакета rio
:
data <- rio::import("имя_файла.csv")
Также для классического .csv
подойдёт функция read_csv
из пакета readr
:
data <- readr::read_csv("имя_файла.csv")
Однако на практике можно столкнуться и с «чилийским» .csv
. В «чилийском» .csv
файле дробная часть числа будет отделяться от целой с помощью запятой. Поэтому различные переменные будут отделяться точкой с запятой. Например, англоязычная версия MS Excel сохраняет классический .csv
, а русскоязычная — чилийский.
Чилийский .csv
выглядит примерно так:
id; height; weight; sex 1; 180; 80,5; Male 2; 160; 62,5; Female 3; 150; 51,0; Female 4; 170; 83,5; Male ...
Чилийский .csv
можно прочитать функцией read_csv2
из пакета readr
:
data <- readr::read_csv2("имя_файла.csv")
Чилийским данный формат называется потому, что является национальным стандартом в Чили. Дробную часть числа от целой отделяют запятой также в Бразилии, Росии, Франции и некоторых других странах.
Возможны и другие вариации .csv
файла. Все отличия между разными вариантами .csv
файла описываются тремя пунктами:
Данные из .csv
файла можно загрузить в память компьютера также через меню Rstudio
: File
- Import Dataset
- From CSV
. Можно выставить требуемые опции, а Rstudio
подскажет необходимый код R.
Самое главное: если есть возможность экспортировать данные из Excel в формат .csv
, то лучше воспользоваться ей. Формат .csv
проще и надёжнее.
Excel сохраняет файлы в двух форматах: старом .xls
и новом .xlsx
. Если выбор стоит между этими форматами, то лучше сохранять в новом .xlsx
. Чтобы быстро и удачно импортировать данные из Excel в R нужно максимально стандартно оформить их на листе. А именно:
На листе должны быть только данные. Никаких графиков и фильтров.
В первой строке листа должны идти названия столбцов. Названия столбцов должны быть короткие, без пробелов, на английском языке. Хорошо: rabbit_weight
, плохо: Вес кролика
.
Не должно быть объединённых ячеек, шрифтов разного размера и выделения цветом.
Пропущенные значения лучше кодировать с помощью записи NA
.
Файлы форматов .xlsx
или .xls
можно прочитать с помощью команды read_excel
из пакета readxl
:
data <- readxl::read_excel("имя_файла.xlsx")
Также эти форматы можно загрузить в память компьютера через меню Rstudio
: File
- Import Dataset
- From Excel
. Можно выставить требуемые опции, а Rstudio
подскажет необходимый код R.
Как и в случае с Excel, если есть возможность сохранить данные в формате .csv
, то лучше воспользоваться ею. Если такой возможности нет, то поможет пакет haven
и функция read_spss
:
data <- haven::read_spss("имя файла.sav")
Также можно воспользоваться меню Rstudio
: File
- Import Dataset
- From spss
.
И снова не побоюсь сказать: если есть возможность, воспользуйся экспортом данных в формат .csv
. Если такой возможности нет, то поможет пакет hexView
и функция readEviews
:
data <- hexView::readEViews("имя файла.wf1")
Дорогой друг, ты ещё помнишь, что лучше прочитать данные через экспорт в формат .csv
? Если не судьба, то импортировать данные с помощью команд R:
data <- haven::read_dta("имя файла.dta")
И снова можно воспользоваться меню Rstudio: File
- Import Dataset
- From stata
.
Зачастую данные не обязательно даже сохранять. В R есть пакеты, дающие доступ к некоторым источникам данных в Интернете:
quandl
quantmod
WDI
СССР — родина слонов!
Пакеты, дающие доступ к данным по России:
sophisthse
sophist.hse.ru
cbr
Центральный Банк России
datamos
datamos.ru
finam.ru.
А эти источники ещё ждут желающих написать пакет для R:
gks.ru
open data gov ???
R одинаково выполнит и команды
x<-6-7 y<--6+9 x - y
и команды
x <- 6 - 7 y <- -6 + 9 x - y
Однако второй вариант гораздо приятнее для чтения. С тем, кто пишет код как в первом примере, Английская королева рядом не сядет! Чтобы иметь возможность войти в палату Лордов и Общин, тебе следует писать стильный код!
Если ты работаешь в команде, то руководствуйся тем стилем кода, который в ней
принят. А для новичков я советую использовать стиль кода, которого
придерживается Hadley Wickham, автор очень популярных пакетов R ggplot2
и
dplyr
:
paste0("Hi ", "guys!")
<-
, знаки арифметических действий (+
, -
, *
),
логические проверки (>
, <
, ==
и прочие) с двух сторон окружай одинарными
пробелами.x <- (3.5 + 7) * (2.8 - 9)
if (x == y) { message("Variables x and y are equal.") }
В Rstudio можно включить автоматическую проверку стиля кода в Tools - Global options - Code - Diagnostics. Настоящие сэры и истинные леди в разделе Diagnostics могут проставить все галочки.
Мы все привыкли к тому, что домохозяйки пишут рецепт в естественном порядке, а математики функции — в обратном. Сравни:
Возьмите пепел перьев чёрного петуха
Добавьте печень дракона
Варите на медленном огне 2 дня
и
[ \cos(\sin(|x|)) ]
У домохозяек порядок изложения совпадает с порядком действий. У математиков сначала написано про косинус, но считается он в самом конце.
Похоже Лёнька Эйлер и Алёшка Клеро
фото
введя обозначение $f(x)$ отделили математиков от домохозяек и, вероятно, пустили математику по ложному пути. Было бы гораздо удобнее, если бы в математике функции также записывали в естественном порядке! Но обозначение $f(x)$ мы впитали с молоком матери, уже вряд ли что исправишь.
R позволяет использовать обе традиции обозначени.
Традиция Эйлера-Клеро:
cos(sin(abs(10)))
Для того, чтобы иметь возможность писать операции в естественном порядке,
подключаем пакет dplyr
:
library("tidyverse") # подключит dplyr, ggplot2 и прочие приятности
И теперь, в традициях лучших кулинарных рецептов, можно написать
10 %>% abs() %>% sin() %>% cos()
Оператор %>%
называется трубочкой (pipe). (? канал) По первому впечатлению
кажется, что эти трубочки долго писать. Но стоит к ним привыкнуть и ощущаешь,
что они безумно удобны для сложных операций!
(здесь про типы данных)
Правильные имена переменных!!!
Основной объект с которым приходится работать — это табличка с данными. Табличка с данными представляет собой простую двумерную таблицу. Переменные размещаются по столбцам. Каждый столбец может быть своего типа: скажем в одном — числа, а в другом — названия предприятий. Если значение в клетке неизвестно, то там стоит специальное значение NA
.
Отличие от матрицы от таблицы с данными состоит в том, что в матрице все клеточки одинакового типа (все — числовые или все — текстовые), а в таблице с данными каждый столбец может быть своего типа.
При обработке данных нам помогут рабочие лошадки:
Быстрый взгляд на табличку
Отбор наблюдений
Отбор и переименование переменных
Преобразование и создание новых переменных
Сортировка
Операции с группировкой
Преобразование широких и длинных таблиц
Все эти действия можно сделать в базовом R, но это ужасно неудобно. Жизнь становится прекрасной с пакетами data.table
, dplyr
, reshape2
, broom
и tidyr
.
Седлаем наших верных коней:
library(tidyverse) # подключит пакеты dplyr, ggplot2 и прочие library(data.table) library(reshape2)
Погнали!
Пакет data.table
работает быстрее dplyr
, а у dplyr
более приятный синтаксис.
Перед работой с табличкой данных с помощью data.table
требуется присвоить ей специальный класс:
cars2 <- data.table(cars) mtcars2 <- data.table(mtcars)
Содержимое таблиц cars
и cars2
абсолютно одинаково, просто они чуть по-разному хранятся и обрабатываются компьютером.
С помощью базового R:
str(mtcars)
С помощью dplyr
:
glimpse(mtcars)
С помощью broom
glance(mtcars)
и короткие описательные статистики:
tidy(mtcars)
Пока что в пакете broom
содержится ошибка, команды glance() и tidy() не срабатывают с некоторыми табличками данных. Тогда описательные статистики можно получить с помощью пакета psych
:
library("psych") describe(mtcars)
С помощью dplyr
:
head(cars) new_cars <- filter(cars, speed > 10, dist < 20) head(new_cars)
Не забывай про эквивалентный трубчатый синтаксис:
new_cars <- cars %>% filter(speed > 10, dist < 20)
Некоторые другие пакеты помимо dplyr
содержат функцию filter
— уж больно слово filter
популярное. Конфликт имён при использовании команды filter
— одна из распространённых ошибок.
``{block, type="warning"}
Чтобы избежать ошибки из-за конфликта имён можно явно написать
dplyr::filterвместо просто
filter`!
А именно: ```r new_cars <- cars %>% dplyr::filter(speed > 10, dist < 20)
С помощью data.table
:
new_cars <- cars2[speed > 10 & dist < 20]
К примеру, мы хотим из набора данных mtcars
отобрать три переменных, mpg
, carb
и cyl
, а заодно дать им более понятные имена: переименовать cyl
в cylinder
и carb
в carburator
.
С помощью dplyr
:
new_mtcars <- select(mtcars, cylinder = cyl, mpg, carburator = carb)
Помни о трубочках:
mtcars2 <- mtcars %>% select(cylinder = cyl, mpg, carburator = carb)
``{block, type="warning"}
Некоторые другие пакеты помимо
dplyrсодержат функцию
select. Чтобы избежать конфликта имён, можно явно написать
dplyr::selectвместо просто
select`.
С помощью пакета `data.table`: ```r # new_mtcars2 <- mtcars2[, .(cylinder = cyl, mpg, carburator = carb)]
Если переназывать переменные не требуется, то можно отобрать переменные и по-другому:
# new_mtcars2 <- mtcars2[, c("mpg", "cyl")]
Допустим, я хочу в наборе данных mtcars
создать новую переменную weight2
равную квадрату переменной wt
, а переменную mpg
отмасштабировать из милей на галлон бензина в километры на литр бензина. Интернет говорит, что в одном галлоне .... литров, а в одной миле — ... километров.
Начнём с трубчатого синтаксиса:
# new_mtcars <- mtcars %>% mutate(weight2 = wt^2, mpg = mpg * ... / ...)
То же действие без трубочек:
# new_mtcars <- mutate(mtcars, weight2 = wt^2, mpg = mpg * ... / ...)
Создаём новую переменную с помощью пакета data.table
:
# new_mtcars2 <- mtcars2[, weight2 := wt^2]
Если нужно создать сразу несколько переменных, то синтаксис data.table
чуть более громоздкий, чем у dplyr
:
# new_mtcars2 <- mtcars2[, weight2 := wt^2][, mpg := mpg / 100]
Или так:
# new_mtcars2 <- mtcars2[, `:=`(weight2 = wt^2, mpg = mpg / 100)]
Чтобы лучше была понятна разница, подчеркну отличие двух команд:
# команда A: # new_mtcars2 <- mtcars2[, .(weight2 = wt^2, mpg = mpg / 100)] # команда B: # new_mtcars2 <- mtcars2[, `:=`(weight2 = wt^2, mpg = mpg / 100)]
После выполнения команды A в массиве new_mtcars2
будет только две переменных: weight2
и mpg
. А после выполнения команды B также останутся и все старые переменный из исходной таблички mtcars2
.
График можно строить либо чтобы: - самому по-быстрому взглянуть на некий результат и сразу забыть график - показать график кому-нибудь
В первом случае нет никаких требований к графику — лишь бы самому было понятно, что там изображено. Если же график показывать кому-то ещё, то:
```{block, type="warning"} Идеальный график должен быстро и верно восприниматься смотрящим.
Из этого простого принципа следует ряд выводов: 1. Идеальный график должен быть самодостаточным. Если для понимания графика смотрящему требуется прочитать кучу текста вокруг или прослушать получасовое объяснение, то это нехорошо :) Вырежи свой график из статьи/книги/курсовой и подумай, понятен ли он? 2. Подписывай оси. [ссылка на xkcd] 3. Выбирай единицы измерения так, чтобы читатель не мучился, считая нули у каждой цифры. 4. Указывай единицы измерения. 5. Хорошо бы указать источник данных. 6. Лучше расшифровать сокращения, хотя иногда это бывает нелегко. 7. Никаких круговых диаграмм. Круговые диаграммы — это табу. Да, R умеет их строить. Процитирую документацию к функции `pie`: ```r help(pie)
Pie charts are a very bad way of displaying information. The eye is good at judging linear measures and bad at judging relative areas. A bar chart or dot chart is a preferable way of displaying this type of data.
Cleveland (1985), page 264: “Data that can be shown by pie charts always can be shown by a dot chart. This means that judgements of position along a common scale can be made instead of the less accurate angle judgements.” This statement is based on the empirical investigations of Cleveland and McGill as well as investigations by perceptual psychologists.
Посмотрите пару анимаций от DarkHorse.
Ось должна начинаться от нуля.
Полезно немного ознакомиться с творениями мэтров :)
Tufte, link
Очень часто к графикам относятся как к чему-то вспомогательному. На самом деле график очень часто является основным результатом, гораздо более важным, чем несколько страниц текста. Именно поэтому полезно отказаться от мысли «я тут за пять минут график вставлю» и потратить на график часок-другой!
Простенькую гистограмму можно построить, например, с помощью функции qplot()
из пакета ggplot2
:
s <- rnorm(100) qplot(factor(s), xlab = "Значение", ylab = "Количество", main = "Гистограмма")
Ту же гистограммку можно построить с помощью функции ggplot()
из того же
пакета, предварительно преобразовав s в необходимый для ggplot()
формат data
frame:
s_df <- data.frame(s) ggplot(s_df) + geom_bar(aes(factor(s))) + labs(x = "Значение", y = "Количество", title = "Гистограмма")
И еще простенький график:
x <- rnorm(500) # 500 нормальных величин со средним 0 и дисперсией 1 y <- rnorm(500) # 500 нормальных величин со средним 0 и дисперсией 1 qplot(x, y, main = "Точечки")
Или:
xy_df <- data.frame(x = x, y = y) ggplot(xy_df) + geom_point(aes(x, y)) + labs(title = "Точечки")
В зависимости от формата данных часто бывает удобно использовать и qplot()
, и ggplot()
.
Чтобы узнать в каком пакете живет заданная функция, например lm
, можно прямо спросить у R:
help("lm")
На самом верху справа документации будет написано lm {stats}
. Это означает, что функция lm
живёт в пакете stats
.
Шеф! Всё пропало! Гипс снимают, клиент уезжает!
поговори с уточкой, посиди у озера
Начнём с русскоязычных крупных книжек:
На русском также могут быть полезны:
Вопросы и ответы:
stackoverflow Если возникли проблемы с программированием в R (и не только в R), а документация уже прочитана...
stats.stackexchange Можно спросить по статистическим методам и их реализации в R.
tex.stackexchange Вопросы и ответы про LaTeX
Он-лайн курсы и видеолекции с использованием R:
Try R Путь к сокровищам R для самых начинающих пиRатов!
datacamp.com Несколько платных и бесплатных интерактивных курсов по R
Видео-лекции курса Computing for Data Analysis: неделя 1, неделя 2, неделя 3, неделя 4. Сам курс доступен на coursera.org
Открытые крупные источники на английском:
Trevor Hastie, Robert Tibshirani, An Introduction to Statistical Learning. По книжке есть курс на платформе class.standford.edu
Rob Hyndman, Forecasting: principles and practice Книжка по временным рядам от автора пакета forecast
Garrett Grolemund, Hadley Wickham, R for Data Science
Colin Gillespie, Robin Lovelace, Efficient R programming, он-лайн книга для более продвинутых пользователей R. Написана на R и markdown :)
Rob Kabacoff, Quick R
Farnsworth, Econometrics in R
R-inferno Адский учебник по R с картинками Ботичелли, "Even if it doesn't help you with your problem, it might amuse you"
Roger Peng, R programming for data science и на bookdown
Introduction to R, Введение с официального сайта
документация по графикам ggplot2
документация к R от stats.stackexchange
Шикарные шпаргалки от Rstudio
100 курсов и книг по R от разных университетов
Агрегатор блогов r-bloggers
Поисковик rseek.org
Великолепные виньетки к разным пакетам:
vars, векторные авторегрессии, есть вольный пересказ по-русски
dplyr манипуляции с данными
sandwich борьба с гетероскедастичностью и заклинания HC0, HC1, HC2, ...
plm панельные модели в R
ggmap рисуем карты
vcd полезные графики для качественных переменных
Beanplot: A Boxplot Alternative for Visual Comparison of Distributions.
Ты ещё не заработал свой первый миллион и хочешь скачать научную статью или книжку бесплатно?
Научные книги можно найти на gen.lib.rus.ec.
Научные статьи можно скачать на sci-hub.cc. Есть даже
бот @scihubot
для Telegram, которые вышлет в ответ на
запрос полный текст статьи.
Если какая-нибудь ссылка не работает или хочешь предложить свою, смело открывай issue на github!
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.