\documentclass[a4paper, 11pt]{article}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}
\usepackage{indentfirst}
\frenchspacing
\usepackage{geometry}
\geometry{left=2cm, right=1.5cm, top=2cm, bottom=1.5cm}
\usepackage{soul}
\usepackage{amsmath,amsfonts,amssymb,amsthm,mathtools,bm}
\usepackage{icomma}
\usepackage{etoolbox}
\usepackage{enumitem}
\usepackage{lastpage}
\usepackage{url}
\begin{document}
<<setup, include=FALSE, cache=FALSE>>=
library(knitr)
opts_chunk$set(cache=TRUE, autodep=TRUE)
options(formatR.arrow=TRUE, width=90)
@
\title{Основы работы с R. Обработка статистических данных}
\author{Варвара Кожухова}
\maketitle
\section*{Задание}
\begin{enumerate}
\item Загрузить данные для своего варианта в переменную-вектор.
\item Получить справочную информацию по своим данным, просмотреть их содержимое.
\item Проверить, есть ли среди данных пропуски.
\item Создать новую переменную-вектор, в которой будут 1, если значение в исходном векторе больше среднего, и –1 если значение переменной меньше среднего и 0 если значение равно среднему.
\item Вывести описательную статистику.
\item Построить графики абсолютных частот и плотности распределения.
\end{enumerate}
\section*{Варианты}
\noindent \begin{tabular}{|l|c|c|c|c|c|c|c|c|c|c|} \hline
№ варианта & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 & 9 & 10 \\ \hline
Набор данных & \multicolumn{2}{|c|}{CO2} & \multicolumn{2}{|c|}{ChickWeight} & \multicolumn{2}{|c|}{Orange} & \multicolumn{2}{|c|}{airquality} & \multicolumn{2}{|c|}{faithful} \\ \hline
Имя вектора & conc & uptake & weight & Time & age & circumference & Wind & Temp & eruptions & waiting \\ \hline
\end{tabular}
\section*{Первые шаги в R}
Рассмотрим основные выражения в R: числа, строки и логические переменные. Можно использовать R как калькулятор, например:
<<calc-R>>=
1+1
6*7
sqrt(16)
@
Строки печатаются в кавычках: двойных или одинарных.
<<string-simple>>=
"Hello world!"
'Hello world!'
@
Логические выражения возвращают TRUE или FALSE. Чтобы сравнить два выражения, используется двойной знак равенства. Как и в других языках программирования, можно сохранять значения в переменную. Сохраним 42 в переменную $x$, а 5 -- в переменную $X$, но в обратную сторону. Можно так же повторно назначить любое значение переменной в любое время. R чувствителен к регистру: переменные $x$ и $X$ – это разные переменные.
<<logic>>=
3 < 4
2 + 2 == 5
x <- 42
5 -> X
@
Чтобы вызвать функцию, нужно обратиться к ней по имени, указав в скобках нужные аргументы.
<<func>>=
sum(1, 3, 5)
@
Получить помощь по функции можно командой help(functionname) или ?functionname.
Зададим вектор $y$ с помощью функции c (сокр. от англ. Combine). NA – это пропущенное наблюдение (от англ. Not Available). Его не следует путать с NaN (Not a Number – «не число», неопределенность). Попробуем просуммировать элементы вектора $y$. Необязательным аргументом функции sum является na.rm (сокр. от англ. Remove NA), по умолчанию равный FALSE. Если указать для него значение «истина», то функция суммы будет складывать все элементы вектора, исключая пропущенные.
<<vector1>>=
y <- c(-3, 2, NA, 5)
y
0/0
sum(y); sum(y, na.rm = TRUE)
@
Последовательность чисел можно задать двумя способами: start:end либо функцией seq(). Обращаться к элементам вектора можно, используя квадратные скобки, либо можно задать элементам вектора имена.
<<seqs1>>=
5:9 ; seq(5,9)
seq(10,50, by = 10)
sentence <- c('mack', 'the', 'knife')
sentence[3]
sentence[c(1,3)]
ranks <- 1:3
names(ranks) <- c("first", "second", "third")
ranks
ranks["first"]
@
В основном в R работают с наборами данных. Такая структура носит в R название data.frame и представляет собой таблицу, в которой каждый столбец – это некоторая переменная, а каждая строка – это одно наблюдение. Создадим в режиме скрипта data.frame. Пусть имеются наблюдения за ростом и весом некоторых людей. Зададим два вектора:
<<vectors2>>=
rost <- c(160, 175, 155, 190, NA)
ves <- c(NA, 70, 48, 85, 60)
@
И объединим их в набор данных, который поместим в переменную df, а затем выведем на экран. Обращаться к конкретным наблюдениям df можно, используя квадратные скобки.
<<df1>>=
df <- data.frame(rost, ves)
df
df[3,1]
@
Обращаться к переменным можно, используя знак \$ или указывая столбец с пропуском номера строки.Обращаться к наблюдениям можно, указывая конкретную строку и пропуская номер столбца.
<<df2>>=
df$rost
df[ ,1] ; df[4,]
@
Основные описательные статистики (среднее, стандартное отклонение и медиану) можно получить с помощью функций mean, sd и median.
<<df3>>=
mean(df$rost, na.rm = T)
sd(df$rost, na.rm = T)
median(df$rost, na.rm = T)
@
Подключим дополнительные пакеты для работы со статистикой.
<<libs, message=FALSE>>=
library("psych")
library("lmtest")
library("ggplot2")
library("dplyr")
library("MASS")
@
Поместим в переменную $d$ встроенный в R набор данных по автомобилям. В этом наборе данных 50 наблюдений и две переменных (скорость, миль/час и длина тормозного пути в футах). Теперь d имеет тип данных data.frame (набор данных). Командой glimpse можно посмотреть на этот набор данных, в результате чего будут перечислены все переменные и типы данных. Переменные speed и dist имеют тип данных dbl (double) и содержат по 50 наблюдений. Для других типов данных используются следующие сокращения: chr (character/string), int (integer), fctr (factor), tims (time), lgl (logical).
<<cars1>>=
d <- cars
glimpse(d)
@
Посмотрим на первые шесть и последние шесть наблюдений набора данных d ("голова" и "хвост" набора данных).
<<cars2>>=
head(d)
tail(d)
@
Получим таблицу с описательными статистиками: среднее, мода, медиана, стандартное отклонение, минимум/максимум, асимметрия, эксцесс и т.д.
<<cars3>>=
describe(d)
@
Построим гистограмму абсолютных частот для переменной dist (длины тормозного пути).
Воспользуемся функцией qplot, задав источник данных d (аргумент data), переменную для построения графика (dist), подпишем оси (параметры функции xlab и ylab) и название графика (параметр main).
<<cars4, warning=FALSE, fig.width=3, fig.height=3>>=
qplot(data=d, dist)
@
Можно построить так же гистограмму плотности распределения.
<<cars5, warning=FALSE, fig.width=4, fig.height=4>>=
p <- hist(d$dist, probability = TRUE, col="grey")
@
Подгоним плотность распределения Вейбулла, поместив результат (оценки параметров распределения) в переменную fit. Переменная fit теперь представляет собой список (List) из 5 элементов. Доступ к элементам списка можно получить через значок доллара \$. Оценки двух параметров распределения Вейбулла были рассчитаны методом максимального правдоподобия. Просмотрим их, обратившись к элементу списка fit.
<<cars6>>=
fit <- fitdistr(d$dist, "weibull")
fit$estimate
@
Покажем на том же графике теоретическую плотность распределения Вейбулла.
Первый аргумент функции lines – это значения по оси абсцисс, на основе которых будет построен график. Далее указывается функция плотности dweibull. Для нее нужно указать значения аргумента для расчета и значения двух параметров распределения: коэффициент формы (shape) и масштаба (scale).
<<cars7, fig.width=4, fig.height=4>>=
p <- hist(d$dist, probability = TRUE, col="grey")
xvals <- seq(0, 120, .20)
lines(xvals, dweibull(xvals, shape=fit$estimate[1], scale=fit$estimate[2]))
@
\end{document}