R. Описательная статистика

В этой и последующих статьях я буду приводить примеры решения реальных задач в среде R. Сами задачи будут взяты из широко известной книги С. Гланца "Медико-биологическая статистика". Предполагается, что книга эта у вас уже есть, и перед решением задач вы прочли соответствующую главу. Каждой главе книги будет посвящена отдельная статья с решением задач в R. Мне кажется, что это самый лучший способ изучить этот язык.

Данная статья посвящена описательной статистике, т.е. задания будут взяты из второй главы книги. Все, что нам потребуется (среднее арифметическое, стандартное отклонение, медиана, процентили), можно легко вычислить, используя R.

Но сначала надо установить R на свой компьютер. На официальном сайте вы можете скачать дистрибутив. Подробно процесс установки описан в руководствах, на сайте программы, и есть даже скринкаст с описанием процесса получения и инсталляции приложения в Windows. Поэтому я не стану описывать этот этап работы, а перейду непосредственно к вычислениям.

Как уже говорилось ранее, работа ведется в командной строке. При запуске среды R выводится следующее сообщение:

R version 2.9.0 (2009-04-17)  Copyright (C) 2009 The R Foundation for Statistical Computing  ISBN 3-900051-07-0
R -- это свободное ПО, и оно поставляется безо всяких гарантий.  Вы вольны распространять его при соблюдении некоторых условий.  Введите 'license()' для получения более подробной информации.
R -- это проект, в котором сотрудничает множество разработчиков.  Введите 'contributors()' для получения дополнительной информации и 'citation()' для ознакомления с правилами упоминания R и его пакетов  в публикациях.
Введите 'demo()' для запуска демонстрационных программ, 'help()' -- для  получения справки, 'help.start()' -- для доступа к справке через браузер.  Введите 'q()', чтобы выйти из R.


В следующей строке после которого стоит символ ">", обозначающий приглашение системы для ввода команд. Итак, приступим.

Задача 2.1.

Для решения этой задачи нам потребуется создать переменную, содержащую значения выборки. В R для этого используется вектор. Вектор – это переменная, содержащая одно или более значений одного типа. В языке R вектор является простейшей структурой, на основе которой строятся более сложные: матрицы, массивы, таблицы данных. Можно сказать, что R оперирует векторами при вычислениях. Даже если переменная содержит только одно значение, это все равно вектор – просто размер его равен единице.

> x<-c(0, 0, 0, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 6, 7, 9, 10, 11)


Только что я дал команду создать вектор x, содержащий указанные значения. Разберем ее подробнее. Первый символ (x) – имя вектора. После имени вектора идет оператор присваивания "<-". А за ним функция с(). Эта функция объединяет набор значений, переданных ей в качестве аргументов, в один вектор. Аргументами с() являются значения выборки из условия задачи.

Следует отметить, что синтаксис языка R чувствителен к регистру. Это значит, что строчные и прописные буквы воспринимаются не как один и тот же символ, а как разные. Это условие распространяется на все: названия переменных, названия функций и команд. Возможно, пользователям Windows, не привыкшим делать различия между буквами в разном регистре, это покажется странным, но придется привыкнуть.

Чтобы просмотреть значения вектора x, достаточно ввести его в строку и нажать Enter:

> x
[1]  0  0  0  1  1  1  1  1  1  1  1  1  1  1  2  2  2  2  3  3  3  3  4  4  5
[26] 5  5  5  6  7  9 10 11


Непонятные цифры в квадратных скобках – это порядковые номера элементов вектора, с которых начинается данная строка. Кстати, если вы введете X в верхнем регистре, то получите сообщение об ошибке.

Чтобы узнать размер вектора, можно воспользоваться следующей функцией:

> length(x)
[1] 33


По условию задачи нам требуется вычислить среднее арифметическое:

> sum(x)/length(x)
[1] 3.090909


Как вы, наверное, уже догадались, функция sum(x) вычисляет сумму всех значений вектора x. Затем мы разделили эту сумму на количество наблюдений (размер вектора) и получили среднее арифметическое.

