Это третья статья в серии о применении R для статистического анализа данных, в которой будут разбираться представление и тестирование количественных данных. Вы узнаете как быстро и наглядно представить данные, а также как использовать t-тест в R.
Часть 1: Бинарная классифиация
Часть 2: Анализ качественных данных
Поехали!
Для начала, я хочу еще раз привести схему из прошлой статьи:
"
Парные данные отличаются тем, что данные для тестируемых групп были получены с одних и тех же объектов. Применения для t-теста: влияние какого-либо фактора на изменение продаж/скорости работы приложения/срок службы прибора, сравнение двух групп людей на продуктивность. Если групп несколько, то для анализа используют ANOVA-модели (ANOVA — analysis of variance), о который будет рассказано в следующих статьях.
Начнем с того, как представить данные. Я использую имеющийся у меня файл одного медицинского теста, который я использовал по учебе. Кратко его опишу. Люди из двух групп, исследуемой и контрольной, делали некоторые упражнения. До и после упражнений измерялись их физиологические параметры. Мы попробуем проанализировать пульс и объем форсированного выдоха. Помимо t-тестов, я дополню предыдущую статью и покажу, как получить из чисел качественные данные. Итак:
Мы формируем дополнительный столбец с разностью пульса до и после, а также дополнительный столбец качественных данных для объема форсированного выдоха, который можно тестировать хи-квадрат тестом. Делается последнее функцией cut. В нее мы задаем данные и точки среза. На выходе:
"
Идем далее. Посчитаем средние значения и стандартные отклонения, построим наглядные графики.
Из важного хочу отметить, na.rm=T. Если в ваших данных присутствуют пустые ячейки, R самостоятельно их уберет. Иначе, вы получите ошибку. Boxplot — очень хороший метод для визуализации выборки. Он показывает максимум и минимум, среднее значение, а также квантили вероятности 25 и 75 процентов.
![](http://habrastorage.org/r/w1560/storage2/58a/6f8/7c6/58a6f87c6b96c125d3e11c645d5b9981.png)
Теперь поговорим о разнице для парных и независимых данных с точки зрения статистики. В случае независимых данных, для анализа используется следующий доверительный интервал:
![](http://habrastorage.org/r/w1560/storage2/f32/df3/86f/f32df386fdef33ce6f4c7b53f6d3c787.png)
Среднее значение тут разность средних каждой выборки, а стандартное отклонение вычисляется по специальной формуле для разности.
В случае парных данных, мы вычитаем значения попарно и получаем новую выборку, у которой находим свое среднее значение и стандартное отклонение. Доверительный интервал:
![](http://habrastorage.org/r/w1560/storage2/f20/7b5/18c/f207b518cc95e1464263e3b5c65f79e6.png)
Тут мы смотрим на различия между пульсом до и после в одной группе. Можно использовать t.test двумя способами, либо посылая туда разность, либо два массива данных.
"
Выводы: в группе 0 нет разницы до и после, в группе 1 разница есть, т.к. p-значение много меньше 5%.
Тут мы анализируем разницу между группами. Данные независимые. Строго говоря, R использует тест Уелча, что немного отличается от обычного t-теста. Тест Уелча является более точным, они сходятся при большом размере выборки.
"
Выводы: разница между группам существенная, т.к. p-значение много меньше 5%.
Тут мы сравниваем объем форсированного выдоха у мужчин и женщин.
Таблица (из R gui, в RStudio у меня лично таблицы немного некорректно отображаются):
"
Результаты:
"
Тут мы применили целых три теста, по возростанию сложности и точности. Я еще раз рекомендую пользоваться тестом Фишера, но имейте в виду и эти. Выводы: тесты дали разные результаты, однако p-значение все равно очень маленькое. Группы отличаются между собой.
Итак, сегодня мы рассмотрели примеры использования тестов. Данной информации достаточно, чтобы проводить достаточно качественные статистические исследования. Эти методы можно применять в любых областях. Их использование убережет вас от ошибок, позволит объективно оценить свою работу и предоставлять другим людям объективно достоверную информацию. Есть еще несколько тем, которые я хочу осветить, касающиеся оценки необходимого размера выборки, доказательства равенства случайных величин и ANOVA-моделей.
Часть 1: Бинарная классифиация
Часть 2: Анализ качественных данных
Поехали!
Для начала, я хочу еще раз привести схему из прошлой статьи:
![](https://habrastorage.org/storage2/87e/eb1/6e2/87eeb16e2212fa3a212c3aa3f02cf904.png)
Парные данные отличаются тем, что данные для тестируемых групп были получены с одних и тех же объектов. Применения для t-теста: влияние какого-либо фактора на изменение продаж/скорости работы приложения/срок службы прибора, сравнение двух групп людей на продуктивность. Если групп несколько, то для анализа используют ANOVA-модели (ANOVA — analysis of variance), о который будет рассказано в следующих статьях.
Представление данных перед анализом
Начнем с того, как представить данные. Я использую имеющийся у меня файл одного медицинского теста, который я использовал по учебе. Кратко его опишу. Люди из двух групп, исследуемой и контрольной, делали некоторые упражнения. До и после упражнений измерялись их физиологические параметры. Мы попробуем проанализировать пульс и объем форсированного выдоха. Помимо t-тестов, я дополню предыдущую статью и покажу, как получить из чисел качественные данные. Итак:
tab <- read.csv(file="data1.csv", header=TRUE, sep=",", dec=".")
attach(tab)
tab
tab <- cbind(tab, pulsediff=pulse2-pulse1,
FEVcut2.5=cut(FEV1_1, c(0,2.5,max(FEV1_1)+0.1)))
str(tab)
detach(tab)
attach(tab)
Мы формируем дополнительный столбец с разностью пульса до и после, а также дополнительный столбец качественных данных для объема форсированного выдоха, который можно тестировать хи-квадрат тестом. Делается последнее функцией cut. В нее мы задаем данные и точки среза. На выходе:
![](http://habrastorage.org/storage2/4b4/7e5/e04/4b47e5e0482c7ad9bf8f7597edea3320.png)
Идем далее. Посчитаем средние значения и стандартные отклонения, построим наглядные графики.
mean(pulsediff[group==0], na.rm=T)
mean(pulsediff[group==1], na.rm=T)
sd(pulsediff[group==0], na.rm=T)
sd(pulsediff[group==1], na.rm=T)
boxplot(pulsediff~group,
main="Distribution of pulse difference stratified by group",
names=c("control-group", "exercise-group"),
ylab="pulse difference")
Из важного хочу отметить, na.rm=T. Если в ваших данных присутствуют пустые ячейки, R самостоятельно их уберет. Иначе, вы получите ошибку. Boxplot — очень хороший метод для визуализации выборки. Он показывает максимум и минимум, среднее значение, а также квантили вероятности 25 и 75 процентов.
![](http://habrastorage.org/storage2/58a/6f8/7c6/58a6f87c6b96c125d3e11c645d5b9981.png)
Теперь поговорим о разнице для парных и независимых данных с точки зрения статистики. В случае независимых данных, для анализа используется следующий доверительный интервал:
![](http://habrastorage.org/storage2/f32/df3/86f/f32df386fdef33ce6f4c7b53f6d3c787.png)
Среднее значение тут разность средних каждой выборки, а стандартное отклонение вычисляется по специальной формуле для разности.
В случае парных данных, мы вычитаем значения попарно и получаем новую выборку, у которой находим свое среднее значение и стандартное отклонение. Доверительный интервал:
![](http://habrastorage.org/storage2/f20/7b5/18c/f207b518cc95e1464263e3b5c65f79e6.png)
Применение тестов в R
#Paired data
#approach 1:
t.test(pulsediff[group==1])
t.test(pulsediff[group==0])
#approach 2:
t.test(pulse1[group==1], pulse2[group==1], paired=T)
t.test(pulse1[group==0], pulse2[group==0], paired=T)
Тут мы смотрим на различия между пульсом до и после в одной группе. Можно использовать t.test двумя способами, либо посылая туда разность, либо два массива данных.
![](http://habrastorage.org/storage2/d79/249/bf8/d79249bf88806039cc26d2185c4e35fd.png)
Выводы: в группе 0 нет разницы до и после, в группе 1 разница есть, т.к. p-значение много меньше 5%.
#Unpaired data
t.test(pulsediff~group)
Тут мы анализируем разницу между группами. Данные независимые. Строго говоря, R использует тест Уелча, что немного отличается от обычного t-теста. Тест Уелча является более точным, они сходятся при большом размере выборки.
![](http://habrastorage.org/storage2/8a9/932/ab1/8a9932ab1f7ac15f13b7982172216c11.png)
Выводы: разница между группам существенная, т.к. p-значение много меньше 5%.
#Descriptive analysis:
library(prettyR)
str(FEVcut2.5)
str(sex)
xtab(sex~FEVcut2.5, data=tab)
#Inferential analysis:
chisq.test(table(sex, FEVcut2.5), correct=F)
#ADD:
chisq.test(table(sex, FEVcut2.5))
fisher.test(table(sex, FEVcut2.5))
Тут мы сравниваем объем форсированного выдоха у мужчин и женщин.
Таблица (из R gui, в RStudio у меня лично таблицы немного некорректно отображаются):
![](http://habrastorage.org/storage2/d42/5ca/98e/d425ca98e1d03738fe84970f5fa4a4dc.png)
Результаты:
![](http://habrastorage.org/storage2/e44/1ef/646/e441ef6469457223024a8ea7f7799303.png)
Тут мы применили целых три теста, по возростанию сложности и точности. Я еще раз рекомендую пользоваться тестом Фишера, но имейте в виду и эти. Выводы: тесты дали разные результаты, однако p-значение все равно очень маленькое. Группы отличаются между собой.
Итоги
Итак, сегодня мы рассмотрели примеры использования тестов. Данной информации достаточно, чтобы проводить достаточно качественные статистические исследования. Эти методы можно применять в любых областях. Их использование убережет вас от ошибок, позволит объективно оценить свою работу и предоставлять другим людям объективно достоверную информацию. Есть еще несколько тем, которые я хочу осветить, касающиеся оценки необходимого размера выборки, доказательства равенства случайных величин и ANOVA-моделей.