Очень часто в экспериментах и исследованиях возникает необходимость сравнить несколько групп между собой. В таком случае мы можем применять однофакторный дисперсионный анализ. Та переменная, которая будет разделять наших испытуемых или наблюдения на группы (номинативная переменная с нескольким градациями) называется независимой переменной. А та количественная переменная, по степени выраженности которой мы сравниваем группы, называется зависимая переменная.
Исходными положениями дисперсионного анализа являются
- нормальное распределение значений изучаемого признака в генеральной совокупности;
- равенство дисперсий в сравниваемых генеральных совокупностях;
- случайный и независимый характер выборки.
SST - общая сумма квадратов (total sum of squares)
SSW - внутригрупповая сумма квадратов (sum of squares within groups)
SSB - межгрупповая сумма квадратов (sum of squares between groups)
- где xijxij обозначает наблюдение jj в группе ii (например, x13x13 будет третьим наблюдением из первой группы), ¯xixi¯ - среднее значение в группе ii, a ¯XX¯ - общее среднее значение (рассчитанное по всем имеющимся наблюдениям).
Пример в R
# Дисперсионный анализ ANOVA (от англ. ANalysis Of VAriance)
# Даны три вектора x1, x2, x3
# Проверить нулевую гипотезу о значимости различий средних этих векторов
x1 <- c(3, 1, 2)
x2 <- c(5, 3, 4)
x3 <- c(7, 6, 5)
m <- 3 # количество групп
N <- length( c(x1, x2, x3) ) # количество переменных
xM <- mean( c(x1, x2, x3) ) # общее среднее
SST <- sum( c((x1-xM)^2, (x2-xM)^2, (x3-xM)^2) ) # общая сумма квадратов (total sum of squares)
dF <- N-1 # число степеней свободы
# SSW - внутригрупповая сумма квадратов (sum of squares within groups)
SSW <- sum(c((x1 - mean(x1))^2, (x2 - mean(x2))^2, (x3 - mean(x3))^2))
dFw <- N-m # число степеней свободы
# SSB - межгрупповая сумма квадратов (sum of squares between groups)
SSB <- sum((mean(x1)-xM)^2, (mean(x2)-xM)^2, (mean(x3)-xM)^2)*length(x1)
dFb <- m-1 # число степеней свободы
# F-критерий
F <- (SSB/(m-1)) / (SSW/(N-m))
pf(F, dFb, dFw, lower.tail = FALSE)
Калькулятор для расчета F-критерия
https://gallery.shinyapps.io/dist_calc/
(сначала подставляется SSB)
#Рассмотренный ниже пример заимствован из книги Maindonald & Braun (2010).
#Имеются данные о весе томатов (все растение целиком; weight, в кг), которые выращивали в течение 2 месяцев при трех разных экспериментальных условиях (trt, от treatment) - на воде (water), в среде с добавлением удобрения (nutrient), а также в среде с добавлением удобрения и гербицида 2,4-D (nutrient+24D):
# Создадим таблицу с данными:
tomato <- data.frame(weight=
c(1.5, 1.9, 1.3, 1.5, 2.4, 1.5, # water
1.5, 1.2, 1.2, 2.1, 2.9, 1.6, # nutrient
1.9, 1.6, 0.8, 1.15, 0.9, 1.6), # nutrient+24D
trt = rep(c("Water", "Nutrient", "Nutrient+24D"),
c(6, 6, 6)))
#Переменная trt представляет собой фактор с тремя уровнями.
#Для более наглядного сравнения экспериментальных условий в последующем, сделаем уровень "water" базовым (англ. reference), т.е. уровнем, с которым R будет сравнивать все остальные уровни. Это можно сделать при помощи функции relevel():
tomato$trt <- relevel(tomato$trt, ref = "Water")
#Чтобы лучше понять свойства имеющихся данных, визуализируем их при помощи одномерной диаграммы рассеяния:
attach(tomato)
stripchart(weight ~ trt, xlab = "Вес, кг", ylab = "Условия")
# Вычисление групповых средних
tapply(weight, trt, mean)
#Подлежащую проверке нулевую гипотезу можно сформулировать так: исследованные условия выращивания растений не оказывают никакого влияния на вес последних.
#Другими словами, нулевая гипотеза утверждает, что наблюдаемые различия между групповыми средними несущественны и вызваны влиянием случайных факторов (т.е. в действительности все полученные измерения веса растений происходят из одной нормально распределенной генеральной совокупности):
summary(aov(weight ~ trt, data = tomato))
В приведенных результатах строка, обозначенная как trt, соответствует источнику дисперсии в данных, связанному с действием изучаемого экспериментального фактора - условий выращивания растений. Строка, обозначенная как Residuals, характеризует внутригрупповую дисперсию (ее еще называют шумовой или остаточной дисперсией - в том смысле, что она не может быть объяснена влиянием экспериментального фактора). Столбец Sum Sq содержит
SSBSSB иSSWSSW, а столбец Mean Sq - меж- и внутригрупповую дисперсии, MSBMSB и MSWMSWВ столбце F valueпредставлено рассчитанное по имеющимся данным значение F-критерия. Наконец, в столбцеPr(>F) представлена вероятность получить F-значение, равное или превышающее то значение, которое мы в действительности рассчитали по имеющимся выборочным данным (при условии, что нулевая гипотеза верна). Как видим, эта вероятность достаточно высока. Во всяком случае, она превышает 5%-ный уровень значимости, в связи с чем мы заключаем, что нулевая гипотеза верна. Таким образом, с достаточно высокой степенью уверенности мы можем утверждать, что экспериментальные условия не оказали существенного влияния на вес растений.
Построить график
library(ggplot2)
library(dplyr)
gr_df <- group_by(tomato, trt)
se_data <- summarise(gr_df, mean_expr= mean(weight),
y_max=mean(weight)+1.96*sd(weight)/sqrt(length(weight)),
y_min=mean(weight)-1.96*sd(weight)/sqrt(length(weight)))
Label_X <- c('Water', 'Nutrient', 'Nutrient+24D')
ggplot(se_data, aes(factor(trt), mean_expr))+
geom_errorbar(aes(ymin=y_min, ymax=y_max), width=0.2, lwd=1)+
geom_point(shape=21, size=3, fill='white')+
ggtitle("Виды полива")+
xlab("")+
scale_y_continuous(name='Вес помидоров',
limits = c(0.5, 2.5), breaks = seq(0.5, 2.5,0.5))+
scale_x_discrete(labels=Label_X)+
theme(plot.title = element_text(hjust=0.5))