Możesz przetestować istotność parametrów modelu za pomocą oszacowanych przedziałów ufności, dla których pakiet lme4 ma confint.merMod
funkcję.
ładowanie (patrz na przykład przedział ufności z ładowania )
> 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
profil prawdopodobieństwa (patrz na przykład jaki jest związek między prawdopodobieństwem profilu a przedziałami ufności? )
> 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
Istnieje również metoda, 'Wald'
ale jest ona stosowana tylko do stałych efektów.
Istnieją również jakąś ANOVA (współczynnik prawdopodobieństwa) typu wypowiedzi w opakowaniu lmerTest
, które jest imieniem ranova
. Ale nie wydaje mi się, żeby to miało sens. Rozkład różnic w logLikelihood, kiedy hipoteza zerowa (zerowa wariancja dla efektu losowego) jest prawdziwa, nie jest rozkładem chi-kwadrat (być może, gdy liczba uczestników i prób jest wysoka, test współczynnika prawdopodobieństwa może mieć sens).
Odchylenie w określonych grupach
Aby uzyskać wyniki dla wariancji w określonych grupach, możesz ponownie sparametryzować
# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
Tam, gdzie dodaliśmy dwie kolumny do ramki danych (jest to potrzebne tylko, jeśli chcesz ocenić nieskorelowaną „kontrolę” i „eksperymentalną”, funkcja (0 + condition || participant_id)
nie prowadziłaby do oceny różnych czynników w stanie jako nieskorelowanych)
#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")
Teraz lmer
poda wariancję dla różnych grup
> 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
Możesz zastosować do nich metody profilowania. Na przykład teraz confint daje przedziały ufności dla wariancji kontrolnej i ćwiczeniowej.
> 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
Prostota
Możesz użyć funkcji wiarygodności, aby uzyskać bardziej zaawansowane porównania, ale istnieje wiele sposobów przybliżenia drogi (np. Możesz wykonać konserwatywny test anova / lrt, ale czy tego właśnie chcesz?).
W tym momencie zastanawiam się, jaki jest sens tego (nie tak powszechnego) porównania między wariancjami. Zastanawiam się, czy zaczyna być zbyt wyrafinowane. Dlaczego różnica między wariancjami zamiast stosunku między wariancjami (która odnosi się do klasycznego rozkładu F)? Dlaczego nie zgłosić przedziałów ufności? Musimy cofnąć się o krok i wyjaśnić dane oraz historię, którą powinien opowiedzieć, zanim przejdziemy do zaawansowanych ścieżek, które mogą być zbędne i luźne w kontakcie z materią statystyczną i względami statystycznymi, które w rzeczywistości są głównym tematem.
Zastanawiam się, czy należy zrobić coś więcej niż zwykłe określanie przedziałów ufności (które mogą w rzeczywistości powiedzieć znacznie więcej niż test hipotez. Test hipotez daje odpowiedź tak, nie, ale brak informacji o rzeczywistym rozprzestrzenianiu się populacji. Biorąc pod uwagę wystarczającą ilość danych, które możesz nieznaczną różnicę należy zgłosić jako znaczącą różnicę). Zagłębianie się bardziej w materię (w jakimkolwiek celu) wymaga, moim zdaniem, bardziej szczegółowego (wąsko zdefiniowanego) pytania badawczego, aby poprowadzić maszynę matematyczną do wprowadzenia odpowiednich uproszczeń (nawet jeśli dokładne obliczenia mogą być wykonalne lub gdy można to przybliżyć za pomocą symulacji / ładowania początkowego, nawet w niektórych ustawieniach nadal wymaga to odpowiedniej interpretacji). Porównaj z dokładnym testem Fishera, aby dokładnie rozwiązać (szczególne) pytanie (dotyczące tabel awaryjnych),
Prosty przykład
Aby podać przykład możliwej prostoty, pokazuję poniżej porównanie (symulacje) z prostą oceną różnicy między dwiema wariancjami grupowymi w oparciu o test F przeprowadzony przez porównanie wariancji poszczególnych średnich odpowiedzi i dokonany przez porównanie wariancje pochodne modelu mieszanego.
jot
Y^ja , j∼ N.( μjot, σ2)jot+ σ2)ϵ10)
σϵσjotj = { 1 , 2 }
Możesz to zobaczyć w symulacji na poniższym wykresie, gdzie pomijając F-score na podstawie próbki oznacza, że F-score jest obliczany na podstawie przewidywanych wariancji (lub sum błędu kwadratu) z modelu.
σj = 1= σj = 2= 0,5σϵ= 1
Widać, że jest jakaś różnica. Różnica ta może wynikać z faktu, że model liniowy efektów mieszanych uzyskuje sumy błędu kwadratu (dla efektu losowego) w inny sposób. Te kwadratowe wyrażenia błędu nie są (już) dobrze wyrażone jako prosty rozkład chi-kwadrat, ale nadal są ściśle powiązane i można je aproksymować.
σj = 1≠ σj = 2Y^ja , jσjotσϵ
σj = 1= 0,5σj = 2= 0,25σϵ= 1
Model oparty na średnich jest więc bardzo dokładny. Ale jest mniej potężny. To pokazuje, że właściwa strategia zależy od tego, czego chcesz / potrzebujesz.
W powyższym przykładzie, gdy ustawisz prawą granicę ogona na 2.1 i 3.1, otrzymasz około 1% populacji w przypadku równej wariancji (odpowiednio 103 i 104 z 10 000 przypadków), ale w przypadku nierównej wariancji granice te różnią się dużo (dając 5334 i 6716 spraw)
kod:
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)))