Только не думайте, что все искомые показатели мы будем вычислять подобных образом. Все-таки, среда R – это не калькулятор, хотя ее можно использовать и таким образом. И вместо нудного и долгого тыканья в клавиатуру можно просто сделать следующее:

> mean(x)
[1] 3.090909


И получаем тот же результат:)

Теперь вычислим стандартное отклонение и медиану:

> sd(x)
[1] 2.887079
> median(x)
[1] 2


До сих пор все было крайне просто. Для вычисления процентилей (25-го и 75-го) нам потребуется чуть-чуть больше знаний:

> quantile(x, probs=c(0.25,0.75))
25% 75%
1   5


В функции quantile() аргументом становится не только вектор x, но и какие-то странные буквы и цифры. Если мы передадим функции только переменную x, то получим такой результат:

> quantile(x)
0% 25% 50% 75% 100%
0  1   2   5   11


Но поскольку мы ищем только 25 и 75 процентили, то результаты, которые выдает функция по умолчанию, несколько избыточны. Чтобы уточнить, что именно нас интересует, необходимо указать параметр probs, который является вектором, содержащим необходимые значения. В данном примере это 0,25 и 0,75. Обратите внимание, что в R разделителем десятичных дробей является точка, а не запятая.

Естественно, что запомнить все необходимые аргументы функций просто невозможно. Но этого и не нужно. Для получения информации по той или иной функции существует справочная система. Команда help позволяет получить справку следующим образом:

> help(quantile)


или так:

> ?quantile


Если вы хотите найти справку по названию, содержащему специальные символы, следует использовать двойные кавычки:

> help("[[")


Если вы не помните или не знаете точного названия функции, можно воспользоваться командой help.search. Допустим, вы забыли, как надо вычислять квартили. Тогда введите команду:

> help.search("quartile")


или:

> ??"quartile"


В ответ вы получите список функций. Одна из них – quantile().

При отображении справки среда R переходит в специальный режим, не позволяющий проводить расчеты. Чтобы вернуться обратно в режим расчетов, надо нажать клавишу Q.

Но вернемся к задаче. Взгляните на ее решение:

> x<-c(0, 0, 0, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 6, 7, 9, 10, 11)
> mean(x)
[1] 3.090909
> sd(x)
[1] 2.887079
> median(x)
[1] 2
> quantile(x, probs=c(0.25, 0.75))
25% 75%
1   5


Довольно просто, но можно сделать еще проще. Например, так:

> summary(x)
 Min.  1st Qu.  Median   Mean 3rd Qu.    Max.
0.000    1.000   2.000  3.091   5.000  11.000
> sd(x)
[1] 2.887079


Вот так одна функция summary() может дать общее представление о характере выборки. Здесь 25 и 75 процентили обозначены как первый и третий квартили.

Что касается вопроса о нормальности, то существуют разные способы оценки характера распределения, и они реализованы в R. Однако наша задача подразумевает сравнение среднего и медианы с учетом разброса данных. Думаю, вы и сами с этим справитесь. Компьютер здесь не нужен.

Задача 2.2.

Задача аналогична предыдущей. Решим ее.

> c(289, 203, 359, 243, 232, 210, 251, 246, 224, 239, 220, 211)->x
> summary(x)
 Min.  1st Qu.  Median   Mean  3rd Qu.  Max.
203.0    217.8   235.5  243.9    247.2 359.0
> sd(x)
[1] 43.03795


Однако если вы попытаетесь вычислить процентили так, как это указано в книге, и сравнить с результатами R, то будете удивлены. Цифры будут отличаться от приведенных. Но почему?

Дело в том, что вычисление квантилей может проводиться разными способами. Расчет квантилей в R (и в других программах) проводится не совсем так, как это описано в книге Гланца. В среде R реализовано девять методов вычисления квантилей: три для дискретных распределений и шесть для непрерывных. Суть методов в использовании линейной интерполяции между k-м по счету значением и p(k). А вот способов расчета p(k) несколько. И каждый из них имеет свои особенности. Более подробную информацию смотрите в справке к функции quantile().

Кстати, вопрос о характере распределения я опять оставляю для вас.

Задача 2.3.

