Você pode testar a significância dos parâmetros do modelo com a ajuda de intervalos de confiança estimados para os quais o pacote lme4 tem a confint.merMod
função.
inicialização (consulte, por exemplo, Intervalo de confiança na inicialização )
> 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
perfil de probabilidade (ver, por exemplo, qual é a relação entre a probabilidade do perfil e os intervalos de confiança? )
> 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
Há também um método, 'Wald'
mas isso é aplicado apenas a efeitos fixos.
Também existe algum tipo de expressão anova (razão de verossimilhança) no pacote lmerTest
que é chamado ranova
. Mas eu não consigo entender isso. A distribuição das diferenças no logLikelihood, quando a hipótese nula (variação zero para o efeito aleatório) for verdadeira é não distribuída por qui-quadrado (possivelmente quando o número de participantes e tentativas for alto, o teste da razão de verossimilhança poderá fazer sentido).
Variação em grupos específicos
Para obter resultados de variação em grupos específicos, você pode remameter
# different model with alternative parameterization (and also correlation taken out)
fml1 <- "~ condition + (0 + control + experimental || participant_id) "
Onde adicionamos duas colunas ao quadro de dados (isso é necessário apenas se você deseja avaliar 'controle' e 'experimental' não correlacionados, a função (0 + condition || participant_id)
não levaria à avaliação dos diferentes fatores na condição de não correlacionados)
#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")
Agora lmer
dará variação para os diferentes grupos
> 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
E você pode aplicar os métodos de perfil a eles. Por exemplo, agora o confint fornece intervalos de confiança para o controle e a variação do esforço.
> 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
Simplicidade
Você pode usar a função de probabilidade para obter comparações mais avançadas, mas existem muitas maneiras de fazer aproximações ao longo da estrada (por exemplo, você pode fazer um teste conservador de anova / lrt, mas é isso que você deseja?).
Nesse ponto, fico me perguntando qual é realmente o ponto dessa comparação (não tão comum) entre as variações. Eu me pergunto se isso começa a se tornar muito sofisticado. Por que a diferença entre as variações em vez da proporção entre as variações (que se refere à distribuição F clássica)? Por que não apenas relatar intervalos de confiança? Precisamos dar um passo atrás e esclarecer os dados e a história que devemos contar, antes de seguirmos caminhos avançados que podem ser supérfluos e com pouco contato com o assunto estatístico e as considerações estatísticas que são realmente o tópico principal.
Eu me pergunto se alguém deveria fazer muito mais do que simplesmente declarar os intervalos de confiança (o que pode realmente dizer muito mais do que um teste de hipóteses. Um teste de hipóteses dá uma resposta sim não, mas não há informações sobre a expansão real da população. Dados suficientes que você possa faça qualquer pequena diferença para ser relatada como uma diferença significativa). Para aprofundar o assunto (para qualquer finalidade), requer, acredito, uma questão de pesquisa mais específica (definida de maneira restrita), a fim de guiar o mecanismo matemático para fazer as devidas simplificações (mesmo quando um cálculo exato for viável ou quando pode ser aproximado por simulações / bootstrapping, mesmo que em algumas configurações ainda exija alguma interpretação apropriada). Compare com o teste exato de Fisher para resolver exatamente uma pergunta (específica) (sobre tabelas de contingência),
Exemplo simples
Para fornecer um exemplo da simplicidade possível, mostro abaixo uma comparação (por simulações) com uma avaliação simples da diferença entre as duas variações de grupo com base em um teste F realizado pela comparação de variações nas respostas médias individuais e realizado comparando as variações derivadas do modelo misto.
j
Y^i , j∼ N( μj, σ2j+ σ2ϵ10)
σϵσjj = { 1 , 2 }
Você pode ver isso na simulação do gráfico abaixo, onde, além da pontuação F com base na amostra, uma pontuação F é calculada com base nas variações previstas (ou somas de erro ao quadrado) do modelo.
σj = 1= σj = 2= 0,5σϵ= 1
Você pode ver que há alguma diferença. Essa diferença pode dever-se ao fato de que o modelo linear de efeitos mistos está obtendo as somas de erro ao quadrado (para o efeito aleatório) de uma maneira diferente. E esses termos de erro ao quadrado não são (mais) bem expressos como uma distribuição qui-quadrado simples, mas ainda estão intimamente relacionados e podem ser aproximados.
σj = 1≠ σj = 2Y^i , jσjσϵ
σj = 1= 0,5σj = 2= 0,25σϵ= 1
Portanto, o modelo baseado nos meios é muito exato. Mas é menos poderoso. Isso mostra que a estratégia correta depende do que você deseja / precisa.
No exemplo acima, quando você define os limites da cauda direita em 2,1 e 3,1, obtém aproximadamente 1% da população no caso de variância igual (respectivamente 103 e 104 dos 10.000 casos), mas no caso de variância desigual, esses limites diferem muito (dando 5334 e 6716 dos casos)
código:
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)))