Vous pouvez tester la signification des paramètres du modèle à l'aide d' intervalles de confiance estimés pour lesquels le package lme4 a leconfint.merMod
fonction.
bootstrapping (voir par exemple Intervalle de confiance du 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
profil de vraisemblance (voir par exemple Quelle est la relation entre la probabilité de profil et les intervalles de confiance? )
> 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
Il y a aussi une méthode 'Wald'
mais elle n'est appliquée qu'aux effets fixes.
Il existe également une sorte d'expression de type anova (rapport de vraisemblance) dans le package lmerTest
nommé ranova
. Mais je n'arrive pas à donner un sens à cela. La distribution des différences de logLik vraisemblance, lorsque l'hypothèse nulle (variance nulle pour l'effet aléatoire) est vraie, n'est pas distribuée en chi carré (peut-être lorsque le nombre de participants et d'essais est élevé, le test du rapport de vraisemblance pourrait avoir un sens).
Variance dans des groupes spécifiques
Pour obtenir des résultats de variance dans des groupes spécifiques, vous pouvez reparamétrer
# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
Lorsque nous avons ajouté deux colonnes à la base de données (cela n'est nécessaire que si vous souhaitez évaluer un `` contrôle '' et un `` expérimental '' non corrélés, la fonction (0 + condition || participant_id)
ne conduirait pas à l'évaluation des différents facteurs en condition de non corrélés)
#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")
Donnera maintenant la lmer
variance pour les différents groupes
> 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
Et vous pouvez leur appliquer les méthodes de profil. Par exemple maintenant confint donne des intervalles de confiance pour le contrôle et la variance exerimentale.
> 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
Simplicité
Vous pouvez utiliser la fonction de vraisemblance pour obtenir des comparaisons plus avancées, mais il existe de nombreuses façons de faire des approximations le long de la route (par exemple, vous pouvez faire un test anova / lrt conservateur, mais est-ce ce que vous voulez?).
À ce stade, cela me fait me demander quel est réellement le point de cette comparaison (pas si courante) entre les variances. Je me demande si ça commence à devenir trop sophistiqué. Pourquoi la différence entre les variances au lieu du ratio entre les variances (qui se rapporte à la distribution F classique)? Pourquoi ne pas simplement signaler les intervalles de confiance? Nous devons prendre du recul et clarifier les données et l'histoire qu'elles sont censées raconter, avant de s'engager dans des voies avancées qui peuvent être superflues et en contact lâche avec la question statistique et les considérations statistiques qui sont en fait le sujet principal.
Je me demande si l'on devrait faire bien plus que simplement énoncer les intervalles de confiance (ce qui peut en fait en dire bien plus qu'un test d'hypothèse. Un test d'hypothèse donne oui non, mais aucune information sur la répartition réelle de la population. Avec suffisamment de données, vous pouvez faire une légère différence à signaler comme différence significative). Pour approfondir la question (à quelque fin que ce soit), je crois qu'une question de recherche plus spécifique (étroitement définie) doit guider la machine mathématique à effectuer les simplifications appropriées (même lorsqu'un calcul exact pourrait être faisable ou lorsque il pourrait être approximé par des simulations / bootstrapping, même dans certains cas, cela nécessite encore une interprétation appropriée). Comparez avec le test exact de Fisher pour résoudre une question (particulière) (sur les tableaux de contingence) exactement,
Exemple simple
Pour donner un exemple de la simplicité possible, je montre ci-dessous une comparaison (par simulations) avec une évaluation simple de la différence entre les deux variances de groupe basée sur un test F fait en comparant les variances dans les réponses moyennes individuelles et fait en comparant les variances dérivées du modèle mixte.
j
Y^i,j∼N(μj,σ2j+σ2ϵ10)
si la variance de l'erreur de mesure σϵσjj={1,2}
Vous pouvez le voir dans la simulation du graphique ci-dessous où, à part le score F basé sur l'échantillon, un score F est calculé en fonction des variances prévues (ou sommes d'erreur quadratique) du modèle.
L'image est modélisée avec 10 000 répétitions en utilisant σj=1=σj=2=0.5σϵ=1
Vous pouvez voir qu'il y a une différence. Cette différence peut être due au fait que le modèle linéaire à effets mixtes obtient les sommes d'erreur quadratique (pour l'effet aléatoire) d'une manière différente. Et ces termes d'erreur au carré ne sont pas (plus) bien exprimés sous la forme d'une simple distribution du Chi au carré, mais restent étroitement liés et peuvent être approximés.
σj=1≠σj=2Y^i,jσjσϵ
σj=1=0.5σj=2=0.25σϵ=1
Le modèle basé sur les moyennes est donc très exact. Mais c'est moins puissant. Cela montre que la bonne stratégie dépend de ce que vous voulez / avez besoin.
Dans l'exemple ci-dessus, lorsque vous définissez les limites de la queue droite à 2,1 et 3,1, vous obtenez environ 1% de la population en cas de variance égale (respectivement 103 et 104 des 10000 cas), mais en cas de variance inégale, ces limites diffèrent beaucoup (donnant 5334 et 6716 des cas)
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)))