Занятие 5
20 марта 2023
# A tibble: 15 × 3
sample gene expression
<chr> <chr> <dbl>
1 sample1 gene1 10
2 sample1 gene2 5
3 sample1 gene3 1
4 sample2 gene1 5
5 sample2 gene2 3
6 sample2 gene3 0
7 sample3 gene1 7
8 sample3 gene2 4
9 sample3 gene3 10
10 sample4 gene1 8
11 sample4 gene2 6
12 sample4 gene3 9
13 sample5 gene1 11
14 sample5 gene2 4
15 sample5 gene3 7
pivot_longer()
pivot_wider()
pivot_longer()
df_wide %>%
pivot_longer(
cols = gene1:gene3, # в каких столбцах нужные переменные
names_to = "gene", # название столбца с именами переменных
values_to = "expression") # название столбца со значениями переменных
# A tibble: 15 × 3
sample gene expression
<chr> <chr> <dbl>
1 sample1 gene1 10
2 sample1 gene2 5
3 sample1 gene3 1
4 sample2 gene1 5
5 sample2 gene2 3
6 sample2 gene3 0
7 sample3 gene1 7
8 sample3 gene2 4
9 sample3 gene3 10
10 sample4 gene1 8
11 sample4 gene2 6
12 sample4 gene3 9
13 sample5 gene1 11
14 sample5 gene2 4
15 sample5 gene3 7
pivot_wider()
Объедиение проискходит по одному или нескольким столбцам с “ключами”.
full_join()
- сохранить все строчки из обеих таблицinner_join()
- сохранить только строчки с общими “ключами”left_join()
- сохранить все строчки из “первой” таблицыright_join()
- сохранить все строчки из “второй” таблицыlibrary(tidyverse)
penguins <- read_csv("https://rstats-at-bio-msu.netlify.app/data/penguins.csv")
penguins
# A tibble: 344 × 8
species island bill_length_mm bill_depth_mm flipper_…¹ body_…² sex year
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
1 Adelie Torgersen 39.1 18.7 181 3750 male 2007
2 Adelie Torgersen 39.5 17.4 186 3800 fema… 2007
3 Adelie Torgersen 40.3 18 195 3250 fema… 2007
4 Adelie Torgersen NA NA NA NA <NA> 2007
5 Adelie Torgersen 36.7 19.3 193 3450 fema… 2007
6 Adelie Torgersen 39.3 20.6 190 3650 male 2007
7 Adelie Torgersen 38.9 17.8 181 3625 fema… 2007
8 Adelie Torgersen 39.2 19.6 195 4675 male 2007
9 Adelie Torgersen 34.1 18.1 193 3475 <NA> 2007
10 Adelie Torgersen 42 20.2 190 4250 <NA> 2007
# … with 334 more rows, and abbreviated variable names ¹flipper_length_mm,
# ²body_mass_g
Welch Two Sample t-test
data: adelie and chinstrap
t = -5.7804, df = 119.68, p-value = 6.049e-08
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-7.880530 -3.859244
sample estimates:
mean of x mean of y
189.9536 195.8235
annotate()
# Получили p-значение pval <- t.test(adelie, chinstrap)$p.value pval <- format(pval, digits = 3, scientific = T) penguins %>% filter(species %in% c("Adelie", "Chinstrap")) %>% ggplot(aes(x = species, y = flipper_length_mm, fill = species)) + geom_boxplot() + theme(legend.position = "none") + annotate("text", x = 1, y = 220, label = paste("T-test, p-val =", pval), size = 4)
# Получили p-значение pval <- t.test(adelie, chinstrap)$p.value pval <- format(pval, digits = 3, scientific = T) penguins %>% filter(species %in% c("Adelie", "Chinstrap")) %>% ggplot(aes(x = species, y = flipper_length_mm, fill = species)) + geom_boxplot() + theme(legend.position = "none") + annotate("text", x = 1, y = 220, label = paste("T-test, p-val =", pval), size = 4)
stat_compare_means()
из пакета ggpubr проводит тест и выводит реузльтат на графикlibrary(ggpubr) penguins %>% filter(species %in% c("Adelie", "Chinstrap")) %>% ggplot(aes(x = species, y = flipper_length_mm, fill = species)) + geom_boxplot() + theme(legend.position = "none") + stat_compare_means(method = "t.test")
library(ggpubr) penguins %>% filter(species %in% c("Adelie", "Chinstrap")) %>% ggplot(aes(x = species, y = flipper_length_mm, fill = species)) + geom_boxplot() + theme(legend.position = "none") + stat_compare_means(method = "t.test")
geom_text()
ggplot(penguin_species, aes( x = species, y = n, fill = species)) + geom_col() + geom_text(aes(label = n, y = n + 5)) + theme(legend.position = "none")
ggplot(penguin_species, aes( x = species, y = n, fill = species)) + geom_col() + geom_text(aes(label = n, y = n + 5)) + theme(legend.position = "none")
Возьмем небольшую подвыборку:
geom_text_repel()
из пакета ggrepel можно добавить надпись к точкеТест требует, чтобы ожидаемые значения были больше 5, тогда χ2=∑(Observed−Expected)2Expected∼χ2(k−1), где k - число ячеек таблицы
Генетик утверждает, что в общей популяции 4 вида мух встречаются в соотношении 1:3:3:9. Предположим, что в выборке из 4000 мух попалось 226, 764, 733, 2277 мух каждого вида. Можно ли на уровне значимости 10% отвергнуть нулевую гипотезу генетика?
Ожидаемые значения: 1164000=250, 3164000=750, 750,9164000=2250
Составим таблицу:
χ2=∑(O−E)2E=(226−250)2250+(764−750)2750+(733−750)2750+(2277−2250)22250=3.27
χ2(3)0.1=6.25>3.27. На уровне значимости 0.1 H0 отвергнуть нельзя.
При этом мы не можем утверждать, что теор. распределение хорошо описывает данные.
Проверьте гипотезу о том, что вес крыс распределен нормально:
x <- c(149, 149, 183, 174, 173, 170, 175, 191, 149, 194, 178, 152, 185, 172, 181, 170, 158, 200, 193,
170, 177, 151, 186, 194, 189, 172, 160, 131, 151, 168, 143, 185, 208, 193, 152, 115, 202, 162,
189, 153, 157, 184, 159, 190, 142, 181, 178, 167, 164, 194)
# Тест Шапиро-Уилка
shapiro.test(x)
Shapiro-Wilk normality test
data: x
W = 0.97434, p-value = 0.3444
Для того, чтобы использовать критерий хи-квадрат, нужно бинировать нормальное распределение и учесть, что число степеней свободы будет равно n−1−2, потому что мы оцениваем 2 параметра по выборке.
# Оценили параметры нормального распределения
mu <- mean(x)
s <- sd(x)
# Бинировали
breaks <- qnorm(seq(0, 1, 0.20), mu, s)
# Посчитали количество наблюдений в каждом бине
histogram <- hist(x, breaks = breaks, plot = FALSE)
obs <- histogram$counts
# Провели тест
test <- chisq.test(obs)
# Но p-значение посчитано по распределению с n-1 степенью свободы
test$p.value
[1] 0.6626273
X-squared
0.3011942
Если размер выборки достаточно большой, то Центральная Предельная Теорема (ЦПТ) позволяет нам игнорировать условие о нормальности данных.
ЦПТ: распределение значений выборочных средних близко к нормальному вне зависимости от распределения значений генеральной совокупности при условии, что выборки достаточно велики.
Если данные смещены вправо (есть тяжелый правый хвост), поможет:
Если после логарифмирования распределение данных становятся нормальным, значит, исходные данные были распределены лог-нормально.
Если данные смещены влево (есть тяжелый левый хвост), поможет:
Yi=(Xmax+1)−Xi
Алгоритм:
Если размеры выборок меньше 10, лучше не использовать нормальную аппроксимацию - не считать z-значение, а использовать табличные критические значения U-статистики.
У пяти легкоатлетов был замерен пульс во время отдыха: 60, 58, 67, 61 и 59. И так же во время отдыха был замерен пульс у семи людей, не занимающихся спортом: 83, 60, 75, 91, 82, 71 и 84. Отличается ли пульс у легкоатлетов и людей, не занимающихся спортом?
58, 59, 60, 60, 61, 67, 71, 75, 82, 83, 84, 91
1, 2, 3.5, 3.5, 5, 6, 7, 8, 9, 10, 11, 12
R1=1+2+3.5+5+6=17.5
R2=3.5+7+8+9+10+11+12=60.5
U1=R1−n(n+1)2=17.5−5(5+1)2=2.5
U2=R2−m(m+1)2=60.5−7(7+1)2=32.5
min(U1,U2)=2.5
μ=nm2=5×72=17.5
σ=√nm(n+m+1)12=√5×7(5+7+1)12=6.16
P(z<−2.43)=0.0075
pval=P∗2=0.0075∗2=0.015 - потому что гипотеза двусторонняя.
Если размеры выборок меньше 10, лучше не использовать нормальную аппроксимацию - не считать z-значение, а использовать табличные критические значения U-статистики.
Алгоритм:
Если размеры выборок меньше 10, лучше не использовать нормальную аппроксимацию - не считать z-значение, а использовать табличные критические значения W-статистики.
Некоторое вещество, подавляющее аппетит, было протестировано на 10 крысах. Вес животных был измерен до начала добавления исследуемого вещества в корм и после двух недель эксперимента. Используя собранные данные, можно ли утверждать, что исследуемое вещество влияет на аппетит и набор веса?
W=−29, σ=√n(n+1)(2n+1)6=√10(10+1)(20+1)6=19.62
z=W−μσ=−29−019.62=−1.48
P(z<−1.48)=0.0694, pval=P∗2=0.0694∗2=0.1388
wilcox.test(
x = c(400, 405, 388, 377, 372, 393, 361, 376, 360, 420),
y = c(394, 411, 354, 389, 372, 380, 352, 364, 357, 403),
paired = TRUE)
Wilcoxon signed rank test with continuity correction
data: c(400, 405, 388, 377, 372, 393, 361, 376, 360, 420) and c(394, 411, 354, 389, 372, 380, 352, 364, 357, 403)
V = 37, p-value = 0.09661
alternative hypothesis: true location shift is not equal to 0