R – это язык программирования для обработки и анализа данных, распространяющийся бесплатно и дополняющийся пользователями.
Работа в R строится на использовании функций. Функция в R похожа на функцию в математике. Над аргументом функции производится некоторая операция, после чего возвращается результат. Функция может иметь несколько аргументов, указывающих не только на то, с каким объектом нужно проводить операции, но и как их проводить.
Чтобы узнать, что делает та или иная функция, сколько у нее аргументов и за что они отвечают, можно воспользоваться подсказками, встроенными в R, прописав вопросительный знак перед названием функции. Например, для функции квадратного корня:
?sqrt
10+320
## [1] 330
10*320
## [1] 3200
Функция квадратного корня:
sqrt(3200)
## [1] 56.56854
Обратите внимание, что аргументы функций указываются в скобках. Кроме того, важно помнить, что R чувствителен к регистру символов: это значит, что если написать функцию с большой буквы, она не будет распознана.
Функция модуля:
abs(-16)
## [1] 16
В R существует и функция округления, которая нам может потребоваться для оформления аккуратных результатов расчетов. По дефолту R округляет до целого числа:
round(2/3)
## [1] 1
Можно указать, какое количество знаков после запятой мы хотим получить в результате. Для этого нужно прописать дополнительный аргумент внутри функции:
round(2/3, 4)
## [1] 0.6667
Обратите внимание, что в R, в отличие от Excel, целая часть от дробной отделяется точкой.
R может проводить вычисления не только над отдельными числами, но и над списками (и над таблицами). Создадим вектор, содержащий числа от 1 до 10, и сохраним его в память R. Слева указывается название вектора, справа – содержание, а стрелочка, <-, оператор присваивания, сохраняет содержание под указанным именем.
vec <- c(1:10)
Чтобы посмотреть на созданный объект, нужно просто вызвать его по названию.
vec
## [1] 1 2 3 4 5 6 7 8 9 10
Вектор – это объект R, который содержит элементы одного типа: либо только числа, либо только текст. А вот так выглядит вектор из текстовых элементов:
probability_party <- c("Bernoulli", "Gauss", "Moivre", "Laplace")
probability_party
## [1] "Bernoulli" "Gauss" "Moivre" "Laplace"
Операции над векторами в R производятся поэлементно. Давайте из каждого элемента вектора vec извлечем квадратный корень:
sqrt(vec)
## [1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751
## [8] 2.828427 3.000000 3.162278
А теперь округлим до второго знака после запятой:
round(sqrt(vec), 2)
## [1] 1.00 1.41 1.73 2.00 2.24 2.45 2.65 2.83 3.00 3.16
В ряде резлуьтатов в будущем нам будет встречаться так называемая экспоненциальная запись чисел. Она используется для удобного отображения очень больших или очень маленьких чисел через произведение \(a\times 10^b\), где a – любое число, по модулю не меньшее 1, но меньшее 10. Например, мы можем представить миллион как произведение \(1\times 10^6\).
Давайте посмотрим на очень большое число, возведя число 16 в степень 16:
16^16
## [1] 1.844674e+19
R обозначет умножение на 10 в некоторой степени как e.
Теперь очень маленькое число. Обратите внимание на знак после e:
1/16^16
## [1] 5.421011e-20
В R существуют несколько базовых типов данных:
TRUE или FALSE: “да” или “нет”, “правда” или “неправда”.Мы можем проверять, правда ли, что некоторый объект относится к тому или иному типу данных:
is.numeric(vec)
## [1] TRUE
is.character(vec)
## [1] FALSE
is.logical(vec)
## [1] FALSE
Можно узнать тип объекта:
class(vec)
## [1] "integer"
R можно использовать для подсчета значений функции распределения, функции плотности и квантилей для различных распределений.
Для расчета функции распределения для нормального распределения используется функция pnorm(). Она имеет три аргумента: q – значение (или значения) случайной величины, для которых мы ищем функцию распределения; mean – математическое ожидание; sd – стандартное отклонение; lower.tail – поиск вероятности \(P(X<x)\). По дефолту (то есть, если не прописывать иное) аргументы функции принимают следующие значения: pnorm(q, mean=0, sd=1, lower.tail=TRUE), то есть, рассчитывается функция распределения для стандартного нормального распределения.
Рассчитаем \(F(1)=P(Z<1)\):
pnorm(1)
## [1] 0.8413447
Эта же функция позволяет рассчитать \(P(Z>1)\). Для этого нужно прописать аргумент lower.tail=FALSE, тем самым выбрав площадь под графиком функции плотности стандартного нормального распределения, которая правее рассматриваемого значения.
pnorm(1, lower.tail = FALSE)
## [1] 0.1586553
Мы можем работать не только со стандартным нормальным распределением:
pnorm(1, mean=-1, sd=3)
## [1] 0.7475075
Можно рассчитать значение функции плотности:
dnorm(1)
## [1] 0.2419707
Можно рассчитать квантиль заданного уровня:
qnorm(0.5)
## [1] 0
qnorm(0.95)
## [1] 1.644854
qnorm(0.05)
## [1] -1.644854
Все то же самое можно рассчитать и для биномиального распределения. Если мы хотим посчитать вероятность того, что количество успехов в серии испытаний Бернулли не превысит некоторого значения, нам потребуется функция pbinom(q, size, prob), где аргумент size задает количество испытаний, а prob – вероятность успеха в однократном испытании.
Пускай мы подбрасываем правильную монетку 5 раз, и нас интересует, с какой вероятностью мы получим не более двух орлов:
pbinom(2, 5, 0.5)
## [1] 0.5
Для того, чтобы посчитать вероятность точного числа успехов, нам понадобится функция dbinom(). Ровно два орла в серии из пяти подбрасываний выпадут с вероятностью:
dbinom(2, 5, 0.5)
## [1] 0.3125