Вы можете проверить значимость параметров модели с помощью оценочных доверительных интервалов, для которых у пакета lme4 есть confint.merMod
функция.
начальная загрузка (см., например, доверительный интервал из начальной загрузки )
> confint(m, method="boot", nsim=500, oldNames= FALSE)
Computing bootstrap confidence intervals ...
2.5 % 97.5 %
sd_(Intercept)|participant_id 0.32764600 0.64763277
cor_conditionexperimental.(Intercept)|participant_id -1.00000000 1.00000000
sd_conditionexperimental|participant_id 0.02249989 0.46871800
sigma 0.97933979 1.08314696
(Intercept) -0.29669088 0.06169473
conditionexperimental 0.26539992 0.60940435
Профиль вероятности (см., например, Какова связь между вероятностью профиля и доверительными интервалами? )
> confint(m, method="profile", oldNames= FALSE)
Computing profile confidence intervals ...
2.5 % 97.5 %
sd_(Intercept)|participant_id 0.3490878 0.66714551
cor_conditionexperimental.(Intercept)|participant_id -1.0000000 1.00000000
sd_conditionexperimental|participant_id 0.0000000 0.49076950
sigma 0.9759407 1.08217870
(Intercept) -0.2999380 0.07194055
conditionexperimental 0.2707319 0.60727448
Существует также метод, 'Wald'
но он применяется только к фиксированным эффектам.
Также в пакете, lmerTest
который назван, существует какой-то тип выражения «анова» (отношение правдоподобия) ranova
. Но я не могу понять, имеет ли смысл из этого. Распределение различий в logLikelihood, когда нулевая гипотеза (нулевая дисперсия для случайного эффекта) истинна, не распределяется по хи-квадрат (возможно, когда число участников и испытаний велико, проверка отношения правдоподобия может иметь смысл).
Дисперсия в определенных группах
Чтобы получить результаты для дисперсии в определенных группах, вы можете перепараметрировать
# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
Там, где мы добавили два столбца к фрейму данных (это необходимо, только если вы хотите оценить некоррелированные «контрольные» и «экспериментальные», функция (0 + condition || participant_id)
не приведет к оценке различных факторов в состоянии как некоррелированных)
#adding extra columns for control and experimental
d <- cbind(d,as.numeric(d$condition=='control'))
d <- cbind(d,1-as.numeric(d$condition=='control'))
names(d)[c(4,5)] <- c("control","experimental")
Теперь lmer
даст дисперсию для разных групп
> m <- lmer(paste("sim_1 ", fml1), data=d)
> m
Linear mixed model fit by REML ['lmerModLmerTest']
Formula: paste("sim_1 ", fml1)
Data: d
REML criterion at convergence: 2408.186
Random effects:
Groups Name Std.Dev.
participant_id control 0.4963
participant_id.1 experimental 0.4554
Residual 1.0268
Number of obs: 800, groups: participant_id, 40
Fixed Effects:
(Intercept) conditionexperimental
-0.114 0.439
И вы можете применить методы профиля к ним. Например, теперь confint дает доверительные интервалы для контроля и экспериментальной дисперсии.
> confint(m, method="profile", oldNames= FALSE)
Computing profile confidence intervals ...
2.5 % 97.5 %
sd_control|participant_id 0.3490873 0.66714568
sd_experimental|participant_id 0.3106425 0.61975534
sigma 0.9759407 1.08217872
(Intercept) -0.2999382 0.07194076
conditionexperimental 0.1865125 0.69149396
Простота
Вы можете использовать функцию правдоподобия для получения более сложных сравнений, но есть много способов сделать приближения вдоль дороги (например, вы можете сделать консервативный тест anova / lrt-тест, но вы этого хотите?).
На данный момент это заставляет меня задуматься, в чем же смысл этого (не очень распространенного) сравнения между дисперсиями. Интересно, не станет ли это слишком сложным? Почему разница между дисперсиями, а не соотношение между дисперсиями (что относится к классическому F-распределению)? Почему бы просто не сообщить доверительные интервалы? Мы должны сделать шаг назад и прояснить данные и историю, которую они должны рассказать, прежде чем идти по продвинутым путям, которые могут быть излишними и плохо связаны со статистическим вопросом и статистическими соображениями, которые фактически являются главной темой.
Интересно, нужно ли делать гораздо больше, чем просто указывать доверительные интервалы (которые на самом деле могут сказать гораздо больше, чем тест на гипотезу. Тест на гипотезу дает ответ «да, нет», но не дает информации о фактическом разбросе населения. При наличии достаточного количества данных вы можете сделать небольшую разницу, которая будет отмечена как существенная разница). Для более глубокого изучения вопроса (для каких-либо целей), как мне кажется, требуется более конкретный (узко определенный) исследовательский вопрос для того, чтобы научить математические механизмы делать надлежащие упрощения (даже когда точный расчет возможен или когда он может быть аппроксимирован симуляцией / начальной загрузкой, даже в некоторых случаях это требует некоторой соответствующей интерпретации). Сравните с точным тестом Фишера, чтобы точно решить (конкретный) вопрос (о таблицах непредвиденных обстоятельств),
Простой пример
Чтобы представить пример возможной простоты, я приведу ниже сравнение (путем моделирования) с простой оценкой разницы между двумя групповыми отклонениями на основе F-теста, выполненного путем сравнения отклонений в отдельных средних ответах и выполненного путем сравнения На смешанной модели выведены дисперсии.
J
Y^я , дж∼ N( μJ, σ2J+ σ2ε10)
σεσJj = { 1 , 2 }
Вы можете увидеть это в моделировании приведенного ниже графика, где помимо F-показателя, основанного на выборке, F-показатель рассчитывается на основе прогнозируемых отклонений (или сумм квадратов ошибок) из модели.
σJ = 1= σJ = 2= 0,5σε= 1
Вы можете видеть, что есть некоторая разница. Эта разница может быть связана с тем, что линейная модель смешанных эффектов получает суммы квадратов ошибок (для случайного эффекта) другим способом. И эти квадратные условия ошибки (больше) не выражены как простое распределение хи-квадрат, но все же тесно связаны, и их можно аппроксимировать.
σJ = 1≠ σJ = 2Y^я , джσJσε
σJ = 1= 0,5σJ = 2= 0,25σε= 1
Так что модель, основанная на средствах, очень точная. Но это менее мощно. Это показывает, что правильная стратегия зависит от того, что вы хотите / нужно.
В приведенном выше примере, когда вы устанавливаете границы правого хвоста в 2,1 и 3,1, вы получаете примерно 1% населения в случае равной дисперсии (соответственно, 103 и 104 из 10 000 случаев), но в случае неравной дисперсии эти границы отличаются много (дает 5334 и 6716 случаев)
код:
set.seed(23432)
# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
fml <- "~ condition + (condition | participant_id)"
n <- 10000
theta_m <- matrix(rep(0,n*2),n)
theta_f <- matrix(rep(0,n*2),n)
# initial data frame later changed into d by adding a sixth sim_1 column
ds <- expand.grid(participant_id=1:40, trial_num=1:10)
ds <- rbind(cbind(ds, condition="control"), cbind(ds, condition="experimental"))
#adding extra columns for control and experimental
ds <- cbind(ds,as.numeric(ds$condition=='control'))
ds <- cbind(ds,1-as.numeric(ds$condition=='control'))
names(ds)[c(4,5)] <- c("control","experimental")
# defining variances for the population of individual means
stdevs <- c(0.5,0.5) # c(control,experimental)
pb <- txtProgressBar(title = "progress bar", min = 0,
max = n, style=3)
for (i in 1:n) {
indv_means <- c(rep(0,40)+rnorm(40,0,stdevs[1]),rep(0.5,40)+rnorm(40,0,stdevs[2]))
fill <- indv_means[d[,1]+d[,5]*40]+rnorm(80*10,0,sqrt(1)) #using a different way to make the data because the simulate is not creating independent data in the two groups
#fill <- suppressMessages(simulate(formula(fml),
# newparams=list(beta=c(0, .5),
# theta=c(.5, 0, 0),
# sigma=1),
# family=gaussian,
# newdata=ds))
d <- cbind(ds, fill)
names(d)[6] <- c("sim_1")
m <- lmer(paste("sim_1 ", fml1), data=d)
m
theta_m[i,] <- m@theta^2
imeans <- aggregate(d[, 6], list(d[,c(1)],d[,c(3)]), mean)
theta_f[i,1] <- var(imeans[c(1:40),3])
theta_f[i,2] <- var(imeans[c(41:80),3])
setTxtProgressBar(pb, i)
}
close(pb)
p1 <- hist(theta_f[,1]/theta_f[,2], breaks = seq(0,6,0.06))
fr <- theta_m[,1]/theta_m[,2]
fr <- fr[which(fr<30)]
p2 <- hist(fr, breaks = seq(0,30,0.06))
plot(-100,-100, xlim=c(0,6), ylim=c(0,800),
xlab="F-score", ylab = "counts [n out of 10 000]")
plot( p1, col=rgb(0,0,1,1/4), xlim=c(0,6), ylim=c(0,800), add=T) # means based F-score
plot( p2, col=rgb(1,0,0,1/4), xlim=c(0,6), ylim=c(0,800), add=T) # model based F-score
fr <- seq(0, 4, 0.01)
lines(fr,df(fr,39,39)*n*0.06,col=1)
legend(2, 800, c("means based F-score","mixed regression based F-score"),
fill=c(rgb(0,0,1,1/4),rgb(1,0,0,1/4)),box.col =NA, bg = NA)
legend(2, 760, c("F(39,39) distribution"),
lty=c(1),box.col = NA,bg = NA)
title(expression(paste(sigma[1]==0.5, " , ", sigma[2]==0.5, " and ", sigma[epsilon]==1)))