> x<-c(1.2, 1.4, 1.6, 1.7, 1.7, 1.8, 2.2, 2.3, 2.4, 6.4, 19.0, 23.6)
> summary(x)
 Min.  1st Qu.  Median   Mean  3rd Qu.    Max.
1.200    1.675   2.000  5.442    3.400  23.600
> sd(x)
[1] 7.59455


Думаю, здесь все понятно. Распределение явно не нормальное.

Задача 2.4.

Поскольку все значения игральной кости выпадают с равной вероятностью, следовательно, распределение равномерное. Подсчитаем среднее арифметическое:

> x<-1:6
> mean(x)
[1] 3.5


Здесь показан еще один способ создания вектора путем задания последовательности от 1 до 6 с шагом, равным единице. Подробности смотрите в справке по оператору ":".

Задача 2.5.

Игральных костей у меня нет, поэтому симулирую их в R.

> a<-sample(1:6, size=40, replace=TRUE)


Функция sample() создает из значений вектора случайную последовательность. Параметр size задает количество элементов в итоговом векторе, а параметр replace – разрешает или запрещает повторное использование элементов исходного вектора.

Кстати, формат вызова функций в R достаточно свободен. Если требуется задать несколько аргументов, то вовсе не обязательно соблюдать строгий порядок в их очередности. Достаточно указать имя аргумента (его всегда можно найти в справке), чтобы интерпретатор R сам разобрался, что к чему относится. Но если вы не указали имен параметров, то тогда очередность нарушать нельзя.

> a<-sample(1:6, 40, TRUE)


Сейчас в векторе a содержатся сорок результатов "бросаний кости". По условию задачи мы должны бросить две кости двадцать раз подряд. Но поскольку результат бросания каждой кости не зависит от других, мы разобьем сорок бросков на двадцать серий по два броска.

> A<-matrix(a, nrow=2)


Только что мы создали матрицу размером 2*20 (2 строки и 20 столбцов). Функция matrix() создает из вектора a матрицу A с двумя строками (nrow=2). В нашем случае каждый столбец – это одна серия бросания кубиков.

Теперь необходимо рассчитать средние для каждой серии, т.е. каждого столбца:

> A.means<-colMeans(A)


Функция colMeans() вычисляет средние для каждого столбца матрицы A и выдает их в виде вектора. Кстати, обратите внимание на написание имени функции: если вы введете colmeans(), то получите сообщение об ошибке.

Еще одно новшество можно заметить и в имени переменной. Согласно синтаксису R, в именах переменных можно использовать точки, что позволяет делать их более понятными.

Теперь вычислим среднее и стандартное отклонение для вектора A.means:

> summary(A.means)
 Min. 1st Qu.  Median    Mean  3rd Qu.    Max.
1.500   2.500   3.500   3.475    4.500   5.500
> sd(A.means)
[1] 1.186270


Распределение близко к нормальному.

Задача 2.6.

В этой задаче я продемонстрирую простейший способ использования графических функций R.

Создадим два вектора:

> means<-c(2, 2.3, 2.8, 4.9)
> years<-seq(1946,1976,10)


Вектор means содержит средние значения, years – года. Обратите внимание на новую функцию seq(). Смысл ее таков: "Создать последовательность значений от 1946 до 1976 с шагом в 10".

Ну и сам график:

> plot(means,years)

Все, работа закончена. Теперь надо ввести команду q(), а на вопрос системы ответить n:

> q()
Save workspace image? [y/n/c]:  n


Подведем итоги. В данной статье я показал, как создаются переменные, вычисляются описательные статистики и формируются графики. Сразу скажу, что способ создания переменных, показанный здесь, не подходит для большого количества значений. Согласитесь, вводить большие таблицы в командную строку будет очень неудобно. Поэтому в R реализованы способы получения данных из внешних файлов (в т.ч. из Excel) и даже баз данных. То же касается и графиков. Пока вы увидели только простейший способ их создания. Более продвинутые варианты будут рассмотрены в следующих статьях.

03.04.2019 / 122 / Загрузок: 0 / Ришат Габидуллин / | Теги: статистика, язык R
Всего комментариев: 0
avatar
SixSigmaOnline.ru © 2009-2019            Хостинг от uWeb