\documentclass[a4paper, 11pt]{article}\usepackage[]{graphicx}\usepackage[]{color}
\makeatletter
\def\maxwidth{
\ifdim\Gin@nat@width>\linewidth
\linewidth
\else
\Gin@nat@width
\fi
}
\makeatother
\definecolor{fgcolor}{rgb}{0.345, 0.345, 0.345}
\newcommand{\hlnum}[1]{\textcolor[rgb]{0.686,0.059,0.569}{#1}}
\newcommand{\hlstr}[1]{\textcolor[rgb]{0.192,0.494,0.8}{#1}}
\newcommand{\hlcom}[1]{\textcolor[rgb]{0.678,0.584,0.686}{\textit{#1}}}
\newcommand{\hlopt}[1]{\textcolor[rgb]{0,0,0}{#1}}
\newcommand{\hlstd}[1]{\textcolor[rgb]{0.345,0.345,0.345}{#1}}
\newcommand{\hlkwa}[1]{\textcolor[rgb]{0.161,0.373,0.58}{\textbf{#1}}}
\newcommand{\hlkwb}[1]{\textcolor[rgb]{0.69,0.353,0.396}{#1}}
\newcommand{\hlkwc}[1]{\textcolor[rgb]{0.333,0.667,0.333}{#1}}
\newcommand{\hlkwd}[1]{\textcolor[rgb]{0.737,0.353,0.396}{\textbf{#1}}}
\let\hlipl\hlkwb
\usepackage{framed}
\makeatletter
\newenvironment{kframe}{
\def\at@end@of@kframe{}
\ifinner\ifhmode
\def\at@end@of@kframe{\end{minipage}}
\begin{minipage}{\columnwidth}
\fi\fi
\def\FrameCommand##1{\hskip\@totalleftmargin \hskip-\fboxsep
\colorbox{shadecolor}{##1}\hskip-\fboxsep
\hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}
\MakeFramed {\advance\hsize-\width
\@totalleftmargin\z@ \linewidth\hsize
\@setminipage}}
{\par\unskip\endMakeFramed
\at@end@of@kframe}
\makeatother
\definecolor{shadecolor}{rgb}{.97, .97, .97}
\definecolor{messagecolor}{rgb}{0, 0, 0}
\definecolor{warningcolor}{rgb}{1, 0, 1}
\definecolor{errorcolor}{rgb}{1, 0, 0}
\newenvironment{knitrout}{}{}
\usepackage{alltt}
\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}
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\begin{document}
\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 как калькулятор, например:
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlnum{1}\hlopt{+}\hlnum{1}
\end{alltt}
\begin{verbatim}
## [1] 2
\end{verbatim}
\begin{alltt}
\hlnum{6}\hlopt{*}\hlnum{7}
\end{alltt}
\begin{verbatim}
## [1] 42
\end{verbatim}
\begin{alltt}
\hlkwd{sqrt}\hlstd{(}\hlnum{16}\hlstd{)}
\end{alltt}
\begin{verbatim}
## [1] 4
\end{verbatim}
\end{kframe}
\end{knitrout}
Строки печатаются в кавычках: двойных или одинарных.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlstr{"Hello world!"}
\end{alltt}
\begin{verbatim}
## [1] "Hello world!"
\end{verbatim}
\begin{alltt}
\hlstr{'Hello world!'}
\end{alltt}
\begin{verbatim}
## [1] "Hello world!"
\end{verbatim}
\end{kframe}
\end{knitrout}
Логические выражения возвращают TRUE или FALSE. Чтобы сравнить два выражения, используется двойной знак равенства. Как и в других языках программирования, можно сохранять значения в переменную. Сохраним 42 в переменную $x$, а 5 -- в переменную $X$, но в обратную сторону. Можно так же повторно назначить любое значение переменной в любое время. R чувствителен к регистру: переменные $x$ и $X$ – это разные переменные.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlnum{3} \hlopt{<} \hlnum{4}
\end{alltt}
\begin{verbatim}
## [1] TRUE
\end{verbatim}
\begin{alltt}
\hlnum{2} \hlopt{+} \hlnum{2} \hlopt{==} \hlnum{5}
\end{alltt}
\begin{verbatim}
## [1] FALSE
\end{verbatim}
\begin{alltt}
\hlstd{x} \hlkwb{<-} \hlnum{42}
\hlnum{5} \hlkwb{->} \hlstd{X}
\end{alltt}
\end{kframe}
\end{knitrout}
Чтобы вызвать функцию, нужно обратиться к ней по имени, указав в скобках нужные аргументы.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlkwd{sum}\hlstd{(}\hlnum{1}\hlstd{,} \hlnum{3}\hlstd{,} \hlnum{5}\hlstd{)}
\end{alltt}
\begin{verbatim}
## [1] 9
\end{verbatim}
\end{kframe}
\end{knitrout}
Получить помощь по функции можно командой help(functionname) или ?functionname.
Зададим вектор $y$ с помощью функции c (сокр. от англ. Combine). NA – это пропущенное наблюдение (от англ. Not Available). Его не следует путать с NaN (Not a Number – «не число», неопределенность). Попробуем просуммировать элементы вектора $y$. Необязательным аргументом функции sum является na.rm (сокр. от англ. Remove NA), по умолчанию равный FALSE. Если указать для него значение «истина», то функция суммы будет складывать все элементы вектора, исключая пропущенные.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlstd{y} \hlkwb{<-} \hlkwd{c}\hlstd{(}\hlopt{-}\hlnum{3}\hlstd{,} \hlnum{2}\hlstd{,} \hlnum{NA}\hlstd{,} \hlnum{5}\hlstd{)}
\hlstd{y}
\end{alltt}
\begin{verbatim}
## [1] -3 2 NA 5
\end{verbatim}
\begin{alltt}
\hlnum{0}\hlopt{/}\hlnum{0}
\end{alltt}
\begin{verbatim}
## [1] NaN
\end{verbatim}
\begin{alltt}
\hlkwd{sum}\hlstd{(y);} \hlkwd{sum}\hlstd{(y,} \hlkwc{na.rm} \hlstd{=} \hlnum{TRUE}\hlstd{)}
\end{alltt}
\begin{verbatim}
## [1] NA
## [1] 4
\end{verbatim}
\end{kframe}
\end{knitrout}
Последовательность чисел можно задать двумя способами: start:end либо функцией seq(). Обращаться к элементам вектора можно, используя квадратные скобки, либо можно задать элементам вектора имена.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlnum{5}\hlopt{:}\hlnum{9} \hlstd{;} \hlkwd{seq}\hlstd{(}\hlnum{5}\hlstd{,}\hlnum{9}\hlstd{)}
\end{alltt}
\begin{verbatim}
## [1] 5 6 7 8 9
## [1] 5 6 7 8 9
\end{verbatim}
\begin{alltt}
\hlkwd{seq}\hlstd{(}\hlnum{10}\hlstd{,}\hlnum{50}\hlstd{,} \hlkwc{by} \hlstd{=} \hlnum{10}\hlstd{)}
\end{alltt}
\begin{verbatim}
## [1] 10 20 30 40 50
\end{verbatim}
\begin{alltt}
\hlstd{sentence} \hlkwb{<-} \hlkwd{c}\hlstd{(}\hlstr{'mack'}\hlstd{,} \hlstr{'the'}\hlstd{,} \hlstr{'knife'}\hlstd{)}
\hlstd{sentence[}\hlnum{3}\hlstd{]}
\end{alltt}
\begin{verbatim}
## [1] "knife"
\end{verbatim}
\begin{alltt}
\hlstd{sentence[}\hlkwd{c}\hlstd{(}\hlnum{1}\hlstd{,}\hlnum{3}\hlstd{)]}
\end{alltt}
\begin{verbatim}
## [1] "mack" "knife"
\end{verbatim}
\begin{alltt}
\hlstd{ranks} \hlkwb{<-} \hlnum{1}\hlopt{:}\hlnum{3}
\hlkwd{names}\hlstd{(ranks)} \hlkwb{<-} \hlkwd{c}\hlstd{(}\hlstr{"first"}\hlstd{,} \hlstr{"second"}\hlstd{,} \hlstr{"third"}\hlstd{)}
\hlstd{ranks}
\end{alltt}
\begin{verbatim}
## first second third
## 1 2 3
\end{verbatim}
\begin{alltt}
\hlstd{ranks[}\hlstr{"first"}\hlstd{]}
\end{alltt}
\begin{verbatim}
## first
## 1
\end{verbatim}
\end{kframe}
\end{knitrout}
В основном в R работают с наборами данных. Такая структура носит в R название data.frame и представляет собой таблицу, в которой каждый столбец – это некоторая переменная, а каждая строка – это одно наблюдение. Создадим в режиме скрипта data.frame. Пусть имеются наблюдения за ростом и весом некоторых людей. Зададим два вектора:
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlstd{rost} \hlkwb{<-} \hlkwd{c}\hlstd{(}\hlnum{160}\hlstd{,} \hlnum{175}\hlstd{,} \hlnum{155}\hlstd{,} \hlnum{190}\hlstd{,} \hlnum{NA}\hlstd{)}
\hlstd{ves} \hlkwb{<-} \hlkwd{c}\hlstd{(}\hlnum{NA}\hlstd{,} \hlnum{70}\hlstd{,} \hlnum{48}\hlstd{,} \hlnum{85}\hlstd{,} \hlnum{60}\hlstd{)}
\end{alltt}
\end{kframe}
\end{knitrout}
И объединим их в набор данных, который поместим в переменную df, а затем выведем на экран. Обращаться к конкретным наблюдениям df можно, используя квадратные скобки.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlstd{df} \hlkwb{<-} \hlkwd{data.frame}\hlstd{(rost, ves)}
\hlstd{df}
\end{alltt}
\begin{verbatim}
## rost ves
## 1 160 NA
## 2 175 70
## 3 155 48
## 4 190 85
## 5 NA 60
\end{verbatim}
\begin{alltt}
\hlstd{df[}\hlnum{3}\hlstd{,}\hlnum{1}\hlstd{]}
\end{alltt}
\begin{verbatim}
## [1] 155
\end{verbatim}
\end{kframe}
\end{knitrout}
Обращаться к переменным можно, используя знак \$ или указывая столбец с пропуском номера строки.Обращаться к наблюдениям можно, указывая конкретную строку и пропуская номер столбца.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlstd{df}\hlopt{$}\hlstd{rost}
\end{alltt}
\begin{verbatim}
## [1] 160 175 155 190 NA
\end{verbatim}
\begin{alltt}
\hlstd{df[ ,}\hlnum{1}\hlstd{] ; df[}\hlnum{4}\hlstd{,]}
\end{alltt}
\begin{verbatim}
## [1] 160 175 155 190 NA
## rost ves
## 4 190 85
\end{verbatim}
\end{kframe}
\end{knitrout}
Основные описательные статистики (среднее, стандартное отклонение и медиану) можно получить с помощью функций mean, sd и median.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlkwd{mean}\hlstd{(df}\hlopt{$}\hlstd{rost,} \hlkwc{na.rm} \hlstd{= T)}
\end{alltt}
\begin{verbatim}
## [1] 170
\end{verbatim}
\begin{alltt}
\hlkwd{sd}\hlstd{(df}\hlopt{$}\hlstd{rost,} \hlkwc{na.rm} \hlstd{= T)}
\end{alltt}
\begin{verbatim}
## [1] 15.81139
\end{verbatim}
\begin{alltt}
\hlkwd{median}\hlstd{(df}\hlopt{$}\hlstd{rost,} \hlkwc{na.rm} \hlstd{= T)}
\end{alltt}
\begin{verbatim}
## [1] 167.5
\end{verbatim}
\end{kframe}
\end{knitrout}
Подключим дополнительные пакеты для работы со статистикой.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlkwd{library}\hlstd{(}\hlstr{"psych"}\hlstd{)}\hlcom{# описательные статистики}
\hlkwd{library}\hlstd{(}\hlstr{"lmtest"}\hlstd{)} \hlcom{# тестирование гипотез в линейных моделях}
\hlkwd{library}\hlstd{(}\hlstr{"ggplot2"}\hlstd{)}\hlcom{# графики}
\hlkwd{library}\hlstd{(}\hlstr{"dplyr"}\hlstd{)} \hlcom{# манипуляции с данными}
\hlkwd{library}\hlstd{(}\hlstr{"MASS"}\hlstd{)} \hlcom{# подгонка распределений}
\end{alltt}
\end{kframe}
\end{knitrout}
Поместим в переменную $d$ встроенный в R набор данных по автомобилям. В этом наборе данных 50 наблюдений и две переменных (скорость, миль/час и длина тормозного пути в футах). Теперь d имеет тип данных data.frame (набор данных). Командой glimpse можно посмотреть на этот набор данных, в результате чего будут перечислены все переменные и типы данных. Переменные speed и dist имеют тип данных dbl (double) и содержат по 50 наблюдений. Для других типов данных используются следующие сокращения: chr (character/string), int (integer), fctr (factor), tims (time), lgl (logical).
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlstd{d} \hlkwb{<-} \hlstd{cars}
\hlkwd{glimpse}\hlstd{(d)}
\end{alltt}
\begin{verbatim}
## Observations: 50
## Variables: 2
## $ speed <dbl> 4, 4, 7, 7, 8, 9, 10, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 1...
## $ dist <dbl> 2, 10, 4, 22, 16, 10, 18, 26, 34, 17, 28, 14, 20, 24, 28, 26, 34, 34, 4...
\end{verbatim}
\end{kframe}
\end{knitrout}
Посмотрим на первые шесть и последние шесть наблюдений набора данных d ("голова" и "хвост" набора данных).
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlkwd{head}\hlstd{(d)}
\end{alltt}
\begin{verbatim}
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
\end{verbatim}
\begin{alltt}
\hlkwd{tail}\hlstd{(d)}
\end{alltt}
\begin{verbatim}
## speed dist
## 45 23 54
## 46 24 70
## 47 24 92
## 48 24 93
## 49 24 120
## 50 25 85
\end{verbatim}
\end{kframe}
\end{knitrout}
Получим таблицу с описательными статистиками: среднее, мода, медиана, стандартное отклонение, минимум/максимум, асимметрия, эксцесс и т.д.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlkwd{describe}\hlstd{(d)} \hlcom{# функция из пакета psych}
\end{alltt}
\begin{verbatim}
## vars n mean sd median trimmed mad min max range skew kurtosis se
## speed 1 50 15.40 5.29 15 15.47 5.93 4 25 21 -0.11 -0.67 0.75
## dist 2 50 42.98 25.77 36 40.88 23.72 2 120 118 0.76 0.12 3.64
\end{verbatim}
\end{kframe}
\end{knitrout}
Построим гистограмму абсолютных частот для переменной dist (длины тормозного пути).
Воспользуемся функцией qplot, задав источник данных d (аргумент data), переменную для построения графика (dist), подпишем оси (параметры функции xlab и ylab) и название графика (параметр main).
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlkwd{qplot}\hlstd{(}\hlkwc{data}\hlstd{=d, dist)} \hlcom{# функция из пакета ggplot2}
\end{alltt}
{\ttfamily\noindent\itshape\color{messagecolor}{\#\# `stat\_bin()` using `bins = 30`. Pick better value with `binwidth`.}}\end{kframe}
\includegraphics[width=\maxwidth]{figure/cars4-1}
\end{knitrout}
Можно построить так же гистограмму плотности распределения.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlcom{# функция из базового пакета graphics}
\hlstd{p} \hlkwb{<-} \hlkwd{hist}\hlstd{(d}\hlopt{$}\hlstd{dist,} \hlkwc{probability} \hlstd{=} \hlnum{TRUE}\hlstd{,} \hlkwc{col}\hlstd{=}\hlstr{"grey"}\hlstd{)}
\end{alltt}
\end{kframe}
\includegraphics[width=\maxwidth]{figure/cars5-1}
\end{knitrout}
Подгоним плотность распределения Вейбулла, поместив результат (оценки параметров распределения) в переменную fit. Переменная fit теперь представляет собой список (List) из 5 элементов. Доступ к элементам списка можно получить через значок доллара \$. Оценки двух параметров распределения Вейбулла были рассчитаны методом максимального правдоподобия. Просмотрим их, обратившись к элементу списка fit.
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlstd{fit} \hlkwb{<-} \hlkwd{fitdistr}\hlstd{(d}\hlopt{$}\hlstd{dist,} \hlstr{"weibull"}\hlstd{)} \hlcom{# функция из пакета MASS}
\hlstd{fit}\hlopt{$}\hlstd{estimate}
\end{alltt}
\begin{verbatim}
## shape scale
## 1.72371 48.15234
\end{verbatim}
\end{kframe}
\end{knitrout}
Покажем на том же графике теоретическую плотность распределения Вейбулла.
Первый аргумент функции lines – это значения по оси абсцисс, на основе которых будет построен график. Далее указывается функция плотности dweibull. Для нее нужно указать значения аргумента для расчета и значения двух параметров распределения: коэффициент формы (shape) и масштаба (scale).
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlstd{p} \hlkwb{<-} \hlkwd{hist}\hlstd{(d}\hlopt{$}\hlstd{dist,} \hlkwc{probability} \hlstd{=} \hlnum{TRUE}\hlstd{,} \hlkwc{col}\hlstd{=}\hlstr{"grey"}\hlstd{)}
\hlstd{xvals} \hlkwb{<-} \hlkwd{seq}\hlstd{(}\hlnum{0}\hlstd{,} \hlnum{120}\hlstd{,} \hlnum{.20}\hlstd{)} \hlcom{# значения по оси абсцисс от 0 до 120 с шагом 0,2}
\hlkwd{lines}\hlstd{(xvals,} \hlkwd{dweibull}\hlstd{(xvals,} \hlkwc{shape}\hlstd{=fit}\hlopt{$}\hlstd{estimate[}\hlnum{1}\hlstd{],} \hlkwc{scale}\hlstd{=fit}\hlopt{$}\hlstd{estimate[}\hlnum{2}\hlstd{]))}
\end{alltt}
\end{kframe}
\includegraphics[width=\maxwidth]{figure/cars7-1}
\end{knitrout}
\end{document}