Язык R
и его применение в биоинформатике
Лекция 11
Анастасия Жарикова
15 ноября 2024
Проблема
Разобранные подходы (какие?) исследования взаимосвязи двух переменных не применимы, если одна из переменных является категориальным признаком
Что же делать?
Категориальные признаки
Больной |
25 |
11 |
Здоровый |
32 |
48 |
Связан ли статус курения с наличием заболевания?
\(\chi^{2}\) - тест на сопряженность
\(H_{0}\): связи нет
\(H_{1}\): связь есть
\(\chi^{2}\) - тест на сопряженность
Больной |
25 |
11 |
Больного: 36 / 116 |
Здоровый |
32 |
48 |
Здорового 80 / 116 |
Вероятность встретить |
Курящего: 57 / 116 |
Некурящего: 59 / 116 |
Всего: 116 |
\(\chi^{2}\) - тест на сопряженность
Больной |
0.31 * 0.59 |
0.31 * 0.51 |
Больного: 0.31 |
Здоровый |
0.68 * 0.49 |
0.68 * 0.51 |
Здорового 0.68 |
Вероятность встретить |
Курящего: 0.49 |
Некурящего: 0.51 |
Всего: 116 |
\(\chi^{2}\) - тест на сопряженность
При условии верности нулевой гипотезы
Рассчитаем ожидаемое количество людей
Возьмем выборку из 116 человек
Больной |
0.18 * 116 |
0.16 * 116 |
Здоровый |
0.33 * 116 |
0.35 * 116 |
\(\chi^{2}\) - тест на сопряженность
Больной |
25 |
11 |
Здоровый |
32 |
48 |
Больной |
20.88 |
18.56 |
Здоровый |
46.4 |
40.6 |
Можно посчитать некоторую статистику - \(\chi^{2}\)
\(\chi^{2}\)
Статистика \(\chi^{2}\) распределена согласно распределению \(\chi^{2}\) с числом степеней свободы: 1
Ожидаемое число в каждой ячейке должно быть не менее 5
\(\chi^{2}\) - тест на сопряженность
Односторонний критерий
Интересны случаи, когда статистика больше критического значения
ref
Таблица 2х2
library(vcd)
data1 <- as.table(matrix(c(25, 32, 11, 48), 2, 2))
data1
dimnames(data1) <- list(Measurement_1 = c("Больной", "Здоровый"),
Measurement_2 = c("Курит", "Не курит"))
data1
Measurement_2
Measurement_1 Курит Не курит
Больной 25 11
Здоровый 32 48
chisq.test
Pearson's Chi-squared test with Yates' continuity correction
data: data1
X-squared = 7.4747, df = 1, p-value = 0.006257
Таблица 2х2 (%)
percentages <- round(100*prop.table(data1), 2)
percentages
Measurement_2
Measurement_1 Курит Не курит
Больной 21.55 9.48
Здоровый 27.59 41.38
Таблица 2х2 (%)
etiquettes <- as.table(matrix(paste0(data1, "; ", percentages, "%"), 2, 2))
dimnames(etiquettes) <- dimnames(data1)
etiquettes
Measurement_2
Measurement_1 Курит Не курит
Больной 25; 21.55% 11; 9.48%
Здоровый 32; 27.59% 48; 41.38%
Мозаичный график
vcd::mosaic(data1,
pop = F, shade = T, colorize = T,
gp = gpar(fill = matrix(c("grey", "#756bb1", "#756bb1", "grey"), 2, 2)))
labeling_cells(text = etiquettes, margin = 0)(data1)
\(\chi^{2}\) - тест на сопряженность
Рассмотрели случай таблицы 2х2
Можно проводить и на более сложных таблицах
Связаны ли количество заболеваний ОРВИ (их много: грипп, риновирусные, коронавирусные инфекции и т.д.) с временем года (4 категории)
Проблема
Ну нет у нас столько данных, чтобы получить ожидаемые нужного размера!!!
Точный тест Фишера
Наблюдения должны быть независимы
fisher.test()
Больной |
A |
B |
A + B |
Здоровый |
C |
D |
C + D |
Всего |
A + C |
B + D |
A + B + C + D |
\[p(table) = \frac{(a + b)!(c + d)!(a + c)!(b + d)!}{a!b!c!d!}\]
Точный тест Фишера
Получили вероятность конкретной таблицы
Можно рассмотреть всевозможные таблицы, перекошенные также как наша таблица или еще больше в ту или другую сторону
Для каждой такой таблицы считаем вероятность
Складываем вероятности
Получаем p-value
Решаем, есть ли основание отклонить нулевую гипотезу
Форма связи между переменными
cars <- mtcars[, 1:7]
head(cars)
mpg cyl disp hp drat wt qsec
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02
Datsun 710 22.8 4 108 93 3.85 2.320 18.61
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02
Valiant 18.1 6 225 105 2.76 3.460 20.22
pairs(cars, panel = panel.smooth)
library(GGally)
ggpairs( cars )
Вспомним t-test
Дано: две выборки из разных нормально распределенных генеральных совокупностей
Считаем, что дисперсии генеральных совокупностей не отличаются.
Хотим сравнить средние этих генеральных совокупностей
Нулевая гипотеза: средние двух выборок не отличаются
Усложним входные данные
Мы пришли в спортзал, где есть групповые занятия по:
йоге
аэробике
тренировке на тренажерах
Хотим понять, какой вид тренировок больше способствует потере веса.
Уже три группы
Как поступить?
Давайте посравниваем попарно все группы между собой
йога vs аэробика
йога vs тренировка
…
Чем сравнить? t-test
Много t-test`ов
А еще поправка…
Вообще говоря…
Нулевая гипотеза: все средние группы равны
Альтернативная гипотеза: по крайней мере одно среднее значение группы отличается от остальных
Однофакторый дисперсионный анализ - One-Way ANOVA
Скорее всего средние значения между группами будут хоть немного, но отличаться
Насколько эти отличия значимы?
One-Way ANOVA
weight group
1 4.17 ctrl
2 5.58 ctrl
3 5.18 ctrl
4 6.11 ctrl
5 4.50 ctrl
6 4.61 ctrl
One-Way ANOVA
library(ggpubr)
ggboxplot(PlantGrowth, x = "group", y = "weight",
color = "group", palette = c("#00AFBB", "#E7B800", "#FC4E07"),
order = c("ctrl", "trt1", "trt2"),
ylab = "Weight", xlab = "Treatment")
One-Way ANOVA
ggline(PlantGrowth, x = "group", y = "weight",
add = c("mean_se", "jitter"),
order = c("ctrl", "trt1", "trt2"),
ylab = "Weight", xlab = "Treatment")
One-Way ANOVA
Предположение ANOVA
Каждая выборка была взята из нормально распределенной популяции.
Дисперсии совокупностей, из которых взяты выборки, равны
Шум в данных распределен нормально
PG$group <- factor(PG$group,
levels = c("ctrl", "trt1", "trt2"))
levels(PG$group)
library(tidyverse)
group_by(PG, group) %>%
summarise(
count = n(),
mean = mean(weight, na.rm = TRUE),
sd = sd(weight, na.rm = TRUE)
)
# A tibble: 3 × 4
group count mean sd
<fct> <int> <dbl> <dbl>
1 ctrl 10 5.03 0.583
2 trt1 10 4.66 0.794
3 trt2 10 5.53 0.443
res.aov <- aov(weight ~ group, data = PG)
summary(res.aov)
Df Sum Sq Mean Sq F value Pr(>F)
group 2 3.766 1.8832 4.846 0.0159 *
Residuals 27 10.492 0.3886
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = weight ~ group, data = PG)
$group
diff lwr upr p adj
trt1-ctrl -0.371 -1.0622161 0.3202161 0.3908711
trt2-ctrl 0.494 -0.1972161 1.1852161 0.1979960
trt2-trt1 0.865 0.1737839 1.5562161 0.0120064
pairwise.t.test(PG$weight, PG$group,
p.adjust.method = "BH")
Pairwise comparisons using t tests with pooled SD
data: PG$weight and PG$group
ctrl trt1
trt1 0.194 -
trt2 0.132 0.013
P value adjustment method: BH
Однородность дисперсий
aov_residuals <- residuals(object = res.aov )
shapiro.test(x = aov_residuals )
Shapiro-Wilk normality test
data: aov_residuals
W = 0.96607, p-value = 0.4379
kruskal.test(weight ~ group, data = PG)
Kruskal-Wallis rank sum test
data: weight by group
Kruskal-Wallis chi-squared = 7.9882, df = 2, p-value = 0.01842
Конец!