Обычные линейные модели предполагают, что наблюдения должны быть независимы друг от друга.
Но так происходит совсем не всегда.
Обычные линейные модели предполагают, что наблюдения должны быть независимы друг от друга.
Но так происходит совсем не всегда.
Иногда наблюдения бывают сходны по каким-то признакам:
измерения в разные периоды времени
измерения в разных участках пространства
повторные измерения на одних и тех же субъектах
измерения на разных субъектах, которые сами объединены в группы
Детали, произведенные на одном станке будут более похожи, чем детали, сделанные на разных.
Аналогично, у учеников из одного класса будет более похожий уровень подготовки к какому-нибудь предмету, чем у учеников из разных классов.
Таким образом, можно сказать, что есть корреляции значений внутри групп.
Детали, произведенные на одном станке будут более похожи, чем детали, сделанные на разных.
Аналогично, у учеников из одного класса будет более похожий уровень подготовки к какому-нибудь предмету, чем у учеников из разных классов.
Таким образом, можно сказать, что есть корреляции значений внутри групп.
Игнорировать такую группирующую структуру данных нельзя – можно ошибиться с выводами.
Моделировать группирующие факторы обычными методами тоже нельзя – придется подбирать очень много параметров.
Решение – случайные факторы.
Cейчас давайте на примере убедимся в том, что без случайных факторов бывает сложно справиться с анализом.
В ночь перед нулевым днем всем испытуемым давали поспать нормальное время, а в следующие 9 ночей — только по 3 часа. Каждый день измеряли время реакции в серии тестов. (Данные Belenky et al., 2003)
Как время реакции людей зависит от бессонницы?
Reaction
— среднее время реакции в серии тестов в день наблюдения, мсDays
— число дней депривации снаSubject
— номер испытуемогоlibrary(lme4)data(sleepstudy)sl <- sleepstudystr(sl)
'data.frame': 180 obs. of 3 variables: $ Reaction: num 250 259 251 321 357 ... $ Days : num 0 1 2 3 4 5 6 7 8 9 ... $ Subject : Factor w/ 18 levels "308","309","310",..: 1 1 1 1 1 1 1 1 1 1 ...
# Есть ли пропущенные значения?colSums(is.na(sl))
Reaction Days Subject 0 0 0
# Сколько субъектов?length(unique(sl$Subject))
[1] 18
# Сколько наблюдений для каждого субъекта?table(sl$Subject)
308 309 310 330 331 332 333 334 335 337 349 350 351 352 369 370 371 372 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
library(ggplot2)theme_set(theme_bw(base_size = 14))ggplot(sl, aes(x = Reaction, y = 1:nrow(sl))) + geom_point()
library(ggplot2)theme_set(theme_bw(base_size = 14))ggplot(sl, aes(x = Reaction, y = 1:nrow(sl))) + geom_point()
Мы пока еще не учли информацию о субъектах...
ggplot(sl, aes(x = Reaction, y = Subject, colour = Days)) + geom_point()
ggplot(sl, aes(x = Reaction, y = Subject, colour = Days)) + geom_point()
The Good — подбираем смешанную модель, в которой есть фиксированный фактор Days
и случайный фактор Subject
, который опишет межиндивидуальную изменчивость.
The Bad — игнорируем структуру данных, подбираем модель с единственным фиксированным фактором Days
. (Не учитываем группирующий фактор Subject
). Неправильный вариант.
The Ugly — подбираем модель с двумя фиксированными факторами: Days
и Subject
. (Группирующий фактор Subject
опишет межиндивидуальную изменчивость как обычный фиксированный фактор).
The Good — подбираем смешанную модель, в которой есть фиксированный фактор Days
и случайный фактор Subject
, который опишет межиндивидуальную изменчивость.
The Bad — игнорируем структуру данных, подбираем модель с единственным фиксированным фактором Days
. (Не учитываем группирующий фактор Subject
). Неправильный вариант.
The Ugly — подбираем модель с двумя фиксированными факторами: Days
и Subject
. (Группирующий фактор Subject
опишет межиндивидуальную изменчивость как обычный фиксированный фактор).
The Good — подбираем смешанную модель, в которой есть фиксированный фактор Days
и случайный фактор Subject
, который опишет межиндивидуальную изменчивость.
The Bad — игнорируем структуру данных, подбираем модель с единственным фиксированным фактором Days
. (Не учитываем группирующий фактор Subject
). Неправильный вариант.
The Ugly — подбираем модель с двумя фиксированными факторами: Days
и Subject
. (Группирующий фактор Subject
опишет межиндивидуальную изменчивость как обычный фиксированный фактор).
The Good — подбираем смешанную модель, в которой есть фиксированный фактор Days
и случайный фактор Subject
, который опишет межиндивидуальную изменчивость.
The Bad — игнорируем структуру данных, подбираем модель с единственным фиксированным фактором Days
. (Не учитываем группирующий фактор Subject
). Неправильный вариант.
The Ugly — подбираем модель с двумя фиксированными факторами: Days
и Subject
. (Группирующий фактор Subject
опишет межиндивидуальную изменчивость как обычный фиксированный фактор).
Reactioni=β0+β1Daysi+εi
εi∼N(0,σ)
Reactioni=β0+β1Daysi+εi
εi∼N(0,σ)
В матричном виде это можно записать так:
(Reaction1Reaction2⋮Reaction180)=(1Days11Days2⋮1Days180)(β0β1)+(ε1ε2⋮ε180)
что можно сокращенно записать так:
Reaction=Xββ+εε
W1 <- glm(Reaction ~ Days, data = sl)summary(W1)
Call:glm(formula = Reaction ~ Days, data = sl)Deviance Residuals: Min 1Q Median 3Q Max -110.85 -27.48 1.55 26.14 139.95 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 251.41 6.61 38.03 < 2e-16 ***Days 10.47 1.24 8.45 9.9e-15 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1(Dispersion parameter for gaussian family taken to be 2277) Null deviance: 567954 on 179 degrees of freedomResidual deviance: 405252 on 178 degrees of freedomAIC: 1906Number of Fisher Scoring iterations: 2
Объем выборки завышен (180 наблюдений, вместо 18 субъектов). Стандартные ошибки и уровни значимости занижены. Увеличивается вероятность ошибок I рода.
Нарушено условие независимости наблюдений.
W1 <- glm(Reaction ~ Days, data = sl)summary(W1)
Call:glm(formula = Reaction ~ Days, data = sl)Deviance Residuals: Min 1Q Median 3Q Max -110.85 -27.48 1.55 26.14 139.95 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 251.41 6.61 38.03 < 2e-16 ***Days 10.47 1.24 8.45 9.9e-15 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1(Dispersion parameter for gaussian family taken to be 2277) Null deviance: 567954 on 179 degrees of freedomResidual deviance: 405252 on 178 degrees of freedomAIC: 1906Number of Fisher Scoring iterations: 2
Объем выборки завышен (180 наблюдений, вместо 18 субъектов). Стандартные ошибки и уровни значимости занижены. Увеличивается вероятность ошибок I рода.
Нарушено условие независимости наблюдений.
ggplot(sl, aes(x = Days, y = Reaction)) + geom_point() + geom_smooth(se = TRUE, method = "lm", size = 1)
ggplot(sl, aes(x = Days, y = Reaction)) + geom_point() + geom_smooth(se = TRUE, method = "lm", size = 1)
Доверительная зона регрессии “заужена”.
Большие остатки, т.к. неучтенная межиндивидуальная изменчивость “ушла” в остаточную.
Reactioni=β0+β1Daysi+β2Subj2i+...+β2Subj18i+εi
εi∼N(0,σ)
Reactioni=β0+β1Daysi+β2Subj2i+...+β2Subj18i+εi
εi∼N(0,σ)
В матричном виде это можно записать так:
(Reaction1Reaction2⋮Reaction180)=(1Days1Subj21⋯Subj1811Days2Subj22⋯Subj182⋮1Days180Subj2180⋯Subj18180)(β0β1⋮β18)+(ε1ε2⋮ε180)
То есть: Reaction=Xββ+εε
W2 <- glm(Reaction ~ Days + Subject, data = sl)coef(W2)
(Intercept) Days Subject309 Subject310 295.031 10.467 -126.901 -111.133 Subject330 Subject331 Subject332 Subject333 -38.912 -32.698 -34.832 -25.976 Subject334 Subject335 Subject337 Subject349 -46.832 -92.064 33.587 -66.299 Subject350 Subject351 Subject352 Subject369 -28.531 -52.036 -4.712 -36.099 Subject370 Subject371 Subject372 -50.432 -47.150 -24.248
Фрагмент summary(W2)
:
Residual standard error: 30.99 on 161 degrees of freedomMultiple R-squared: 0.7277, Adjusted R-squared: 0.6973 F-statistic: 23.91 on 18 and 161 DF, p-value: < 2.2e-16
W2 <- glm(Reaction ~ Days + Subject, data = sl)coef(W2)
(Intercept) Days Subject309 Subject310 295.031 10.467 -126.901 -111.133 Subject330 Subject331 Subject332 Subject333 -38.912 -32.698 -34.832 -25.976 Subject334 Subject335 Subject337 Subject349 -46.832 -92.064 33.587 -66.299 Subject350 Subject351 Subject352 Subject369 -28.531 -52.036 -4.712 -36.099 Subject370 Subject371 Subject372 -50.432 -47.150 -24.248
Фрагмент summary(W2)
:
Residual standard error: 30.99 on 161 degrees of freedomMultiple R-squared: 0.7277, Adjusted R-squared: 0.6973 F-statistic: 23.91 on 18 and 161 DF, p-value: < 2.2e-16
20 параметров (18 для Subject
, один для Days
и σ), а наблюдений всего 180.
Нужно минимум 10–20 наблюдений на каждый параметр (Harrell, 2013) — у нас всего 9.
ggplot(fortify(W2), aes(x = Days, colour = Subject)) + geom_line(aes(y = .fitted, group = Subject)) + geom_point(data = sl, aes(y = Reaction)) + guides(colour = guide_legend(ncol = 2))
ggplot(fortify(W2), aes(x = Days, colour = Subject)) + geom_line(aes(y = .fitted, group = Subject)) + geom_point(data = sl, aes(y = Reaction)) + guides(colour = guide_legend(ncol = 2))
До сих пор мы имели дело только с фиксированными факторами.
Мы моделировали средние значения для уровней фиксированного фактора. Если групп было много, то приходилось моделировать много средних значений.
Поступая так, мы считали, что сравниваемые группы – фиксированные, и нам интересны именно сравнения между ними.
Когда нам не важны конкретные значения интерсептов для разных уровней фактора, мы можем представить, что эффект фактора (величина “поправки”) — случайная величина, и можем оценить дисперсию между уровнями группирующего фактора.
Такие факторы называются случайными факторами.
измерения в разные периоды времени
измерения в разных участках пространства
повторные измерения на одних и тех же субъектах
измерения на разных субъектах, которые сами объединены в группы
На один и тот же фактор можно посмотреть и как на фиксированный и как на случайный в зависимости от целей исследователя.
Поскольку моделируя случайный фактор мы оцениваем дисперсию между уровнями, то хорошо, если у случайного фактора будет минимум пять градаций.
Reactionij=β0+β1Daysij+bi+εij
bi∼N(0,σb) — случайный эффект субъекта (случайный отрезок, интерсепт)
εij∼N(0,σ) — остатки модели
i — субъекты, j — дни
Reactionij=β0+β1Daysij+bi+εij
bi∼N(0,σb) — случайный эффект субъекта (случайный отрезок, интерсепт)
εij∼N(0,σ) — остатки модели
i — субъекты, j — дни
В матричном виде это записывается так:
(Reaction1Reaction2⋮Reaction180)=(1Days11Days2⋮1Days180)(β0β1)+(11⋮1)(b)+(ε1ε2⋮ε180)
То есть: Reaction=Xββ+Zb+εε
Используем lmer
из пакета lme4
.
?lmer # справка о lmer
lmer
по умолчанию использует REML для подбора параметров. Это значит, что случайные эффекты будут оценены более точно, чем при использовании ML.
M1 <- lmer(Reaction ~ Days + (1 | Subject), data = sl)
summary(M1)
Linear mixed model fit by REML ['lmerMod']Formula: Reaction ~ Days + (1 | Subject) Data: slREML criterion at convergence: 1786Scaled residuals: Min 1Q Median 3Q Max -3.226 -0.553 0.011 0.519 4.251 Random effects: Groups Name Variance Std.Dev. Subject (Intercept) 1378 37.1 Residual 960 31.0 Number of obs: 180, groups: Subject, 18Fixed effects: Estimate Std. Error t value(Intercept) 251.405 9.747 25.8Days 10.467 0.804 13.0Correlation of Fixed Effects: (Intr)Days -0.371
summary(M1)
Linear mixed model fit by REML ['lmerMod']Formula: Reaction ~ Days + (1 | Subject) Data: slREML criterion at convergence: 1786Scaled residuals: Min 1Q Median 3Q Max -3.226 -0.553 0.011 0.519 4.251 Random effects: Groups Name Variance Std.Dev. Subject (Intercept) 1378 37.1 Residual 960 31.0 Number of obs: 180, groups: Subject, 18Fixed effects: Estimate Std. Error t value(Intercept) 251.405 9.747 25.8Days 10.467 0.804 13.0Correlation of Fixed Effects: (Intr)Days -0.371
Reactionij=251.4+10.5Daysij+bi+εij
bi∼N(0,37.12) — случайный эффект субъекта
εij∼N(0,30.99) — остатки модели
i — субъекты, j — дни
Данные для графика предсказаний фиксированной части модели:
library(dplyr)NewData <- sl %>% group_by(Subject) %>% do(data.frame(Days = seq(min(.$Days), max(.$Days), length = 10)))head(NewData, 3)
# A tibble: 3 × 2# Groups: Subject [1] Subject Days <fct> <dbl>1 308 02 308 13 308 2
?predict.merMod
Функция predict()
в lme4
не считает стандартные ошибки и доверительные интервалы. Это потому, что нет способа адекватно учесть неопределенность, связанную со случайными эффектами.
NewData$fit <- predict(M1, NewData, type = 'response', re.form = NA)head(NewData, 3)
# A tibble: 3 × 3# Groups: Subject [1] Subject Days fit <fct> <dbl> <dbl>1 308 0 251.2 308 1 262.3 308 2 272.
Стандартные ошибки, рассчитанные обычным методом,
позволят получить приблизительные доверительные интервалы.
# Предсказанные значения при помощи матрицX <- model.matrix(~ Days, data = NewData)betas <- fixef(M1)NewData$fit <- X %*% betas# Cтандартные ошибкиNewData$SE <- sqrt( diag(X %*% vcov(M1) %*% t(X)) ) NewData$lwr <- NewData$fit - 2 * NewData$SENewData$upr <- NewData$fit + 2 * NewData$SE
Более точные доверительные интервалы можно получить при помощи бутстрепа.
Мы сделаем это позже для финальной модели.
Здесь доверительный интервал без учета неопределенности, связанной со случайным эффектом. Чтобы ее учесть нужно взять корень из суммы дисперсий фиксированной и случайного эффекта. См. GLMM FAQ
ggplot(data = NewData, aes(x = Days, y = fit)) + geom_ribbon(alpha = 0.35, aes(ymin = lwr, ymax = upr)) + geom_line() + geom_point(data = sl, aes(x = Days, y = Reaction))
Зависимость времени реакции от продолжительности периода бессонницы без учета субъекта:
^Reactionij=251.4+10.5Daysij
NewData$fit_subj <- predict(M1, NewData, type = 'response')ggplot(NewData, aes(x = Days, y = fit_subj)) + geom_ribbon(alpha = 0.3, aes(ymin = lwr, ymax = upr)) + geom_line(aes(colour = Subject)) + geom_point(data = sl, aes(x = Days, y = Reaction, colour = Subject)) + guides(colour = guide_legend(ncol = 2))
Зависимость времени реакции от продолжительности периода бессонницы для обследованных субъектов:
^Reactionij=251.4+10.5Daysij+bi
Случайный фактор помогает учесть взаимозависимость наблюдений для каждого из субъектов – “индуцированные” корреляции.
После анализа остатков модели можно будет понять, стоит ли с ней работать дальше. Одна из потенциальных проблем – время реакции разных субъектов может меняться непараллельно. Возможно, модель придется переформулировать.
Reaction=Xββ+Zb+εε
b∼N(0,D) - случайные эффекты bi нормально распределены со средним 0 и матрицей ковариаций D
εε∼N(0,ΣΣ) - остатки модели нормально распределены со средним 0 и матрицей ковариаций ΣΣ
Reaction=Xββ+Zb+εε
b∼N(0,D) - случайные эффекты bi нормально распределены со средним 0 и матрицей ковариаций D
εε∼N(0,ΣΣ) - остатки модели нормально распределены со средним 0 и матрицей ковариаций ΣΣ
Матрица ковариаций остатков: ΣΣ=σ2⋅(10⋯001⋯0⋮⋮⋱⋮00⋯1)=(σ20⋯00σ2⋯0⋮⋮⋱⋮00⋯σ2)
В матрице ковариаций остатков вне диагонали стоят нули, т.е. ковариация разных остатков равна нулю. Т.е. остатки независимы друг от друга.
ΣΣ=(σ20⋯00σ2⋯0⋮⋮⋱⋮00⋯σ2)
В то же время, отдельные значения переменной-отклика Y уже не будут независимы друг от друга при появлении в модели случайного фактора.
Reaction=Xββ+Zb+εε
b∼N(0,D)
εε∼N(0,ΣΣ)
Можно показать, что переменная-отклик Y нормально распределена:
Y∼N(Xββ,V)
Reaction=Xββ+Zb+εε
b∼N(0,D)
εε∼N(0,ΣΣ)
Можно показать, что переменная-отклик Y нормально распределена:
Y∼N(Xββ,V)
Матрица ковариаций переменной-отклика:
V=ZDZ′+ΣΣ, где D — матрица ковариаций случайных эффектов.
Т.е. добавление случайных эффектов приводит
к изменению ковариационной матрицы V
Кстати, ZDZ′ называется преобразование Холецкого (Cholesky decomposition)
V=ZDZ′+ΣΣ
Для простейшей смешанной модели со случайным отрезком:
V=(11⋮1)⋅σ2b⋅(11⋯1)+σ2⋅(10⋯001⋯0⋮⋮⋱⋮00⋯1)==(σ2+σ2bσ2b⋯σ2bσ2bσ2+σ2b⋯σ2b⋮⋮⋱⋮σ2bσ2bσ2bσ2+σ2b)
V=(σ2+σ2bσ2b⋯σ2bσ2bσ2+σ2b⋯σ2b⋮⋮⋱⋮σ2bσ2bσ2bσ2+σ2b)
Т.е. корреляция между наблюдениями одного субъекта σ2b/(σ2+σ2b)
ICC=σ2b/(σ2+σ2b)
Способ измерить, насколько коррелируют друг с другом наблюдения из одной и той же группы, заданной случайным фактором.
Если ICC низок, то наблюдения очень разные внутри групп, заданных уровнями случайного фактора.
Если ICC высок, то наблюдения очень похожи внутри каждой из групп, заданных случайным фактором.
ICC можно использовать как описательную статистику, но интереснее использовать его при планировании исследований.
Если в пилотном исследовании ICC маленький, то для надежной оценки эффекта этого случайного фактора нужно брать больше наблюдений в группе.
Если в пилотном исследовании ICC большой, то можно брать меньше наблюдений в группе.
summary(M1)
Linear mixed model fit by REML ['lmerMod']Formula: Reaction ~ Days + (1 | Subject) Data: slREML criterion at convergence: 1786Scaled residuals: Min 1Q Median 3Q Max -3.226 -0.553 0.011 0.519 4.251 Random effects: Groups Name Variance Std.Dev. Subject (Intercept) 1378 37.1 Residual 960 31.0 Number of obs: 180, groups: Subject, 18Fixed effects: Estimate Std. Error t value(Intercept) 251.405 9.747 25.8Days 10.467 0.804 13.0Correlation of Fixed Effects: (Intr)Days -0.371
# Случайные эффекты отдельноVarCorr(M1)
Groups Name Std.Dev. Subject (Intercept) 37.1 Residual 31.0
37.124^2 / (37.124^2 + 30.991^2)
[1] 0.5893
Есть функции для ICC, подождем, когда они станут пакетом. https://github.com/timothyslau/ICC.merMod
M1_diag <- data.frame( sl, .fitted = predict(M1), .resid = resid(M1, type = 'pearson'), .scresid = resid(M1, type = 'pearson', scaled = TRUE))head(M1_diag, 4)
Reaction Days Subject .fitted .resid .scresid1 249.6 0 308 292.2 -42.629 -1.37552 258.7 1 308 302.7 -43.951 -1.41823 250.8 2 308 313.1 -62.323 -2.01104 321.4 3 308 323.6 -2.151 -0.0694
.fitted
— предсказанные значения..resid
— Пирсоновские остатки..scresid
— стандартизованные Пирсоновские остатки.gg_resid <- ggplot(M1_diag, aes(y = .scresid)) + geom_hline(yintercept = 0)gg_resid + geom_point(aes(x = .fitted))
gg_resid <- ggplot(M1_diag, aes(y = .scresid)) + geom_hline(yintercept = 0)gg_resid + geom_point(aes(x = .fitted))
gg_resid + geom_boxplot(aes(x = factor(Days)))
gg_resid + geom_boxplot(aes(x = factor(Days)))
gg_resid + geom_boxplot(aes(x = Subject))
gg_resid + geom_boxplot(aes(x = Subject))
На графике индивидуальных эффектов было видно, что измерения для разных субъектов, возможно, идут непараллельно. Усложним модель — добавим случайные изменения угла наклона для каждого из субъектов.
Это можно биологически объяснить. Возможно, в зависимости от продолжительности бессонницы у разных субъектов скорость реакции будет ухудшаться разной скоростью: одни способны выдержать 9 дней почти без потерь, а другим уже пары дней может быть достаточно.
Reactionij=β0+β1Daysij+bi+cijDaysij+εij
bi∼N(0,σb) — случайный интерсепт для субъекта
cij∼N(0,σc) — случайный угол наклона для субъекта
εij∼N(0,σ) — остатки модели
i — субъекты, j — дни
Reactionij=β0+β1Daysij+bi+cijDaysij+εij
bi∼N(0,σb) — случайный интерсепт для субъекта
cij∼N(0,σc) — случайный угол наклона для субъекта
εij∼N(0,σ) — остатки модели
i — субъекты, j — дни
В матричном виде это записывается так:
(Reaction1Reaction2⋮Reaction180)=(1Days11Days2⋮1Days180)(β0β1)+(1Days11Days2⋮1Days180)(bc)+(ε1ε2⋮ε180)
То есть: Reaction=Xββ+Zb+εε
Формат записи формулы для случайных эффектов в lme4
(1 + угловой_коэффициент | отрезок)
MS1 <- lmer(Reaction ~ Days + ( 1 + Days|Subject), data = sl)
summary(MS1)
Linear mixed model fit by REML ['lmerMod']Formula: Reaction ~ Days + (1 + Days | Subject) Data: slREML criterion at convergence: 1744Scaled residuals: Min 1Q Median 3Q Max -3.954 -0.463 0.023 0.463 5.179 Random effects: Groups Name Variance Std.Dev. Corr Subject (Intercept) 612.1 24.74 Days 35.1 5.92 0.07 Residual 654.9 25.59 Number of obs: 180, groups: Subject, 18Fixed effects: Estimate Std. Error t value(Intercept) 251.41 6.82 36.84Days 10.47 1.55 6.77Correlation of Fixed Effects: (Intr)Days -0.138
Reactionij=251.4+10.5Daysij+bi+cijDaysij+εij
bi∼N(0,24.74) — случайный интерсепт для субъекта
cij∼N(0,5.92) — случайный угол наклона для субъекта
εij∼N(0,25.59) — остатки модели
i — субъекты, j — дни
library(dplyr)NewData <- sl %>% group_by(Subject) %>% do(data.frame(Days = seq(min(.$Days), max(.$Days), length = 10)))NewData$fit <- predict(MS1, NewData, type = 'response', re.form = NA)head(NewData, 3)
# A tibble: 3 × 3# Groups: Subject [1] Subject Days fit <fct> <dbl> <dbl>1 308 0 251.2 308 1 262.3 308 2 272.
Вычислим приблизительные доверительные интервалы.
# Предсказанные значения при помощи матрицX <- model.matrix(~ Days, data = NewData)betas <- fixef(MS1)NewData$fit <- X %*% betas# Cтандартные ошибкиNewData$SE <- sqrt( diag(X %*% vcov(MS1) %*% t(X)) ) NewData$lwr <- NewData$fit - 2 * NewData$SENewData$upr <- NewData$fit + 2 * NewData$SE
Более точные доверительные интервалы можно получить при помощи бутстрепа.
Здесь доверительный интервал без учета неопределенности, связанной со случайным эффектом. Чтобы ее учесть нужно взять корень из суммы дисперсий фиксированной и случайного эффекта. См. GLMM FAQ
ggplot(data = NewData, aes(x = Days, y = fit)) + geom_ribbon(alpha = 0.35, aes(ymin = lwr, ymax = upr)) + geom_line() + geom_point(data = sl, aes(x = Days, y = Reaction))
Зависимость времени реакции от продолжительности периода бессонницы без учета субъекта:
^Reactionij=251.4+10.5Daysij
NewData$fit_subj <- predict(MS1, NewData, type = 'response')ggplot(NewData, aes(x = Days, y = fit_subj)) + geom_ribbon(alpha = 0.3, aes(ymin = lwr, ymax = upr)) + geom_line(aes(colour = Subject)) + geom_point(data = sl, aes(x = Days, y = Reaction, colour = Subject)) + guides(colour = guide_legend(ncol = 2))
Зависимость времени реакции от продолжительности периода бессонницы для обследованных субъектов:
^Reactionij=251.4+10.5Daysij+bi+cijDaysij
MS1_diag <- data.frame( sl, .fitted = predict(MS1), .resid = resid(MS1, type = 'pearson'), .scresid = resid(MS1, type = 'pearson', scaled = TRUE))head(MS1_diag, 4)
Reaction Days Subject .fitted .resid .scresid1 249.6 0 308 253.7 -4.104 -0.16042 258.7 1 308 273.3 -14.625 -0.57153 250.8 2 308 293.0 -42.196 -1.64884 321.4 3 308 312.7 8.777 0.3430
gg_resid <- ggplot(MS1_diag, aes(y = .scresid)) + geom_hline(yintercept = 0)gg_resid + geom_point(aes(x = .fitted))
gg_resid <- ggplot(MS1_diag, aes(y = .scresid)) + geom_hline(yintercept = 0)gg_resid + geom_point(aes(x = .fitted))
gg_resid + geom_boxplot(aes(x = factor(Days)))
gg_resid + geom_boxplot(aes(x = factor(Days)))
gg_resid + geom_boxplot(aes(x = Subject))
Смешанными называются модели, включающие случайные факторы.
Общие смешанные модели (General Linear Mixed Models) — только нормальное распределение зависимой переменной.
Обобщенные смешанные модели (Generalized Linear Mixed Models) — распределения зависимой переменной могут быть другими (из семейства экспоненциальных распределений).
Y=Xββ+Zb+εε
b∼N(0,D) — случайные эффекты нормально распределены со средним 0 и матрицей ковариаций D (ее диагональные элементы – стандартное отклонение σb).
εε∼N(0,ΣΣ) — остатки модели нормально распределены со средним 0 и матрицей ковариаций ΣΣ (ее диагональные элементы – стандартное отклонение σ).
Xββ — фиксированная часть модели.
Zb+εε — случайная часть модели.
В зависимости от устройства модельной матрицы для случайных эффектов Z смешанные модели делят на модели со случайным отрезком и случайным углом наклона.
Метод максимального правдоподобия (Maximum Likelihood, ML)
Метод ограниченного максимального правдоподобия (Restricted Maximum Likelihood, REML)
Faraway, 2017, p.196
Правдоподобие (likelihood) — измеряет соответствие реально наблюдаемых данных тем, что можно получить из модели при определенных значениях параметров.
Это произведение вероятностей данных:
L(θ|yi)=Πni=1f(yi|θ)
Параметры модели должны максимизировать значение логарифма правдоподобия (loglikelihood):
lnL(θ|yi)⟶max
Например, ML оценка обычной выборочной дисперсии будет смещенной:
ˆσ2=∑(xi−ˉx)2n,
т.к. в знаменателе не n−1, а n.
Аналогичные проблемы возникают при ML оценках для случайных эффектов в линейных моделях.
Это происходит потому, что в смешанной линейной модели
Y=Xββ+Zb+εε
Y∼N(Xββ,V), где V=ZDZ′+ΣΣ
т.е. одновременно приходится оценивать ββ и V.
Y=Xββ+Zb+εε
Y∼N(Xββ,V), где ZDZ′+ΣΣ
Если найти матрицу A, ортогональную к X′ (т.е. A′X=0), то умножив ее на Y можно избавиться от ββ:
A′Y=A′Xββ+A′V=0+A′V=A′V
A′Y∼N(0,A′VA)
Тогда можно воспользоваться ML, чтобы найти V.
В результате получатся несмещенные оценки дисперсий.
REML-оценки ββ будут стремится к ML-оценкам при увеличении объема выборки.
Если нужны точные оценки фиксированных эффектов – ML.
Если нужны точные оценки случайных эффектов – REML.
Если нужно работать с правдоподобиями – следите, чтобы в моделях, подобранных REML была одинаковая фиксированная часть.
Для обобщенных (негауссовых) смешанных линейных моделей REML не определен – там используется ML.
Тесты, которые традиционно применяются для GLM, дадут лишь приблизительные результаты для GLMM:
Поэтому для отбора моделей применяют подход, не связанный с тестами:
Наиболее точные результаты тестов можно получить, используя “золотой стандарт”:
H0:βk=0, HA:βk≠0
bkSEbk∼N(0,1) или bkSEbk∼t(df=n−p), если нужно оценивать σ
bk — оценка коэффициента, n — объем выборки, p — число параметров модели.
t-(или -z) тесты Вальда дают лишь приблизительный результат,
поэтому в пакете lme4
даже не приводят уровни значимости в summary()
.
Не рекомендуется ими пользоваться.
coef(summary(MS1))
Estimate Std. Error t value(Intercept) 251.41 6.825 36.838Days 10.47 1.546 6.771
LRT=2ln(LM1LM2)=2(lnLM1−lnLM2)
Распределение LRT аппроксимируют распределением χ2 с df=dfM2−dfM1.
LRT консервативен для случайных эффектов, т.к. тест гипотезы вида H0:ˆσ2k=0 происходит на границе области возможных значений параметра.
LRT либерален для фиксированных эффектов,
дает заниженные уровни значимости.
Модели с одинаковой фиксированной частью, подобранные REML, вложенные. Уровни значимости будут завышены.
MS1 <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sl, REML = TRUE)MS0 <- lmer(Reaction ~ Days + (1 | Subject), data = sl, REML = TRUE)anova(MS1, MS0, refit = FALSE)
Data: slModels:MS0: Reaction ~ Days + (1 | Subject)MS1: Reaction ~ Days + (1 + Days | Subject) npar AIC BIC logLik deviance Chisq Df Pr(>Chisq) MS0 4 1794 1807 -893 1786 MS1 6 1756 1775 -872 1744 42.8 2 5e-10 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Время реакции у разных людей по-разному зависит от продолжительности бессонницы.
Обычно тесты не делают, набор случайных эффектов определяется устройством данных.
Модели с одинаковой случайной частью, подобранные ML, вложенные. Уровни значимости будут занижены.
MS1.ml <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sl, REML = FALSE)MS0.ml <- lmer(Reaction ~ 1 + (1 + Days | Subject), data = sl, REML = FALSE)anova(MS1.ml, MS0.ml)
Data: slModels:MS0.ml: Reaction ~ 1 + (1 + Days | Subject)MS1.ml: Reaction ~ Days + (1 + Days | Subject) npar AIC BIC logLik deviance Chisq Df Pr(>Chisq) MS0.ml 5 1785 1801 -888 1775 MS1.ml 6 1764 1783 -876 1752 23.5 1 0.0000012 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Время реакции зависит от продолжительности бессонницы.
Модели с одинаковой случайной частью, подобранные ML, вложенные или невложенные.
AIC(MS1.ml, MS0.ml)
df AICMS1.ml 6 1764MS0.ml 5 1785
Время реакции зависит от продолжительности бессонницы (AIC).
Способ тестирования гипотез, при котором из данных многократно получают выборки (с повторениями).
Если по таким многократным выборкам построить распределение статистики, то оно будет стремиться к истинному распределению этой статистики.
Сгенерированное бутстрепом распределение статистики можно использовать для тестирования гипотез.
Бутстреп особенно удобен, когда невозможно получить распределение статистики аналитическим путем.
Чтобы при помощи бутстрепа получить оценку уровня значимости для LRT при сравнении двух моделей Mfull и Mreduced, нужно
1.Многократно повторить:
- сгенерировать новые данные из уменьшенной модели,- по сгенерированным данным подобрать полную и уменьшенную модели и рассчитать LRT.
2.Построить распределение LRT по всем итерациям бутстрепа.
Уровень значимости – это доля итераций, в которых получено LRT больше, чем данное.
В строке PBtest – значение LRT и его уровень значимости, полученный бутстрепом.
library(pbkrtest)pmod <- PBmodcomp(MS1.ml, MS0.ml, nsim = 100) # 1000 и больше для реальных данныхsummary(pmod)
Bootstrap test; time: 1.82 sec; samples: 100; extremes: 0;large : Reaction ~ Days + (1 + Days | Subject)Reaction ~ 1 + (1 + Days | Subject) stat df ddf p.value LRT 23.5 1.0 0.0000012 ***PBtest 23.5 0.00990 ** Gamma 23.5 0.0000048 ***Bartlett 20.1 1.0 0.0000072 ***F 23.5 1.0 13.9 0.00026 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Чтобы при помощи бутстрепа оценить положение зоны, где с 95% вероятностью будут лежать предсказанные значения, нужно:
1.Многократно повторить:
- сгенерировать новые данные из модели- по сгенерированным данным подобрать модель и получить ее предсказания
2.Построить распределение предсказанных значений по всем итерациям бутстрепа.
95% доверительная зона регрессии — это область, куда попали предсказанные значения в 95% итераций (т.е. между 0.025 и 0.975 персентилями).
NewData <- sl %>% group_by(Subject) %>% do(data.frame(Days = seq(min(.$Days), max(.$Days), length = 10)))NewData$fit <- predict(MS1, NewData, type = 'response', re.form = NA)# Многократно симулируем данные из модели и получаем для них предсказанные значенияbMS1 <- bootMer(x = MS1, FUN = function(x) predict(x, new_data = NewData, re.form = NA), nsim = 100)# Рассчитываем квантили предсказанных значений для всех итераций бутстрепаb_se <- apply(X = bMS1$t, MARGIN = 2, FUN = function(x) quantile(x, probs = c(0.025, 0.975), na.rm = TRUE))# Доверительная зона для предсказанных значенийNewData$lwr <- b_se[1, ]NewData$upr <- b_se[2, ]
ggplot(data = NewData, aes(x = Days, y = fit)) + geom_ribbon(alpha = 0.35, aes(ymin = lwr, ymax = upr)) + geom_line() + geom_point(data = sl, aes(x = Days, y = Reaction))
Свойства | Фиксированные факторы | Случайные факторы |
---|---|---|
Уровни фактора | фиксированные, заранее определенные и потенциально воспроизводимые уровни | случайная выборка из всех возможных уровней |
Используются для тестирования гипотез | о средних значениях отклика между уровнями фактора \linebreak H0:μ1=μ2=…=μi=μ | о дисперсии отклика между уровнями фактора H0:σ2rand.fact.=0 |
Выводы можно экстраполировать | только на уровни из анализа | на все возможные уровни |
Число уровней фактора | Осторожно! Если уровней фактора слишком много, то нужно подбирать слишком много коэффициентов — должно быть много данных | Важно! Для точной оценки σ нужно нужно много уровней фактора — не менее 5 |
Смешанные модели могут включать случайные и фиксированные факторы.
Есть два способа подбора коэффициентов в смешанных моделях: ML и REML. Для разных этапов анализа важно, каким именно способом подобрана модель.
Коэффициент внутриклассовой корреляции оценивает, насколько коррелируют друг с другом наблюдения из одной и той же группы случайного фактора.
Keyboard shortcuts
↑, ←, Pg Up, k | Go to previous slide |
↓, →, Pg Dn, Space, j | Go to next slide |
Home | Go to first slide |
End | Go to last slide |
Number + Return | Go to specific slide |
b / m / f | Toggle blackout / mirrored / fullscreen mode |
c | Clone slideshow |
p | Toggle presenter mode |
t | Restart the presentation timer |
?, h | Toggle this help |
o | Tile View: Overview of Slides |
s | Toggle scribble toolbox |
Esc | Back to slideshow |
Обычные линейные модели предполагают, что наблюдения должны быть независимы друг от друга.
Но так происходит совсем не всегда.
Обычные линейные модели предполагают, что наблюдения должны быть независимы друг от друга.
Но так происходит совсем не всегда.
Иногда наблюдения бывают сходны по каким-то признакам:
измерения в разные периоды времени
измерения в разных участках пространства
повторные измерения на одних и тех же субъектах
измерения на разных субъектах, которые сами объединены в группы
Детали, произведенные на одном станке будут более похожи, чем детали, сделанные на разных.
Аналогично, у учеников из одного класса будет более похожий уровень подготовки к какому-нибудь предмету, чем у учеников из разных классов.
Таким образом, можно сказать, что есть корреляции значений внутри групп.
Детали, произведенные на одном станке будут более похожи, чем детали, сделанные на разных.
Аналогично, у учеников из одного класса будет более похожий уровень подготовки к какому-нибудь предмету, чем у учеников из разных классов.
Таким образом, можно сказать, что есть корреляции значений внутри групп.
Игнорировать такую группирующую структуру данных нельзя – можно ошибиться с выводами.
Моделировать группирующие факторы обычными методами тоже нельзя – придется подбирать очень много параметров.
Решение – случайные факторы.
Cейчас давайте на примере убедимся в том, что без случайных факторов бывает сложно справиться с анализом.
В ночь перед нулевым днем всем испытуемым давали поспать нормальное время, а в следующие 9 ночей — только по 3 часа. Каждый день измеряли время реакции в серии тестов. (Данные Belenky et al., 2003)
Как время реакции людей зависит от бессонницы?
Reaction
— среднее время реакции в серии тестов в день наблюдения, мсDays
— число дней депривации снаSubject
— номер испытуемогоlibrary(lme4)data(sleepstudy)sl <- sleepstudystr(sl)
'data.frame': 180 obs. of 3 variables: $ Reaction: num 250 259 251 321 357 ... $ Days : num 0 1 2 3 4 5 6 7 8 9 ... $ Subject : Factor w/ 18 levels "308","309","310",..: 1 1 1 1 1 1 1 1 1 1 ...
# Есть ли пропущенные значения?colSums(is.na(sl))
Reaction Days Subject 0 0 0
# Сколько субъектов?length(unique(sl$Subject))
[1] 18
# Сколько наблюдений для каждого субъекта?table(sl$Subject)
308 309 310 330 331 332 333 334 335 337 349 350 351 352 369 370 371 372 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
library(ggplot2)theme_set(theme_bw(base_size = 14))ggplot(sl, aes(x = Reaction, y = 1:nrow(sl))) + geom_point()
library(ggplot2)theme_set(theme_bw(base_size = 14))ggplot(sl, aes(x = Reaction, y = 1:nrow(sl))) + geom_point()
Мы пока еще не учли информацию о субъектах...
ggplot(sl, aes(x = Reaction, y = Subject, colour = Days)) + geom_point()
ggplot(sl, aes(x = Reaction, y = Subject, colour = Days)) + geom_point()
The Good — подбираем смешанную модель, в которой есть фиксированный фактор Days
и случайный фактор Subject
, который опишет межиндивидуальную изменчивость.
The Bad — игнорируем структуру данных, подбираем модель с единственным фиксированным фактором Days
. (Не учитываем группирующий фактор Subject
). Неправильный вариант.
The Ugly — подбираем модель с двумя фиксированными факторами: Days
и Subject
. (Группирующий фактор Subject
опишет межиндивидуальную изменчивость как обычный фиксированный фактор).
The Good — подбираем смешанную модель, в которой есть фиксированный фактор Days
и случайный фактор Subject
, который опишет межиндивидуальную изменчивость.
The Bad — игнорируем структуру данных, подбираем модель с единственным фиксированным фактором Days
. (Не учитываем группирующий фактор Subject
). Неправильный вариант.
The Ugly — подбираем модель с двумя фиксированными факторами: Days
и Subject
. (Группирующий фактор Subject
опишет межиндивидуальную изменчивость как обычный фиксированный фактор).
The Good — подбираем смешанную модель, в которой есть фиксированный фактор Days
и случайный фактор Subject
, который опишет межиндивидуальную изменчивость.
The Bad — игнорируем структуру данных, подбираем модель с единственным фиксированным фактором Days
. (Не учитываем группирующий фактор Subject
). Неправильный вариант.
The Ugly — подбираем модель с двумя фиксированными факторами: Days
и Subject
. (Группирующий фактор Subject
опишет межиндивидуальную изменчивость как обычный фиксированный фактор).
The Good — подбираем смешанную модель, в которой есть фиксированный фактор Days
и случайный фактор Subject
, который опишет межиндивидуальную изменчивость.
The Bad — игнорируем структуру данных, подбираем модель с единственным фиксированным фактором Days
. (Не учитываем группирующий фактор Subject
). Неправильный вариант.
The Ugly — подбираем модель с двумя фиксированными факторами: Days
и Subject
. (Группирующий фактор Subject
опишет межиндивидуальную изменчивость как обычный фиксированный фактор).
Reactioni=β0+β1Daysi+εi
εi∼N(0,σ)
Reactioni=β0+β1Daysi+εi
εi∼N(0,σ)
В матричном виде это можно записать так:
(Reaction1Reaction2⋮Reaction180)=(1Days11Days2⋮1Days180)(β0β1)+(ε1ε2⋮ε180)
что можно сокращенно записать так:
Reaction=Xββ+εε
W1 <- glm(Reaction ~ Days, data = sl)summary(W1)
Call:glm(formula = Reaction ~ Days, data = sl)Deviance Residuals: Min 1Q Median 3Q Max -110.85 -27.48 1.55 26.14 139.95 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 251.41 6.61 38.03 < 2e-16 ***Days 10.47 1.24 8.45 9.9e-15 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1(Dispersion parameter for gaussian family taken to be 2277) Null deviance: 567954 on 179 degrees of freedomResidual deviance: 405252 on 178 degrees of freedomAIC: 1906Number of Fisher Scoring iterations: 2
Объем выборки завышен (180 наблюдений, вместо 18 субъектов). Стандартные ошибки и уровни значимости занижены. Увеличивается вероятность ошибок I рода.
Нарушено условие независимости наблюдений.
W1 <- glm(Reaction ~ Days, data = sl)summary(W1)
Call:glm(formula = Reaction ~ Days, data = sl)Deviance Residuals: Min 1Q Median 3Q Max -110.85 -27.48 1.55 26.14 139.95 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 251.41 6.61 38.03 < 2e-16 ***Days 10.47 1.24 8.45 9.9e-15 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1(Dispersion parameter for gaussian family taken to be 2277) Null deviance: 567954 on 179 degrees of freedomResidual deviance: 405252 on 178 degrees of freedomAIC: 1906Number of Fisher Scoring iterations: 2
Объем выборки завышен (180 наблюдений, вместо 18 субъектов). Стандартные ошибки и уровни значимости занижены. Увеличивается вероятность ошибок I рода.
Нарушено условие независимости наблюдений.
ggplot(sl, aes(x = Days, y = Reaction)) + geom_point() + geom_smooth(se = TRUE, method = "lm", size = 1)
ggplot(sl, aes(x = Days, y = Reaction)) + geom_point() + geom_smooth(se = TRUE, method = "lm", size = 1)
Доверительная зона регрессии “заужена”.
Большие остатки, т.к. неучтенная межиндивидуальная изменчивость “ушла” в остаточную.
Reactioni=β0+β1Daysi+β2Subj2i+...+β2Subj18i+εi
εi∼N(0,σ)
Reactioni=β0+β1Daysi+β2Subj2i+...+β2Subj18i+εi
εi∼N(0,σ)
В матричном виде это можно записать так:
(Reaction1Reaction2⋮Reaction180)=(1Days1Subj21⋯Subj1811Days2Subj22⋯Subj182⋮1Days180Subj2180⋯Subj18180)(β0β1⋮β18)+(ε1ε2⋮ε180)
То есть: Reaction=Xββ+εε
W2 <- glm(Reaction ~ Days + Subject, data = sl)coef(W2)
(Intercept) Days Subject309 Subject310 295.031 10.467 -126.901 -111.133 Subject330 Subject331 Subject332 Subject333 -38.912 -32.698 -34.832 -25.976 Subject334 Subject335 Subject337 Subject349 -46.832 -92.064 33.587 -66.299 Subject350 Subject351 Subject352 Subject369 -28.531 -52.036 -4.712 -36.099 Subject370 Subject371 Subject372 -50.432 -47.150 -24.248
Фрагмент summary(W2)
:
Residual standard error: 30.99 on 161 degrees of freedomMultiple R-squared: 0.7277, Adjusted R-squared: 0.6973 F-statistic: 23.91 on 18 and 161 DF, p-value: < 2.2e-16
W2 <- glm(Reaction ~ Days + Subject, data = sl)coef(W2)
(Intercept) Days Subject309 Subject310 295.031 10.467 -126.901 -111.133 Subject330 Subject331 Subject332 Subject333 -38.912 -32.698 -34.832 -25.976 Subject334 Subject335 Subject337 Subject349 -46.832 -92.064 33.587 -66.299 Subject350 Subject351 Subject352 Subject369 -28.531 -52.036 -4.712 -36.099 Subject370 Subject371 Subject372 -50.432 -47.150 -24.248
Фрагмент summary(W2)
:
Residual standard error: 30.99 on 161 degrees of freedomMultiple R-squared: 0.7277, Adjusted R-squared: 0.6973 F-statistic: 23.91 on 18 and 161 DF, p-value: < 2.2e-16
20 параметров (18 для Subject
, один для Days
и σ), а наблюдений всего 180.
Нужно минимум 10–20 наблюдений на каждый параметр (Harrell, 2013) — у нас всего 9.
ggplot(fortify(W2), aes(x = Days, colour = Subject)) + geom_line(aes(y = .fitted, group = Subject)) + geom_point(data = sl, aes(y = Reaction)) + guides(colour = guide_legend(ncol = 2))
ggplot(fortify(W2), aes(x = Days, colour = Subject)) + geom_line(aes(y = .fitted, group = Subject)) + geom_point(data = sl, aes(y = Reaction)) + guides(colour = guide_legend(ncol = 2))
До сих пор мы имели дело только с фиксированными факторами.
Мы моделировали средние значения для уровней фиксированного фактора. Если групп было много, то приходилось моделировать много средних значений.
Поступая так, мы считали, что сравниваемые группы – фиксированные, и нам интересны именно сравнения между ними.
Когда нам не важны конкретные значения интерсептов для разных уровней фактора, мы можем представить, что эффект фактора (величина “поправки”) — случайная величина, и можем оценить дисперсию между уровнями группирующего фактора.
Такие факторы называются случайными факторами.
измерения в разные периоды времени
измерения в разных участках пространства
повторные измерения на одних и тех же субъектах
измерения на разных субъектах, которые сами объединены в группы
На один и тот же фактор можно посмотреть и как на фиксированный и как на случайный в зависимости от целей исследователя.
Поскольку моделируя случайный фактор мы оцениваем дисперсию между уровнями, то хорошо, если у случайного фактора будет минимум пять градаций.
Reactionij=β0+β1Daysij+bi+εij
bi∼N(0,σb) — случайный эффект субъекта (случайный отрезок, интерсепт)
εij∼N(0,σ) — остатки модели
i — субъекты, j — дни
Reactionij=β0+β1Daysij+bi+εij
bi∼N(0,σb) — случайный эффект субъекта (случайный отрезок, интерсепт)
εij∼N(0,σ) — остатки модели
i — субъекты, j — дни
В матричном виде это записывается так:
(Reaction1Reaction2⋮Reaction180)=(1Days11Days2⋮1Days180)(β0β1)+(11⋮1)(b)+(ε1ε2⋮ε180)
То есть: Reaction=Xββ+Zb+εε
Используем lmer
из пакета lme4
.
?lmer # справка о lmer
lmer
по умолчанию использует REML для подбора параметров. Это значит, что случайные эффекты будут оценены более точно, чем при использовании ML.
M1 <- lmer(Reaction ~ Days + (1 | Subject), data = sl)
summary(M1)
Linear mixed model fit by REML ['lmerMod']Formula: Reaction ~ Days + (1 | Subject) Data: slREML criterion at convergence: 1786Scaled residuals: Min 1Q Median 3Q Max -3.226 -0.553 0.011 0.519 4.251 Random effects: Groups Name Variance Std.Dev. Subject (Intercept) 1378 37.1 Residual 960 31.0 Number of obs: 180, groups: Subject, 18Fixed effects: Estimate Std. Error t value(Intercept) 251.405 9.747 25.8Days 10.467 0.804 13.0Correlation of Fixed Effects: (Intr)Days -0.371
summary(M1)
Linear mixed model fit by REML ['lmerMod']Formula: Reaction ~ Days + (1 | Subject) Data: slREML criterion at convergence: 1786Scaled residuals: Min 1Q Median 3Q Max -3.226 -0.553 0.011 0.519 4.251 Random effects: Groups Name Variance Std.Dev. Subject (Intercept) 1378 37.1 Residual 960 31.0 Number of obs: 180, groups: Subject, 18Fixed effects: Estimate Std. Error t value(Intercept) 251.405 9.747 25.8Days 10.467 0.804 13.0Correlation of Fixed Effects: (Intr)Days -0.371
Reactionij=251.4+10.5Daysij+bi+εij
bi∼N(0,37.12) — случайный эффект субъекта
εij∼N(0,30.99) — остатки модели
i — субъекты, j — дни
Данные для графика предсказаний фиксированной части модели:
library(dplyr)NewData <- sl %>% group_by(Subject) %>% do(data.frame(Days = seq(min(.$Days), max(.$Days), length = 10)))head(NewData, 3)
# A tibble: 3 × 2# Groups: Subject [1] Subject Days <fct> <dbl>1 308 02 308 13 308 2
?predict.merMod
Функция predict()
в lme4
не считает стандартные ошибки и доверительные интервалы. Это потому, что нет способа адекватно учесть неопределенность, связанную со случайными эффектами.
NewData$fit <- predict(M1, NewData, type = 'response', re.form = NA)head(NewData, 3)
# A tibble: 3 × 3# Groups: Subject [1] Subject Days fit <fct> <dbl> <dbl>1 308 0 251.2 308 1 262.3 308 2 272.
Стандартные ошибки, рассчитанные обычным методом,
позволят получить приблизительные доверительные интервалы.
# Предсказанные значения при помощи матрицX <- model.matrix(~ Days, data = NewData)betas <- fixef(M1)NewData$fit <- X %*% betas# Cтандартные ошибкиNewData$SE <- sqrt( diag(X %*% vcov(M1) %*% t(X)) ) NewData$lwr <- NewData$fit - 2 * NewData$SENewData$upr <- NewData$fit + 2 * NewData$SE
Более точные доверительные интервалы можно получить при помощи бутстрепа.
Мы сделаем это позже для финальной модели.
Здесь доверительный интервал без учета неопределенности, связанной со случайным эффектом. Чтобы ее учесть нужно взять корень из суммы дисперсий фиксированной и случайного эффекта. См. GLMM FAQ
ggplot(data = NewData, aes(x = Days, y = fit)) + geom_ribbon(alpha = 0.35, aes(ymin = lwr, ymax = upr)) + geom_line() + geom_point(data = sl, aes(x = Days, y = Reaction))
Зависимость времени реакции от продолжительности периода бессонницы без учета субъекта:
^Reactionij=251.4+10.5Daysij
NewData$fit_subj <- predict(M1, NewData, type = 'response')ggplot(NewData, aes(x = Days, y = fit_subj)) + geom_ribbon(alpha = 0.3, aes(ymin = lwr, ymax = upr)) + geom_line(aes(colour = Subject)) + geom_point(data = sl, aes(x = Days, y = Reaction, colour = Subject)) + guides(colour = guide_legend(ncol = 2))
Зависимость времени реакции от продолжительности периода бессонницы для обследованных субъектов:
^Reactionij=251.4+10.5Daysij+bi
Случайный фактор помогает учесть взаимозависимость наблюдений для каждого из субъектов – “индуцированные” корреляции.
После анализа остатков модели можно будет понять, стоит ли с ней работать дальше. Одна из потенциальных проблем – время реакции разных субъектов может меняться непараллельно. Возможно, модель придется переформулировать.
Reaction=Xββ+Zb+εε
b∼N(0,D) - случайные эффекты bi нормально распределены со средним 0 и матрицей ковариаций D
εε∼N(0,ΣΣ) - остатки модели нормально распределены со средним 0 и матрицей ковариаций ΣΣ
Reaction=Xββ+Zb+εε
b∼N(0,D) - случайные эффекты bi нормально распределены со средним 0 и матрицей ковариаций D
εε∼N(0,ΣΣ) - остатки модели нормально распределены со средним 0 и матрицей ковариаций ΣΣ
Матрица ковариаций остатков: ΣΣ=σ2⋅(10⋯001⋯0⋮⋮⋱⋮00⋯1)=(σ20⋯00σ2⋯0⋮⋮⋱⋮00⋯σ2)
В матрице ковариаций остатков вне диагонали стоят нули, т.е. ковариация разных остатков равна нулю. Т.е. остатки независимы друг от друга.
ΣΣ=(σ20⋯00σ2⋯0⋮⋮⋱⋮00⋯σ2)
В то же время, отдельные значения переменной-отклика Y уже не будут независимы друг от друга при появлении в модели случайного фактора.
Reaction=Xββ+Zb+εε
b∼N(0,D)
εε∼N(0,ΣΣ)
Можно показать, что переменная-отклик Y нормально распределена:
Y∼N(Xββ,V)
Reaction=Xββ+Zb+εε
b∼N(0,D)
εε∼N(0,ΣΣ)
Можно показать, что переменная-отклик Y нормально распределена:
Y∼N(Xββ,V)
Матрица ковариаций переменной-отклика:
V=ZDZ′+ΣΣ, где D — матрица ковариаций случайных эффектов.
Т.е. добавление случайных эффектов приводит
к изменению ковариационной матрицы V
Кстати, ZDZ′ называется преобразование Холецкого (Cholesky decomposition)
V=ZDZ′+ΣΣ
Для простейшей смешанной модели со случайным отрезком:
V=(11⋮1)⋅σ2b⋅(11⋯1)+σ2⋅(10⋯001⋯0⋮⋮⋱⋮00⋯1)==(σ2+σ2bσ2b⋯σ2bσ2bσ2+σ2b⋯σ2b⋮⋮⋱⋮σ2bσ2bσ2bσ2+σ2b)
V=(σ2+σ2bσ2b⋯σ2bσ2bσ2+σ2b⋯σ2b⋮⋮⋱⋮σ2bσ2bσ2bσ2+σ2b)
Т.е. корреляция между наблюдениями одного субъекта σ2b/(σ2+σ2b)
ICC=σ2b/(σ2+σ2b)
Способ измерить, насколько коррелируют друг с другом наблюдения из одной и той же группы, заданной случайным фактором.
Если ICC низок, то наблюдения очень разные внутри групп, заданных уровнями случайного фактора.
Если ICC высок, то наблюдения очень похожи внутри каждой из групп, заданных случайным фактором.
ICC можно использовать как описательную статистику, но интереснее использовать его при планировании исследований.
Если в пилотном исследовании ICC маленький, то для надежной оценки эффекта этого случайного фактора нужно брать больше наблюдений в группе.
Если в пилотном исследовании ICC большой, то можно брать меньше наблюдений в группе.
summary(M1)
Linear mixed model fit by REML ['lmerMod']Formula: Reaction ~ Days + (1 | Subject) Data: slREML criterion at convergence: 1786Scaled residuals: Min 1Q Median 3Q Max -3.226 -0.553 0.011 0.519 4.251 Random effects: Groups Name Variance Std.Dev. Subject (Intercept) 1378 37.1 Residual 960 31.0 Number of obs: 180, groups: Subject, 18Fixed effects: Estimate Std. Error t value(Intercept) 251.405 9.747 25.8Days 10.467 0.804 13.0Correlation of Fixed Effects: (Intr)Days -0.371
# Случайные эффекты отдельноVarCorr(M1)
Groups Name Std.Dev. Subject (Intercept) 37.1 Residual 31.0
37.124^2 / (37.124^2 + 30.991^2)
[1] 0.5893
Есть функции для ICC, подождем, когда они станут пакетом. https://github.com/timothyslau/ICC.merMod
M1_diag <- data.frame( sl, .fitted = predict(M1), .resid = resid(M1, type = 'pearson'), .scresid = resid(M1, type = 'pearson', scaled = TRUE))head(M1_diag, 4)
Reaction Days Subject .fitted .resid .scresid1 249.6 0 308 292.2 -42.629 -1.37552 258.7 1 308 302.7 -43.951 -1.41823 250.8 2 308 313.1 -62.323 -2.01104 321.4 3 308 323.6 -2.151 -0.0694
.fitted
— предсказанные значения..resid
— Пирсоновские остатки..scresid
— стандартизованные Пирсоновские остатки.gg_resid <- ggplot(M1_diag, aes(y = .scresid)) + geom_hline(yintercept = 0)gg_resid + geom_point(aes(x = .fitted))
gg_resid <- ggplot(M1_diag, aes(y = .scresid)) + geom_hline(yintercept = 0)gg_resid + geom_point(aes(x = .fitted))
gg_resid + geom_boxplot(aes(x = factor(Days)))
gg_resid + geom_boxplot(aes(x = factor(Days)))
gg_resid + geom_boxplot(aes(x = Subject))
gg_resid + geom_boxplot(aes(x = Subject))
На графике индивидуальных эффектов было видно, что измерения для разных субъектов, возможно, идут непараллельно. Усложним модель — добавим случайные изменения угла наклона для каждого из субъектов.
Это можно биологически объяснить. Возможно, в зависимости от продолжительности бессонницы у разных субъектов скорость реакции будет ухудшаться разной скоростью: одни способны выдержать 9 дней почти без потерь, а другим уже пары дней может быть достаточно.
Reactionij=β0+β1Daysij+bi+cijDaysij+εij
bi∼N(0,σb) — случайный интерсепт для субъекта
cij∼N(0,σc) — случайный угол наклона для субъекта
εij∼N(0,σ) — остатки модели
i — субъекты, j — дни
Reactionij=β0+β1Daysij+bi+cijDaysij+εij
bi∼N(0,σb) — случайный интерсепт для субъекта
cij∼N(0,σc) — случайный угол наклона для субъекта
εij∼N(0,σ) — остатки модели
i — субъекты, j — дни
В матричном виде это записывается так:
(Reaction1Reaction2⋮Reaction180)=(1Days11Days2⋮1Days180)(β0β1)+(1Days11Days2⋮1Days180)(bc)+(ε1ε2⋮ε180)
То есть: Reaction=Xββ+Zb+εε
Формат записи формулы для случайных эффектов в lme4
(1 + угловой_коэффициент | отрезок)
MS1 <- lmer(Reaction ~ Days + ( 1 + Days|Subject), data = sl)
summary(MS1)
Linear mixed model fit by REML ['lmerMod']Formula: Reaction ~ Days + (1 + Days | Subject) Data: slREML criterion at convergence: 1744Scaled residuals: Min 1Q Median 3Q Max -3.954 -0.463 0.023 0.463 5.179 Random effects: Groups Name Variance Std.Dev. Corr Subject (Intercept) 612.1 24.74 Days 35.1 5.92 0.07 Residual 654.9 25.59 Number of obs: 180, groups: Subject, 18Fixed effects: Estimate Std. Error t value(Intercept) 251.41 6.82 36.84Days 10.47 1.55 6.77Correlation of Fixed Effects: (Intr)Days -0.138
Reactionij=251.4+10.5Daysij+bi+cijDaysij+εij
bi∼N(0,24.74) — случайный интерсепт для субъекта
cij∼N(0,5.92) — случайный угол наклона для субъекта
εij∼N(0,25.59) — остатки модели
i — субъекты, j — дни
library(dplyr)NewData <- sl %>% group_by(Subject) %>% do(data.frame(Days = seq(min(.$Days), max(.$Days), length = 10)))NewData$fit <- predict(MS1, NewData, type = 'response', re.form = NA)head(NewData, 3)
# A tibble: 3 × 3# Groups: Subject [1] Subject Days fit <fct> <dbl> <dbl>1 308 0 251.2 308 1 262.3 308 2 272.
Вычислим приблизительные доверительные интервалы.
# Предсказанные значения при помощи матрицX <- model.matrix(~ Days, data = NewData)betas <- fixef(MS1)NewData$fit <- X %*% betas# Cтандартные ошибкиNewData$SE <- sqrt( diag(X %*% vcov(MS1) %*% t(X)) ) NewData$lwr <- NewData$fit - 2 * NewData$SENewData$upr <- NewData$fit + 2 * NewData$SE
Более точные доверительные интервалы можно получить при помощи бутстрепа.
Здесь доверительный интервал без учета неопределенности, связанной со случайным эффектом. Чтобы ее учесть нужно взять корень из суммы дисперсий фиксированной и случайного эффекта. См. GLMM FAQ
ggplot(data = NewData, aes(x = Days, y = fit)) + geom_ribbon(alpha = 0.35, aes(ymin = lwr, ymax = upr)) + geom_line() + geom_point(data = sl, aes(x = Days, y = Reaction))
Зависимость времени реакции от продолжительности периода бессонницы без учета субъекта:
^Reactionij=251.4+10.5Daysij
NewData$fit_subj <- predict(MS1, NewData, type = 'response')ggplot(NewData, aes(x = Days, y = fit_subj)) + geom_ribbon(alpha = 0.3, aes(ymin = lwr, ymax = upr)) + geom_line(aes(colour = Subject)) + geom_point(data = sl, aes(x = Days, y = Reaction, colour = Subject)) + guides(colour = guide_legend(ncol = 2))
Зависимость времени реакции от продолжительности периода бессонницы для обследованных субъектов:
^Reactionij=251.4+10.5Daysij+bi+cijDaysij
MS1_diag <- data.frame( sl, .fitted = predict(MS1), .resid = resid(MS1, type = 'pearson'), .scresid = resid(MS1, type = 'pearson', scaled = TRUE))head(MS1_diag, 4)
Reaction Days Subject .fitted .resid .scresid1 249.6 0 308 253.7 -4.104 -0.16042 258.7 1 308 273.3 -14.625 -0.57153 250.8 2 308 293.0 -42.196 -1.64884 321.4 3 308 312.7 8.777 0.3430
gg_resid <- ggplot(MS1_diag, aes(y = .scresid)) + geom_hline(yintercept = 0)gg_resid + geom_point(aes(x = .fitted))
gg_resid <- ggplot(MS1_diag, aes(y = .scresid)) + geom_hline(yintercept = 0)gg_resid + geom_point(aes(x = .fitted))
gg_resid + geom_boxplot(aes(x = factor(Days)))
gg_resid + geom_boxplot(aes(x = factor(Days)))
gg_resid + geom_boxplot(aes(x = Subject))
Смешанными называются модели, включающие случайные факторы.
Общие смешанные модели (General Linear Mixed Models) — только нормальное распределение зависимой переменной.
Обобщенные смешанные модели (Generalized Linear Mixed Models) — распределения зависимой переменной могут быть другими (из семейства экспоненциальных распределений).
Y=Xββ+Zb+εε
b∼N(0,D) — случайные эффекты нормально распределены со средним 0 и матрицей ковариаций D (ее диагональные элементы – стандартное отклонение σb).
εε∼N(0,ΣΣ) — остатки модели нормально распределены со средним 0 и матрицей ковариаций ΣΣ (ее диагональные элементы – стандартное отклонение σ).
Xββ — фиксированная часть модели.
Zb+εε — случайная часть модели.
В зависимости от устройства модельной матрицы для случайных эффектов Z смешанные модели делят на модели со случайным отрезком и случайным углом наклона.
Метод максимального правдоподобия (Maximum Likelihood, ML)
Метод ограниченного максимального правдоподобия (Restricted Maximum Likelihood, REML)
Faraway, 2017, p.196
Правдоподобие (likelihood) — измеряет соответствие реально наблюдаемых данных тем, что можно получить из модели при определенных значениях параметров.
Это произведение вероятностей данных:
L(θ|yi)=Πni=1f(yi|θ)
Параметры модели должны максимизировать значение логарифма правдоподобия (loglikelihood):
lnL(θ|yi)⟶max
Например, ML оценка обычной выборочной дисперсии будет смещенной:
ˆσ2=∑(xi−ˉx)2n,
т.к. в знаменателе не n−1, а n.
Аналогичные проблемы возникают при ML оценках для случайных эффектов в линейных моделях.
Это происходит потому, что в смешанной линейной модели
Y=Xββ+Zb+εε
Y∼N(Xββ,V), где V=ZDZ′+ΣΣ
т.е. одновременно приходится оценивать ββ и V.
Y=Xββ+Zb+εε
Y∼N(Xββ,V), где ZDZ′+ΣΣ
Если найти матрицу A, ортогональную к X′ (т.е. A′X=0), то умножив ее на Y можно избавиться от ββ:
A′Y=A′Xββ+A′V=0+A′V=A′V
A′Y∼N(0,A′VA)
Тогда можно воспользоваться ML, чтобы найти V.
В результате получатся несмещенные оценки дисперсий.
REML-оценки ββ будут стремится к ML-оценкам при увеличении объема выборки.
Если нужны точные оценки фиксированных эффектов – ML.
Если нужны точные оценки случайных эффектов – REML.
Если нужно работать с правдоподобиями – следите, чтобы в моделях, подобранных REML была одинаковая фиксированная часть.
Для обобщенных (негауссовых) смешанных линейных моделей REML не определен – там используется ML.
Тесты, которые традиционно применяются для GLM, дадут лишь приблизительные результаты для GLMM:
Поэтому для отбора моделей применяют подход, не связанный с тестами:
Наиболее точные результаты тестов можно получить, используя “золотой стандарт”:
H0:βk=0, HA:βk≠0
bkSEbk∼N(0,1) или bkSEbk∼t(df=n−p), если нужно оценивать σ
bk — оценка коэффициента, n — объем выборки, p — число параметров модели.
t-(или -z) тесты Вальда дают лишь приблизительный результат,
поэтому в пакете lme4
даже не приводят уровни значимости в summary()
.
Не рекомендуется ими пользоваться.
coef(summary(MS1))
Estimate Std. Error t value(Intercept) 251.41 6.825 36.838Days 10.47 1.546 6.771
LRT=2ln(LM1LM2)=2(lnLM1−lnLM2)
Распределение LRT аппроксимируют распределением χ2 с df=dfM2−dfM1.
LRT консервативен для случайных эффектов, т.к. тест гипотезы вида H0:ˆσ2k=0 происходит на границе области возможных значений параметра.
LRT либерален для фиксированных эффектов,
дает заниженные уровни значимости.
Модели с одинаковой фиксированной частью, подобранные REML, вложенные. Уровни значимости будут завышены.
MS1 <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sl, REML = TRUE)MS0 <- lmer(Reaction ~ Days + (1 | Subject), data = sl, REML = TRUE)anova(MS1, MS0, refit = FALSE)
Data: slModels:MS0: Reaction ~ Days + (1 | Subject)MS1: Reaction ~ Days + (1 + Days | Subject) npar AIC BIC logLik deviance Chisq Df Pr(>Chisq) MS0 4 1794 1807 -893 1786 MS1 6 1756 1775 -872 1744 42.8 2 5e-10 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Время реакции у разных людей по-разному зависит от продолжительности бессонницы.
Обычно тесты не делают, набор случайных эффектов определяется устройством данных.
Модели с одинаковой случайной частью, подобранные ML, вложенные. Уровни значимости будут занижены.
MS1.ml <- lmer(Reaction ~ Days + (1 + Days | Subject), data = sl, REML = FALSE)MS0.ml <- lmer(Reaction ~ 1 + (1 + Days | Subject), data = sl, REML = FALSE)anova(MS1.ml, MS0.ml)
Data: slModels:MS0.ml: Reaction ~ 1 + (1 + Days | Subject)MS1.ml: Reaction ~ Days + (1 + Days | Subject) npar AIC BIC logLik deviance Chisq Df Pr(>Chisq) MS0.ml 5 1785 1801 -888 1775 MS1.ml 6 1764 1783 -876 1752 23.5 1 0.0000012 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Время реакции зависит от продолжительности бессонницы.
Модели с одинаковой случайной частью, подобранные ML, вложенные или невложенные.
AIC(MS1.ml, MS0.ml)
df AICMS1.ml 6 1764MS0.ml 5 1785
Время реакции зависит от продолжительности бессонницы (AIC).
Способ тестирования гипотез, при котором из данных многократно получают выборки (с повторениями).
Если по таким многократным выборкам построить распределение статистики, то оно будет стремиться к истинному распределению этой статистики.
Сгенерированное бутстрепом распределение статистики можно использовать для тестирования гипотез.
Бутстреп особенно удобен, когда невозможно получить распределение статистики аналитическим путем.
Чтобы при помощи бутстрепа получить оценку уровня значимости для LRT при сравнении двух моделей Mfull и Mreduced, нужно
1.Многократно повторить:
- сгенерировать новые данные из уменьшенной модели,- по сгенерированным данным подобрать полную и уменьшенную модели и рассчитать LRT.
2.Построить распределение LRT по всем итерациям бутстрепа.
Уровень значимости – это доля итераций, в которых получено LRT больше, чем данное.
В строке PBtest – значение LRT и его уровень значимости, полученный бутстрепом.
library(pbkrtest)pmod <- PBmodcomp(MS1.ml, MS0.ml, nsim = 100) # 1000 и больше для реальных данныхsummary(pmod)
Bootstrap test; time: 1.82 sec; samples: 100; extremes: 0;large : Reaction ~ Days + (1 + Days | Subject)Reaction ~ 1 + (1 + Days | Subject) stat df ddf p.value LRT 23.5 1.0 0.0000012 ***PBtest 23.5 0.00990 ** Gamma 23.5 0.0000048 ***Bartlett 20.1 1.0 0.0000072 ***F 23.5 1.0 13.9 0.00026 ***---Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Чтобы при помощи бутстрепа оценить положение зоны, где с 95% вероятностью будут лежать предсказанные значения, нужно:
1.Многократно повторить:
- сгенерировать новые данные из модели- по сгенерированным данным подобрать модель и получить ее предсказания
2.Построить распределение предсказанных значений по всем итерациям бутстрепа.
95% доверительная зона регрессии — это область, куда попали предсказанные значения в 95% итераций (т.е. между 0.025 и 0.975 персентилями).
NewData <- sl %>% group_by(Subject) %>% do(data.frame(Days = seq(min(.$Days), max(.$Days), length = 10)))NewData$fit <- predict(MS1, NewData, type = 'response', re.form = NA)# Многократно симулируем данные из модели и получаем для них предсказанные значенияbMS1 <- bootMer(x = MS1, FUN = function(x) predict(x, new_data = NewData, re.form = NA), nsim = 100)# Рассчитываем квантили предсказанных значений для всех итераций бутстрепаb_se <- apply(X = bMS1$t, MARGIN = 2, FUN = function(x) quantile(x, probs = c(0.025, 0.975), na.rm = TRUE))# Доверительная зона для предсказанных значенийNewData$lwr <- b_se[1, ]NewData$upr <- b_se[2, ]
ggplot(data = NewData, aes(x = Days, y = fit)) + geom_ribbon(alpha = 0.35, aes(ymin = lwr, ymax = upr)) + geom_line() + geom_point(data = sl, aes(x = Days, y = Reaction))
Свойства | Фиксированные факторы | Случайные факторы |
---|---|---|
Уровни фактора | фиксированные, заранее определенные и потенциально воспроизводимые уровни | случайная выборка из всех возможных уровней |
Используются для тестирования гипотез | о средних значениях отклика между уровнями фактора \linebreak H0:μ1=μ2=…=μi=μ | о дисперсии отклика между уровнями фактора H0:σ2rand.fact.=0 |
Выводы можно экстраполировать | только на уровни из анализа | на все возможные уровни |
Число уровней фактора | Осторожно! Если уровней фактора слишком много, то нужно подбирать слишком много коэффициентов — должно быть много данных | Важно! Для точной оценки σ нужно нужно много уровней фактора — не менее 5 |
Смешанные модели могут включать случайные и фиксированные факторы.
Есть два способа подбора коэффициентов в смешанных моделях: ML и REML. Для разных этапов анализа важно, каким именно способом подобрана модель.
Коэффициент внутриклассовой корреляции оценивает, насколько коррелируют друг с другом наблюдения из одной и той же группы случайного фактора.