Sie können die Signifikanz von Modellparametern mit Hilfe von geschätzten Konfidenzintervallen testen, für die das lme4-Paket die confint.merMod
Funktion hat.
Bootstrapping (siehe zum Beispiel Konfidenzintervall vom Bootstrap )
> 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
Wahrscheinlichkeitsprofil (siehe z. B. Welche Beziehung besteht zwischen der Wahrscheinlichkeit des Profils und den Konfidenzintervallen? )
> 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
Es gibt auch eine Methode, die 'Wald'
jedoch nur auf feste Effekte angewendet wird.
Es gibt auch eine Art von Anova-Ausdruck (Likelihood-Verhältnis) in dem Paket, lmerTest
das benannt ist ranova
. Aber ich kann nicht scheinen, einen Sinn daraus zu machen. Die Verteilung der Unterschiede in logLikelihood ist, wenn die Nullhypothese (Nullvarianz für den Zufallseffekt) wahr ist, nicht Chi-Quadrat-verteilt (möglicherweise ist der Likelihood-Ratio-Test sinnvoll, wenn die Anzahl der Teilnehmer und Versuche hoch ist).
Varianz in bestimmten Gruppen
Um Ergebnisse für die Varianz in bestimmten Gruppen zu erhalten, können Sie diese neu parametrisieren
# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
Wenn wir dem Datenrahmen zwei Spalten hinzugefügt haben (dies ist nur erforderlich, wenn Sie die nicht korrelierte "Kontrolle" und "experimentell" bewerten möchten. Die Funktion (0 + condition || participant_id)
würde nicht zur Bewertung der verschiedenen Faktoren in der Bedingung als nicht korreliert führen.)
#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")
Nun lmer
wird die Varianz für die verschiedenen Gruppen angegeben
> 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
Und Sie können die Profilmethoden auf diese anwenden. Zum Beispiel gibt Confint jetzt Konfidenzintervalle für die Kontrolle und die experimentelle Varianz an.
> 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
Einfachheit
Sie könnten die Likelihood-Funktion verwenden, um genauere Vergleiche zu erhalten, aber es gibt viele Möglichkeiten, Annäherungen auf der Straße vorzunehmen (z. B. könnten Sie einen konservativen Anova- / Lrt-Test durchführen, aber ist das das, was Sie wollen?).
An dieser Stelle frage ich mich, worum es eigentlich bei diesem (nicht so häufigen) Vergleich von Varianzen geht. Ich frage mich, ob es zu raffiniert wird. Warum der Unterschied zwischen Varianzen anstelle des Verhältnisses zwischen Varianzen (was sich auf die klassische F-Verteilung bezieht)? Warum nicht einfach Konfidenzintervalle melden? Wir müssen einen Schritt zurücktreten und die Daten und die Geschichte, die sie erzählen sollen, klären, bevor wir auf fortgeschrittene Pfade eingehen, die überflüssig sind und den Kontakt mit der statistischen Materie und den statistischen Überlegungen verlieren, die eigentlich das Hauptthema sind.
Ich frage mich, ob man viel mehr tun sollte, als nur die Konfidenzintervalle anzugeben (die tatsächlich viel mehr aussagen als einen Hypothesentest. Ein Hypothesentest gibt eine Ja-Nein-Antwort, aber keine Information über die tatsächliche Ausbreitung der Population. Wenn Sie genügend Daten haben, können Sie einen geringfügigen Unterschied machen, der als signifikanter Unterschied ausgewiesen wird). Um tiefer in die Materie einzusteigen (für welchen Zweck auch immer), bedarf es meines Erachtens einer spezifischeren (eng definierten) Forschungsfrage, um den mathematischen Maschinen die richtigen Vereinfachungen zu geben (auch wenn eine genaue Berechnung möglich ist oder wann) es könnte durch Simulationen / Bootstrapping angenähert werden, selbst dann bedarf es in einigen Einstellungen noch einer angemessenen Interpretation). Vergleichen Sie mit dem genauen Test von Fisher, um eine (bestimmte) Frage (über Kontingenztabellen) genau zu lösen.
Einfaches Beispiel
Um ein Beispiel für die Einfachheit zu geben, die möglich ist, zeige ich im Folgenden einen Vergleich (durch Simulationen) mit einer einfachen Bewertung des Unterschieds zwischen den beiden Gruppenvarianzen auf der Grundlage eines F-Tests, der durch Vergleichen der Varianzen in den einzelnen mittleren Antworten und durch Vergleichen durchgeführt wird das gemischte Modell abgeleitet Varianzen.
j
Y^i,j∼N(μj,σ2j+σ2ϵ10)
σϵσjj = { 1 , 2 }
Sie können dies in der Simulation der folgenden Grafik sehen, in der neben dem auf der Stichprobe basierenden F-Score ein F-Score berechnet wird, der auf den vorhergesagten Varianzen (oder Quadratsummen) des Modells basiert.
σj = 1= σj = 2= 0,5σϵ=1
Sie können sehen, dass es einen Unterschied gibt. Dieser Unterschied kann auf die Tatsache zurückzuführen sein, dass das lineare Modell mit gemischten Effekten die Quadratsummen des Fehlers (für den Zufallseffekt) auf andere Weise ermittelt. Und diese quadratischen Fehlerausdrücke werden (nicht mehr) gut als einfache Chi-Quadrat-Verteilung ausgedrückt, sind aber immer noch eng miteinander verwandt und können angenähert werden.
σj=1≠σj=2Y^i,jσjσϵ
σj=1=0.5σj=2=0.25σϵ=1
Das auf den Mitteln basierende Modell ist also sehr genau. Aber es ist weniger mächtig. Dies zeigt, dass die richtige Strategie davon abhängt, was Sie wollen / brauchen.
Wenn Sie im obigen Beispiel die rechten Endgrenzen auf 2,1 und 3,1 setzen, erhalten Sie bei gleicher Varianz ungefähr 1% der Bevölkerung (bzw. 103 und 104 der 10 000 Fälle), bei ungleicher Varianz unterscheiden sich diese Grenzen jedoch viel (mit 5334 und 6716 Fällen)
Code:
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)))