Обратите внимание на перекодирование типа диеты в фактор:
diet$Dietf
[1] A A A A A A A A A A A A A A B B B B B B B B B B B B B B C C C C C C C C C C
[39] C C C C C A A A A A A A A A A B B B B B B B B B B B C C C C C C C C C C C C
Levels: A B C
Фактор - проименованный вектор в R. По умолчанию уровни заданы в алфавитном порядке.
t-test как общий случай линейной регрессии
diet23 <- diet %>%filter(Diet ==2| Diet ==3)
Обычно мы рассматриваем t-test как метод сравнения средних, но давайте теперь представим, что у нас линейная регрессия, где независимая переменная - тип диеты, зависимая - потеря веса.
t-test как общий случай линейной регрессии
t-test как общий случай линейной регрессии
Независимую переменную можно перекодировать в 0 и 1: допустим диета B станет 0, а диета C – 1. Запускаем линейную регрессию lm():
Two Sample t-test
data: weight_loss by Dietf
t = 2.7889, df = 50, p-value = 0.007463
alternative hypothesis: true difference in means between group B and group C is not equal to 0
95 percent confidence interval:
0.5260598 3.2342365
sample estimates:
mean in group B mean in group C
-3.268000 -5.148148
summary(ttest_diet)
Call:
lm(formula = weight_loss ~ Dietf, data = diet23)
Residuals:
Min 1Q Median 3Q Max
-4.6320 -1.8519 -0.2419 1.5680 5.3680
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.2680 0.4858 -6.727 1.6e-08 ***
DietfC -1.8801 0.6742 -2.789 0.00746 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.429 on 50 degrees of freedom
Multiple R-squared: 0.1346, Adjusted R-squared: 0.1173
F-statistic: 7.778 on 1 and 50 DF, p-value: 0.007463
Обратите внимание! Я выставила var.equal = TRUE, чтобы посчитался обычный t-test, без поправки Велча. С поправкой p-value будет отличаться на 0.0001.
Df Sum Sq Mean Sq F value Pr(>F)
Dietf 1 45.89 45.89 7.778 0.00746 **
Residuals 50 294.98 5.90
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
p-value совпадают при расчете всеми тремя методами
ANOVA как общий случай линейной регрессии
Дисперсионный анализ также можно посчитать с помощью функции lm() как для линейной регрессии. Однако у нас теперь три уровня фактора, мы их не можем закодировать как 0, 1, 2.
lm_diet <-lm(weight_loss ~ Dietf, data = diet)summary(lm_diet)
Call:
lm(formula = weight_loss ~ Dietf, data = diet)
Residuals:
Min 1Q Median 3Q Max
-5.7000 -1.6519 -0.1759 1.4420 5.3680
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.3000 0.4840 -6.818 2.26e-09 ***
DietfB 0.0320 0.6776 0.047 0.96246
DietfC -1.8481 0.6652 -2.778 0.00694 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.371 on 73 degrees of freedom
Multiple R-squared: 0.1285, Adjusted R-squared: 0.1047
F-statistic: 5.383 on 2 and 73 DF, p-value: 0.006596
Dummy coding
Допустим, у нас есть столбец с фактором, у которого 3 уровня.
Можно ли его использовать в качестве бинарного предиктора для регрессии?
Создаем дополнительные переменные, заполненные нулями и единицами, соответственно фактору.
factor
A
B
C
A
1
0
0
A
1
0
0
B
0
1
0
B
0
1
0
C
0
0
1
C
0
0
1
Если нам известно 2 столбца, то мы можем однозначно вывести третий.
Dummy coding
Один из уровней фактора (обычно первый) берется за дефолтный, поскольку на основании оставшихся двух столбцов можно однозначно вывести столбец А.
B
C
0
0
0
0
1
0
1
0
0
1
0
1
Фактор - проименованный вектор в R. По умолчанию уровни заданы в алфавитном порядке.
diet$Dietf
[1] A A A A A A A A A A A A A A B B B B B B B B B B B B B B C C C C C C C C C C
[39] C C C C C A A A A A A A A A A B B B B B B B B B B B C C C C C C C C C C C C
Levels: A B C
ANOVA как общий случай линейной регрессии: графически
ANOVA как общий случай линейной регрессии: графически
Интерпретация дисперсионного анализа в виде регрессии
summary(lm_diet)
Call:
lm(formula = weight_loss ~ Dietf, data = diet)
Residuals:
Min 1Q Median 3Q Max
-5.7000 -1.6519 -0.1759 1.4420 5.3680
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.3000 0.4840 -6.818 2.26e-09 ***
DietfB 0.0320 0.6776 0.047 0.96246
DietfC -1.8481 0.6652 -2.778 0.00694 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 2.371 on 73 degrees of freedom
Multiple R-squared: 0.1285, Adjusted R-squared: 0.1047
F-statistic: 5.383 on 2 and 73 DF, p-value: 0.006596
fit_diet <-aov(weight_loss ~ Dietf, data = diet)summary(fit_diet)
Df Sum Sq Mean Sq F value Pr(>F)
Dietf 2 60.5 30.264 5.383 0.0066 **
Residuals 73 410.4 5.622
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Почти все пройденные нами методы можно рассматривать как частный случай общей линейной модели: t-тесты, коэффициент корреляции Пирсона, линейная регрессия, ANOVA.
Непараметрический аналог дисперсионного анализа: тест Краскелла-Уоллиса (Kruskal-Wallis)
В случае, если допущения ANOVA слишком сильно нарушаются, можно использовать непараметрический аналог: H-критерий Краскелла-Уоллиса.
Представляет собой расширение критерия Манна-Уитни для нескольких групп, вместо оригинальных значений используются ранги. Рассчитывается H-значение, которое сравнивается с распределением \(\chi^2\), где количество степеней свободы=количество групп-1
Как и обычная анова дает ответ на вопрос, есть ли хоть одно различие между группами, но для сравнения групп нужно использовать post-hoc тесты.
Тест Краскелла-Уоллиса в R
Функция kruskal.test() есть в базовом R.
kruskal.test(weight_loss ~ Dietf, data = diet)
Kruskal-Wallis rank sum test
data: weight_loss by Dietf
Kruskal-Wallis chi-squared = 9.4159, df = 2, p-value = 0.009023
Непараметрические post-hoc тесты
Для обычной ановы используем Тьюки, но в случае нарушения предположений ановы, нарушается и предположения Тьюки, следовательно, для сравнения групп нужно использовать другие тесты.
Непараметрические аналоги Тьюки: тест Даннета (Dunnet), тест Данна (Dunn).
Warning
Без шуток, это разные тесты!
Тест Данна делает попарные сравнения каждой группы с каждой.
Kruskal-Wallis rank sum test
data: x and group
Kruskal-Wallis chi-squared = 9.4159, df = 2, p-value = 0.01
Comparison of x by group
(Holm)
Col Mean-|
Row Mean | A B
---------+----------------------
B | 0.376851
| 0.3531
|
C | 2.797580 2.439670
| 0.0077* 0.0147*
alpha = 0.05
Reject Ho if p <= alpha/2
Тест Даннета
Делает сравнение групп с контролем
DescTools::DunnettTest(diet$weight_loss, diet$Dietf, control ='A')
Dunnett's test for comparing several treatments with a control :
95% family-wise confidence level
$A
diff lwr.ci upr.ci pval
B-A 0.032000 -1.494803 1.5588028 0.9983
C-A -1.848148 -3.346998 -0.3492983 0.0131 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Вместо постхоков можно использовать тесты Манна-Уитни с поправкой на множественное тестирование
Pairwise comparisons using Wilcoxon rank sum test with continuity correction
data: diet$weight_loss and diet$Dietf
A B
B 0.653 -
C 0.021 0.025
P value adjustment method: holm
Двухфакторный дисперсионный анализ
Двухфакторный дисперсионный анализ
Влияние единственного фактора редко когда интересует исследователя. Гораздо чаще нас интересует влияние нескольких факторов, и особенно их возможное взаимодействие.
Допустим, мы хотим сравнить эффективность различных диет в зависимости от пола испытуемого. Следовательно, у нас две независимые переменные: тип диеты (3 уровня фактора) и пол (2 уровня фактора). Часто обозначают как “3x2 ANOVA”.
Мы можем оценить влияние каждого фактора по отдельности, и, самое интересное, – их возможное взаимодействие.
Что такое взаимодействие факторов?
Взаимодействие факторов – когда эффект фактора A разный в зависимости от фактора B и наоборот. На каких рисунках есть взаимодействие факторов?
Logan, 2010, fig.12.2
Взаимодействие факторов может маскировать главные эффекты
Если есть значимое взаимодействие, то
главные эффекты обсуждать не имеет смысла
пост хок тесты проводятся только для ваимодействия
Двухфакторный дисперсионный анализ
Взаимодействие видно на графике с линиями: если линии параллельны, то взаимодействия нет.
Важность сбалансированности данных
Если данные сбалансированы (размеры групп примерно одинаковы), то
взаимодействие и эффекты факторов независимы (в любой параметризации),
все суммы квадратов и соответствующие тесты можно посчитать в одном анализе,
результат не зависит от порядка включения факторов в модель.
Если данные несбалансированы, то
суммы квадратов для факторов не равны общей сумме квадратов,
для вычислений используется регрессионный подход (несколько сравнений вложенных моделей),
результат анализа может зависеть от порядка включения факторов в модель.
Подводные камни (pitfalls) двухфакторной ановы
Функция aov() в базовом R по умолчанию считает сумму квадратов первого типа, которую не рекомендуют использовать (!).
Формулы расчета сумм квадратов
I тип
II тип
III тип
Название
Последовательный
Без учета взаимодействий высоких порядков
Иерархический
Порядок расчета SS
SS(A)
SS(B|A)
SS(AB|B, A)
SS(A|B)
SS(B|A)
SS(AB|B, A)
SS(A|B, AB)
SS(B|A, AB)
SS(AB|B, A)
Величина эффекта зависит от выборки в группе
Да
Да
Нет
Рекомендуется использовать car или ezANOVA
I тип
II тип
III тип
Результат зависит от порядка включения факторов в модель