Язык программирования R Введение R — это объектно-ориентированный язык программирования. Это означает, что теоретически всё что угодно может быть сохранено как объект R. Каждый объект имеет свой класс, описывающий что содержит этот объект и что каждая функция может с этими данными делать. R поддерживает широкий спектр статистических и численных методов и обладает хорошей расширяемостью с помощью пакетов. Пакеты представляют собой библиотеки для работы специфических функций или специальных областей применения. Введение Важное преимущество R - наличие для него многочисленных расширений или пакетов буквально для всех типов задач. После установки R на компьютер, несколько пакетов уже в наличии: так называемые базовые пакеты, без которых система не работает (например, пакет который называется base, или пакет grDevices, который управляет выводом графиков), и ещё рекомендованные пакеты (пакет для специализированного кластерного анализа cluster, пакет для анализа нелинейных моделей nlme и пр.). Кроме того можно поставить любой из почти полутора тысяч доступных на CRAN пакетов. Зачем использовать R? ● R является свободным программным обеспечением ● R широко используется в социальных науках, статистике, экономике, страховом деле, социологии, финансах, физике высоких энергий и так далее ● R включает самые последние методики ● R - объектно ориентированный. Теоретически, всё что угодно может быть сохранено как объект R ● R доступен для всех операционных систем, включая Linux, Mac OS, Windows ● R использует более систематичный синтаксис, нежели Stata или SAS Инструменты Для удобства работы с R разработан ряд графических интерфейсов, в том числе RStudio, JGR, RKWard, SciViews-R, Statistical Lab, R Commander, Rattle. Кроме того, в ряде текстовых и кодовых редакторов предусмотренные специальные режимы для работы с R, в частности в ConTEXT, Emacs (Emacs Speaks Statistics), jEdit, Kate, Syn, TextMate, Tinn-R, Vim, Bluefish, WinEdt (с пакетом RWinEdt), Gedit (с пакетом rgedit/gedit-r-plugin). Для среды разработки Eclipse существует специализированный R-плагин; доступ к функциям и среде выполнения R возможен из Python с использованием пакета RPy; работать с R можно из эконометрического пакета Gretl. Типы данных Vectors (векторы) являются наиболее простыми из объектов R. Factors похожи на векторы, но с предопределённым набором уровней. Matrix (матрицы) похожи на векторы, но с специфическими инструкциями для вывода, чтобы напоминали матрицы из математики. Arrays (массивы) похожи на матрицы, но могут иметь размерность больше двух. List (список) является вектором для объектов R. Dataframe (структура) похожа на матрицу, но не требует чтобы все колонки были идентичны по типу. Структура является списком переменных/векторов одинаковой длины. Classes (классы) реализуются как objects (объекты) соответствующего типа данных (то есть класс — это тип данных для переменной, а сама переменная этого типа является объектом — экземпляром класса). Classes (классы) присоединяются к объектам как attribute (атрибуты). Все объекты в R имеют свой класс, тип и размерность. Типы данных. Vectors Вектор создается с использованием функции c(), которая объединяет несколько однотипных элементов. Возможно, также, создать последовательность используя символ : или функцию seq(). Например, 1:5 создает вектор-последовательность чисел от 1 до 5. Функция seq() позволяет указывать интервал между числами. Можно повторять образец используя функцию rep(). Также можно создать численный вектор с пропущенными значениями, используя функцию numeric(), или символьный — character(), или логический (то есть TRUE или FALSE) — logical(). Функция length() вычисляет длину вектора (количество переменных) Функция last() возвращает последний элемент вектора. Типы данных. Vectors. Примеры > c(1,2,3,4,5) => [1] 1 2 3 4 5 > rep(1,5) => [1] 1 1 1 1 1 > c("a","b","c","d","e") => [1] "a" "b" "c" "d" "e" > rep(1:2,5) => [1] 1 2 1 2 1 2 1 2 1 2 > c(T,F,T,F) => [1] TRUE FALSE TRUE FALSE > numeric(5) => [1] 0 0 0 0 0 > 1:5 => [1] 1 2 3 4 5 > logical(5) => [1] FALSE FALSE FALSE FALSE FALSE > 5:1 => [1] 5 4 3 2 1 > character(5) => [1] "" "" "" "" "" > seq(1,5) => [1] 1 2 3 4 5 > seq(1,5,step=.5) => [1] 1 2 3 4 5 > seq(1,5,by=.5) => [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 Типы данных. Factors Функция factor() трансформирует вектор в factor. Также, factor может быть отсортирован при помощи опции ordered=T или функции ordered(). Функция levels() возвращает уровни factor-а. Функция gl() генерирует factor-ы: ● ● ● ● n — количество уровней; k — количество повторений каждого factor-а; length — общая длина factor-а; labels — опциональный параметр присваивающий метки каждому уровню. Типы данных. Factors. Примеры > factor(c("yes","no","yes","don't","don't","no","don't","no","no")) => [1] yes no yes don't don't no don't no no Levels: don't no yes > factor(c("yes","no","yes","don't","don't","no","don't","no","no"), ordered = T) => [1] yes no yes don't don't no don't no no Levels: don't < no < yes > ordered(c("yes","no","yes","don't","don't","no","don't","no","no"))[1] yes no yes don't don't no don't no no Levels: don't < no < yes > gl(n=2, k=2, length=10, labels = c("Male", "Female")) => [1] Male Male Female Female Male Male Female Female Male Male Типы данных. Matrix Одной из возможностей создания матрицы является использование функции matrix(). Указываются вектора, набор строк или столбцов, и указывается как нужно интерпретировать данные (по умолчанию как столбцы). Функции cbind() и rbind() комбинируют векторы в матрицы по столбцам или по строкам. Размерность матрицы может быть получена при помощи функции dim(). Иначе функции nrow() и ncol() возвращают, соответственно, количество строк и столбцов. Функция t() транспонирует матрицу Типы данных. Matrix. Примеры > matrix(data = NA, nrow = 5, ncol = 5, byrow = T) [,1] [,2] [,3] [,4] [,5] [1,] NA NA NA NA NA [2,] NA NA NA NA NA [3,] NA NA NA NA NA [4,] NA NA NA NA NA [5,] NA NA NA NA NA > matrix(data = 1:15, nrow = 5, ncol = 5, byrow = T) [,1] [,2] [,3] [,4] [,5] [1,] 1 2 3 4 5 [2,] 6 7 8 9 10 [3,] 11 12 13 14 15 [4,] 1 2 3 4 5 [5,] 6 7 8 9 10 > X<-matrix(data = 1:15, nrow = 5, ncol = 5, byrow = T) > t(X) [,1] [,2] [,3] [,4] [,5] [1,] 1 6 11 1 6 [2,] 2 7 12 2 7 [3,] 3 8 13 3 8 [4,] 4 9 14 4 9 [5,] 5 10 15 5 10 Типы данных. Dataframe Структуры относят к "спискам переменных/векторов одинаковой длины". В представленном примере, создаётся структура из двух векторов, где каждый из пяти элементов. Первый вектор "v1" состоит из последовательности целых чисел от 1 до 5. Второй вектор "v2" состоит из логических значений. > v1 = 1:5 > v2 = c(T,T,F,F,T) > df = data.frame(v1,v2) > print(df) v1 v2 1 1 TRUE 2 2 TRUE 3 3 FALSE 4 4 FALSE 5 5 TRUE Типы данных. Dataframe Структуры могут создаваться напрямую. В следующем примере, определение и наименование обоих векторов происходит непосредственно в списке аргументов. > df = data.frame(foo=1:5,bar=c(T,T,F,F,T)) > print(df) foo bar 1 1 TRUE 2 2 TRUE 3 3 FALSE 4 4 FALSE 5 5 TRUE Типы данных. Arrays Массивы состоят из n измерений, где каждое может быть вектором из объектов R одинакового типа. Одномерные массивы с одним элементом могут быть созданы следующим кодом: > x = array(c(T,F),dim=c(1)) > print(x) [1] TRUE Одномерный (dim=c(1)) массив x создаётся из вектора с одним значением из c(T,F). Идентичный одномерный массив y может быть создан с обоими значениями из c(T,F): > y = array(c(T,F),dim=c(2)) > print(y) [1] TRUE FALSE Типы данных. Arrays Трёхмерный массив - 3 на 3 на 3 - может быть создан как показано ниже: > z = array(1:27,dim=c(3,3,3)) > dim(z) [1] 3 3 3 > print(z) ,,1 ,,2 ,,3 [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9 [,1] [,2] [,3] [1,] 10 13 16 [2,] 11 14 17 [3,] 12 15 18 [,1] [,2] [,3] [1,] 19 22 25 [2,] 20 23 26 [3,] 21 24 27 Типы данных. Arrays Массивы в R используются похожим на другие языки образом: посредством индексирования целыми числами начиная с 1. Следующий код демонстрирует как можно получить третий элемент трёхмерного массива (то есть массив 3 на 3): > z[,,3] [,1] [,2] [,3] [1,] 19 22 25 [2,] 20 23 26 [3,] 21 24 27 Указание двух из трёх размерностей возвращает одномерный массив: > z[,3,3] [1] 25 26 27 Указание трёх из трёх размерностей возвращает элемент трёхмерного массива: > z[3,3,3] [1] 27 Типы данных. Arrays Массив должен быть симметричным по всем размерностям. Объекты векторов, из которых состоит массив, должны быть одинакового типа, но не обязательно числового Типы данных. List Списки — это коллекция объектов R. Функция list() создаёт список; unlist() трансформирует список в вектор. > ret = list() Управляющие структуры. Условные операторы if() if (условие) { выполняется если условие верно } else { выполняется если условие не верно } ifelse() Команда ifelse() воспринимает первый аргумент как условие, второй аргумент возвращается если условие верно, а третий аргумент - если нет. Таким образом условие может быть вектором. Управляющие структуры. Циклы R позволяет реализовать циклы тремя путями: ● циклы "for"; ● циклы с предусловием ("while"); ● "бесконечные" циклы ("repeat"); Управляющие структуры. Циклы Циклы "for" Для использования оператора for требуется указать индекс (в примере - k) и вектор (в примере - 1:5), а также указать выполняемую конструкцию и указать повторяемые операторы в фигурных скобках. Механизм работы следующий: 1. интерпретатор последовательно выбирает значения из вектора и присваивает их переменной k; 2. с каждым значением k выполняется список функций в фигурных скобках. Управляющие структуры. Циклы Циклы с предусловием ("while") Синтаксис цикла while вполне стандартен: 1. Ключевое слово while. 2. Условие выполнимости в скобках. 3. Список функций для итерированного выполнения в фигурных скобках. Управляющие структуры. Циклы "Бесконечные" циклы ("repeat") Синтаксис следующий: 1. Ключевое слово repeat. 2. Список функций для итерированного выполнения в фигурных скобках. 3. Наличие условия прерывания выполнения внутри цикла. Управляющие структуры. Циклы Неявные циклы Циклы обычно медленны и лучше избегать их по возможности. Функция apply() может применить функцию к элементу матрицы или массиву. Чтобы применить к строке, нужно вторым параметром отдать цифру 1; чтобы применить к столбцу - 2. Функция sapply() похожа, но не возвращает ничего на экран. Могут существовать векторы или матрицы зависящие от этой функции. Функция tapply() применяет функцию к каждому уровню factor-а. Управляющие структуры. Функции Определение функции - это присвоение блока операторов переменной. Синтаксис: 1. 2. 3. 4. Переменная. Оператор присвоения. Ключевое слово function. Список аргументов в круглых скобках. Управляющие структуры. Функции В R очень много разных полезных функций. И многие большие вещи можно сделать весьма быстро, написав очень мало кода. Функции можно разделить на следующие типы: ● ● ● ● ● ● ● ● ● Помощь Текущее окружение Общая работа с объектами Ввод и вывод Создание объектов Работа с переменными Манипуляция данными Математика Матрицы Обработка данных Строки Дата и время Рисование графиков Lattice-графика Оптимизация и подбор параметров ● Статистика ● Распределения ● ● ● ● ● ● ООП R полностью отвечает требованиям объектно-ориентированного программирования. Принципы ООП в R в большей степени основываются на обобщенных функциях, чем на иерархиях классов. Эта концепция близка CLOS Lisp или множественной диспетчеризации в Python (Ресурсы). Наиболее новая версия R сопровождается пакетом methods, который определяет и использует формальные методы. Применение этих формальных методов во многом накладывает некую дисциплину (и ограничения), знакомые по традиционным языкам ООП. ООП Суть концепции ООП в R на самом деле не в наследовании, а в более общем принципе - решениях по диспетчеризации. Например, вызов obj.method() в традиционных языках ООП будет использовать порядок разрешения методов (method resolution order - MRO) объекта для поиска первого класса-предка obj, который имеет метод .method(). R принимает те же решения, но вместо набора классов, которые могут объявлять и аннулировать различные методы внутри себя, R порождает семейство обобщенных (generic) функций, которые имеют метки, указывающие тип объекта, которым они хотят оперировать. Математика. Линейная алгебра Скалярное произведение (inner product) Последовательное произведение каждого члена вектора на соответствующий член другого вектора и сумма получившихся произведений. В представленном примере вектор (3,3,3) умножается на вектор (1,2,3) > u = rep(3,3) > v = 1:3 > u%*%v # Скалярное произведение [,1] [1,] 18 Таким образом векторы R совместимы с векторами обычной линейной алгебры. Математика. Линейная алгебра Внешнее произведение (outer product) Из линейной алгебры известно: Эту операцию R считает внешним произведением: > u=1:3 > v=4:6 > u => [1] 1 2 3 > v => [1] 4 5 6 > u%o%v [,1] [,2] [,3] [1,] 4 5 6 [2,] 8 10 12 [3,] 12 15 18 Математика. Линейная алгебра Если требуется создать матрицу, то нужно использовать функцию matrix(). Для этого требуется: 1. Передать вектор данных. 2. Количество столбцов и/или строк. 3. Задать способ обработки: по столбцам (по умолчанию) или строкам; при помощи опции byrow. "Склеить" матрицу из нескольких векторов можно функциями cbind(v1,v2) (по столбцам) или rbind(v1,v2) (по строкам). Размерность матрицы может быть получена функцией dim(). Узнать количество столбцов или строк можно, соответственно, функциями nrow() или ncol(). Математика. Линейная алгебра Некоторые замечательные виды матриц R позволяет сгенерировать единичную матрицу нужного размера при помощи функции eye(), которой в качестве аргумента передаётся размер матрицы. Квадратную матрицу полностью состоящую из единиц можно получить при помощи функции ones(), которой в качестве параметра передаётся размер. Сгенерировать нулевую матрицу заданного размера можно при помощи функции zeros(), которой в качестве параметра передаётся размер: Математика. Линейная алгебра Для получения диагонали матрицы нужно отдать матрицу в качестве аргумента функции diag(), и она вернёт вектор составленный из элементов диагонали. Для получения верхнего угла можно использовать функцию upper.tri(), нижнего - lower.tri(). Эти функции принимают матрицу в качестве аргумента и возвращают матрицу идентичного размера с элементами типа Boolean. На месте тех членов, которые должны быть включены, стоит TRUE, на месте прочих - FALSE. Дополнительный аргумент diag (по умолчанию FALSE) определяет включать диагональ или нет. Математика. Линейная алгебра Произведение матриц Пример ниже демонстрирует > a=matrix(nrow=2,ncol=2,c(1,0,0,-1)) > b=matrix(nrow=2,ncol=2,c(1,2,3,4)) >a [,1] [,2] [1,] 1 0 [2,] 0 -1 >b [,1] [,2] [1,] 1 3 [2,] 2 4 > a%*%b [,1] [,2] [1,] 1 3 [2,] -2 -4 > b%*%a [,1] [,2] [1,] 1 -3 [2,] 2 -4 Математика. Линейная алгебра Тензорное произведение (Произведение Кронекера) в R реализуется оператором %x% или функцией kron() из библиотеки fUtilities. Для транспонирования матрицы нужно применить функцию t(). Для получения следа матрицы применяется функция tr() из пакета fUtilities Для определения ранга матрицы используется функция qr()$rank. Для вычисления определителя матрицы применяется функция det(). Для получения обратной матрицы можно воспользоваться функциями solve(), inv() (пакет fUtilities) или ginv() (пакет MASS) Математика. Математический анализ Вычислить степень числа можно двумя операторами (например, 10^3 10**3 ): Взять логарифм можно функцией log(), где первый аргумент - это подлогорифменное значение, а второй, опциональный, равный по умолчанию e база. Таким образом, функция log() без указания базы, по умолчанию, берет натуральный логарифм. Взять десятичный логарифм можно функцией log10(). Вычислить e^x можно функцией exp(). Математика. Математический анализ R может вычислять производные от выражений. Нужно сконвертировать имеющееся выражение при помощи функции expression(), после чего можно будет дифференцировать его. Для выполнения одноразмерного интегрирования используется функция integrate(). Для взятия интегралов от многих переменных необходимо подключить пакет cubature Математика. Вероятности ● Сочетание вычисляется с помощью функции choose() > choose(3,2) [1] 3 ● Объединения и пересечения вычисляются, соответственно, при помощи функций union() и intersect(). > union(1:10,5:7) [1] 1 2 3 4 5 6 7 8 9 10 > intersect(1:10,5:7) [1] 5 6 7 Арифметика Функция factorial() возвращает факториал натурального числа. Также, можно применить функцию prod() к вектору последовательных натуральных чисел от единицы. Целочисленное деление > # Остаток от деления > 5%%2 [1] 1 > # Деление нацело >5%/%2 [1] 2 Геометрия Число Пи - встроенная константа pi. Тригонометрические функции: ● cos(), ● sin(), ● tan(). Генерация случайных чисел Для генерации вещественных чисел в диапазоне [min, max] используется функция runif(n, min = 0, max = 1), которая в качестве аргументов принимает: ● n — количество генерируемых значений; ● min — нижняя граница диапазона; вещественное конечное число; ● max — верхняя граница диапазона; вещественное конечное число. Для генерации целых чисел в диапазоне [min, max] используется функция sample(x, size, replace = FALSE, prob = NULL), которая в качестве аргументов принимает: ● x — целое число (эквивалентно 1:x) или вектор ограничивающий диапазон (например: 5:15); ● size — количество генерируемых значений; ● replace — разрешаются ли повторения; ● prob — вектор весов распределения, по умолчанию отсутствует Как выглядит среда R? Существует много "оболочек" для R, внешний вид и функциональность которых могут сильно отличаться. Но мы коротко рассмотрим лишь три наиболее популярных варианта: Rgui, Rstudio и R, запущенный в терминале Linux/UNIX в виде командной строки. Rgui - это стандартный графический интерфейс (https://cran.r-project.org/), встроенный в R по умолчанию. Эта оболочка имеет вид командной строки в окне, называемым консолью. Командная строка работает по принципу "вопрос-ответ". Как выглядит среда R? Однако, для записи сложного алгоритма команд в Rgui существует дополнительное скриптовое окно, где пишется программа (скрипт). Третьим элементом данной оболочки является графический модуль, который появляется при необходимости отображения графиков. На приведенном ниже рисунке, показана полная версия Rgui: консоль (слева), скриптовое окно и графический модуль (справа). Как выглядит среда R? Как выглядит среда R? Rstudio - интегрированная среда разработки (IDE) (https://www.rstudio.com/). В отличие от Rgui, у данной оболочки есть заранее разделенные области и дополнительные модули (например, история команд, рабочая область). По мнению некоторых пользователей, Rstudio имеет более удобный интерфейс, упрощающий работу с R. Ряд особенностей, таких как цветовая подсветка и автоматическое завершение кода, удобная навигация по скрипту и другие, делают Rstudio привлекательной не только для новичков, но и для опытных программистов. Как выглядит среда R? Как выглядит среда R? R в терминале Linux/UNIX. Данный вариант предпочтителен для анализа большого объема данных через сервер, суперкластер или суперкомпьютер. Большинство из них работают на операционных системах класса Linux/UNIX, доступ к которым осуществляется через терминал команд (например, bash). R в терминале представляет собой приложение, запущенное в виде командной строки Как выглядит среда R? Сравнение R с языками программирования MatLab, Python и Julia Среди языков программирования, используемых в статистических расчетах, лидирующие позиции занимают R и Matlab. Они схожи между собой, как по внешнему виду, так и по функциональности; но имеют разные лобби пользователей, что и определяет их специфику. Исторически MatLab был ориентирован на прикладные науки инженерных специальностей, поэтому его сильными сторонами являются мат. моделирование и расчеты, к тому же он гораздо быстрее R! Но так как R разрабатывался как узкопрофильный язык для статистической обработки данных, то многие экспериментальные стат. методы появлялись и закреплялись именно в нем. Этот факт и нулевая стоимость сделали R идеальной площадкой для разработки и использования новых пакетов, применяемых в фундаментальных науках. Сравнение R с языками программирования MatLab, Python и Julia Другими "конкурирующими" языками являются Python и Julia. Python, являясь универсальный языком программирования, больше подходит для обработки данных и сбора информации с применением веб-технологий, чем для статистического анализа и визуализации. А вот статистический язык Julia довольно молодой и претенциозный проект. Основной особенностью этого языка является скорость вычислений, в некоторых тестах превышающая R в 100 раз! Пока Julia находится на ранней стадии развития и имеет мало дополнительных пакетов и последователей, но в отдаленный перспективе Julia это, пожалуй, единственный потенциальный конкурент R. Заключение Сегодня R является безусловным лидером среди свободно распространяемых систем статистического анализа, о чем говорит, например, тот факт, что в 2010 году система R стала победителем ежегодного конкурса открытых программных продуктов Bossie Awards в нескольких номинациях. Ведущие университеты мира, аналитики крупнейших компаний и исследовательских центров постоянно используют R при проведении научно-технических расчетов и создании крупных информационных проектов. Широкое преподавание статистики на базе пакетов этой среды и всемерная поддержка научным сообществом обусловили то, что приведение скриптов R постепенно становится общепризнанным "стандартом" как в журнальных публикациях, так и при неформальном общении ученых всего мира. Заключение Достоинства среды R: ● бесплатная и кроссплатформенная; ● богатый арсенал стат. методов; ● качественная векторная графика; ● более 7000 проверенных пакетов; ● гибкая в использовании: ○ позволяет создавать/редактировать скрипты и пакеты, ○ взаимодействует с другими языками, такими: C, Java и Python, ○ может работать с форматами данных для SAS, SPSS и STATA; ● активное сообщество пользователей и разработчиков; ● регулярные обновления, хорошая документация и тех. поддержка. Заключение Недостатки: ● небольшой объем информации на русском языке (хотя за последние пять лет появилось несколько обучающих курсов и интересных книг); ● относительная сложность в использовании для пользователя, незнакомого с языками программирования. Частично это можно сгладить работая в GUI оболочке Rcmdr, но для нестандартных решений все же необходимо использовать командную строку. Список полезных источников Официальный сайт: http://www.r-project.org/ Сайт для начинающих: http://www.statmethods.net/ Один из лучших справочников: The R Book, 2nd Edition by Michael J. Crawley, 2012 Список доступной литературы на русском + хороший блог по теме: ranalytics.blogspot.fi