Exemplos com efeitos mistos no site
Douglas Bates: Sobre mixed models, exemplos & pacote lme4 ;
Julio Singer sobre resíduos em modelo linear com efeitos mistos ;
Pacotes: primeiro instale com o botão do lado inferior direito do R studio, depois carregue com o comando require().
require(lme4)
require(tidyverse)
require(afex)
require(DT)
require(jtools)
require(car)
require(redres)
require(lsmeans)
data(package = "lme4")
Exemplo 1: Dados de penicilina:
Acesso ao banco de dados e visualização em tabela
summary(Penicillin)
## diameter plate sample
## Min. :18.00 a : 6 A:24
## 1st Qu.:22.00 b : 6 B:24
## Median :23.00 c : 6 C:24
## Mean :22.97 d : 6 D:24
## 3rd Qu.:24.00 e : 6 E:24
## Max. :27.00 f : 6 F:24
## (Other):108
datatable(Penicillin,options = list(pageLength = 5))
Penicillin %>%
ggplot(aes(x=sample,y=diameter)) +
geom_boxplot()
ggplot(Penicillin,aes (x = as.numeric(sample), y = diameter, color = plate)) +
geom_point() +
geom_line() +
theme(legend.position = "none")
Gráficos de dispersão de diameter versus sample - em facetas para cada indivíduo (plate).
Para traçar a linha de tendência é necessário escrever as.numeric() para os valores no eixo x, embora no nosso modelo (abaixo) será tratada como as.factor ou fator, ou variável qualitativa/classe.
A pergunta é:
ggplot(Penicillin, aes(x=as.numeric(sample), diameter))+
geom_point()+
geom_smooth(method="lm")+
facet_wrap(~plate)
## `geom_smooth()` using formula 'y ~ x'
Modelo linear de efeitos mistos:
m1 <- lmer(diameter ~ sample + (1 | plate), Penicillin)
m1
## Linear mixed model fit by REML ['lmerModLmerTest']
## Formula: diameter ~ sample + (1 | plate)
## Data: Penicillin
## REML criterion at convergence: 308.2793
## Random effects:
## Groups Name Std.Dev.
## plate (Intercept) 0.8467
## Residual 0.5499
## Number of obs: 144, groups: plate, 24
## Fixed Effects:
## (Intercept) sampleB sampleC sampleD sampleE sampleF
## 25.167 -3.208 -0.250 -2.292 -2.208 -5.208
A fim de fazer algumas comparações entre os diferentes modelos:
O critério de informação de Akaike (AIC) e o critério de informação Bayesiano (BIC) são medidas de qualidade relativa de um modelo estatístico para um determinado conjunto de dados. O cálculo de AIC e BIC são dados por: \[ \begin{array}{lll} \text{AIC} &=& −2\log(L)+2\text{p};\\ \text{BIC} &=& −2\log(L)+ \text{p} \log(n), \end{array} \] onde L é o valor maximizado da função de verossimilhança, p é o número de parâmetros no modelo e n é o número total de observações no banco de dados.
Dado um conjunto de modelos candidatos para os dados, o modelo preferido é aquele com os valores mínimos de AIC e BIC. Esses critérios não apenas recompensam a adequação, mas também incluem uma penalidade (eles se tornam maiores quando incluímos mais parâmetros no modelo).
Referências:
Exibindo o AIC & BIC do modelo de efeitos mistos
AIC(m1)
## [1] 324.2793
BIC(m1)
## [1] 348.0378
require(emmeans)
emmeans(m1, list(pairwise ~ sample), adjust = "tukey")
## $`emmeans of sample`
## sample emmean SE df lower.CL upper.CL
## A 25.2 0.206 39.7 24.6 25.7
## B 22.0 0.206 39.7 21.4 22.5
## C 24.9 0.206 39.7 24.3 25.5
## D 22.9 0.206 39.7 22.3 23.4
## E 23.0 0.206 39.7 22.4 23.5
## F 20.0 0.206 39.7 19.4 20.5
##
## Degrees-of-freedom method: kenward-roger
## Confidence level used: 0.95
## Conf-level adjustment: sidak method for 6 estimates
##
## $`pairwise differences of sample`
## contrast estimate SE df t.ratio p.value
## A - B 3.2083 0.159 115 20.210 <.0001
## A - C 0.2500 0.159 115 1.575 0.6167
## A - D 2.2917 0.159 115 14.436 <.0001
## A - E 2.2083 0.159 115 13.911 <.0001
## A - F 5.2083 0.159 115 32.809 <.0001
## B - C -2.9583 0.159 115 -18.635 <.0001
## B - D -0.9167 0.159 115 -5.774 <.0001
## B - E -1.0000 0.159 115 -6.299 <.0001
## B - F 2.0000 0.159 115 12.598 <.0001
## C - D 2.0417 0.159 115 12.861 <.0001
## C - E 1.9583 0.159 115 12.336 <.0001
## C - F 4.9583 0.159 115 31.234 <.0001
## D - E -0.0833 0.159 115 -0.525 0.9951
## D - F 2.9167 0.159 115 18.373 <.0001
## E - F 3.0000 0.159 115 18.898 <.0001
##
## Degrees-of-freedom method: kenward-roger
## P value adjustment: tukey method for comparing a family of 6 estimates
Explorando o pacote redres:
Github ;
redres é um pacote R desenvolvido para ajudar no diagnóstico de modelos lineares mistos ajustados usando a função lmer do pacote lme4. Destina-se a complementar o pacote lme4.
calcula os resíduos de um modelo lmer. Temos os seguintes tipos de resíduos:
rc_resids <- compute_redres(m1)
## Loading required namespace: testthat
plot(rc_resids,main="resíduos condicionais versus índices",ylim=c(-2,2))
abline(h=2, lty=2)
abline(h=-2, lty=2)
plot_resqq(m1)
shapiro.test(rc_resids)
##
## Shapiro-Wilk normality test
##
## data: rc_resids
## W = 0.9886, p-value = 0.2878
# creates normal quantile plots for each random effect
random <- ranef(m1)
aleatorio = random[["plate"]][["(Intercept)"]]
plot(aleatorio,main="efeitos aleatórios versus índices",ylim=c(-2,2))
abline(h=2, lty=3)
abline(h=-2, lty=3)
abline(h=0,lty=3,col=4)
plot_ranef(m1)
shapiro.test(aleatorio)
##
## Shapiro-Wilk normality test
##
## data: aleatorio
## W = 0.95425, p-value = 0.334
aleatorio
## [1] 0.80454708 0.80454708 0.18167192 0.33739071 0.02595313 -0.44120324
## [7] -1.37551598 0.80454708 -0.75264082 -0.75264082 0.96026587 0.49310950
## [13] 1.42742224 0.49310950 0.96026587 0.02595313 -0.28548445 -0.28548445
## [19] -1.37551598 0.96026587 -0.90835961 -0.28548445 -0.59692203 -1.21979719
preditos=fitted(m1)
resids = data.frame(Penicillin, preditos, rc_resids)
datatable(resids,options = list(pageLength = 5))
#launch_redres(m1)
Modelo linear de efeitos mistos:
temp = Penicillin %>%
mutate(sample= as.numeric(sample))
m12 <- lmer(diameter ~ sample + (sample | plate), temp)
## boundary (singular) fit: see ?isSingular
m12
## Linear mixed model fit by REML ['lmerModLmerTest']
## Formula: diameter ~ sample + (sample | plate)
## Data: temp
## REML criterion at convergence: 545.8233
## Random effects:
## Groups Name Std.Dev. Corr
## plate (Intercept) 0.58581
## sample 0.01151 1.00
## Residual 1.50123
## Number of obs: 144, groups: plate, 24
## Fixed Effects:
## (Intercept) sample
## 25.4806 -0.7167
## convergence code 0; 0 optimizer warnings; 1 lme4 warnings
Exibindo o AIC & BIC dos dois modelos
AIC(m1,m12)
## df AIC
## m1 8 324.2793
## m12 6 557.8233
BIC(m1,m12)
## df BIC
## m1 8 348.0378
## m12 6 575.6422
Acesso ao banco de dados e visualização em tabela
summary(sleepstudy)
## Reaction Days Subject
## Min. :194.3 Min. :0.0 308 : 10
## 1st Qu.:255.4 1st Qu.:2.0 309 : 10
## Median :288.7 Median :4.5 310 : 10
## Mean :298.5 Mean :4.5 330 : 10
## 3rd Qu.:336.8 3rd Qu.:7.0 331 : 10
## Max. :466.4 Max. :9.0 332 : 10
## (Other):120
datatable(sleepstudy,options = list(pageLength = 5))
#Criando um banco de dados "temp" para não modificar o original "sleepstudy"
temp = sleepstudy %>%
mutate(Days = as.factor(Days))
temp %>%
ggplot(aes(x=Days,y=Reaction)) +
geom_boxplot()
ggplot(temp,aes (x = as.numeric(Days), y = Reaction, color = Subject)) +
geom_point() +
geom_line() +
theme(legend.position = "none")
Gráficos de dispersão de Reaction versus Days - em facetas para cada indivíduo (Subject).
ggplot(temp, aes(x=as.numeric(Days), Reaction))+
geom_point()+
geom_smooth(method="lm")+
facet_wrap(~Subject)
## `geom_smooth()` using formula 'y ~ x'
Modelo linear de efeitos mistos:
m2 <- lmer(Reaction ~ Days + (1 | Subject), temp)
m2
## Linear mixed model fit by REML ['lmerModLmerTest']
## Formula: Reaction ~ Days + (1 | Subject)
## Data: temp
## REML criterion at convergence: 1729.493
## Random effects:
## Groups Name Std.Dev.
## Subject (Intercept) 37.09
## Residual 31.43
## Number of obs: 180, groups: Subject, 18
## Fixed Effects:
## (Intercept) Days1 Days2 Days3 Days4 Days5
## 256.652 7.844 8.710 26.340 31.998 51.867
## Days6 Days7 Days8 Days9
## 55.526 62.099 79.978 94.199
Exibindo o AIC & BIC do modelo de efeitos mistos
AIC(m2)
## [1] 1753.493
BIC(m2)
## [1] 1791.808
emmeans(m2, list(pairwise ~ Days), adjust = "tukey")
## $`emmeans of Days`
## Days emmean SE df lower.CL upper.CL
## 0 257 11.5 42 223 291
## 1 264 11.5 42 231 298
## 2 265 11.5 42 232 299
## 3 283 11.5 42 249 317
## 4 289 11.5 42 255 323
## 5 309 11.5 42 275 342
## 6 312 11.5 42 278 346
## 7 319 11.5 42 285 353
## 8 337 11.5 42 303 370
## 9 351 11.5 42 317 385
##
## Degrees-of-freedom method: kenward-roger
## Confidence level used: 0.95
## Conf-level adjustment: sidak method for 10 estimates
##
## $`pairwise differences of Days`
## contrast estimate SE df t.ratio p.value
## 0 - 1 -7.844 10.5 153 -0.749 0.9991
## 0 - 2 -8.710 10.5 153 -0.831 0.9980
## 0 - 3 -26.340 10.5 153 -2.515 0.2692
## 0 - 4 -31.998 10.5 153 -3.055 0.0770
## 0 - 5 -51.867 10.5 153 -4.951 0.0001
## 0 - 6 -55.526 10.5 153 -5.301 <.0001
## 0 - 7 -62.099 10.5 153 -5.928 <.0001
## 0 - 8 -79.978 10.5 153 -7.635 <.0001
## 0 - 9 -94.199 10.5 153 -8.993 <.0001
## 1 - 2 -0.866 10.5 153 -0.083 1.0000
## 1 - 3 -18.496 10.5 153 -1.766 0.7554
## 1 - 4 -24.154 10.5 153 -2.306 0.3914
## 1 - 5 -44.023 10.5 153 -4.203 0.0018
## 1 - 6 -47.682 10.5 153 -4.552 0.0004
## 1 - 7 -54.255 10.5 153 -5.179 <.0001
## 1 - 8 -72.134 10.5 153 -6.886 <.0001
## 1 - 9 -86.355 10.5 153 -8.244 <.0001
## 2 - 3 -17.630 10.5 153 -1.683 0.8033
## 2 - 4 -23.288 10.5 153 -2.223 0.4457
## 2 - 5 -43.157 10.5 153 -4.120 0.0024
## 2 - 6 -46.816 10.5 153 -4.469 0.0006
## 2 - 7 -53.389 10.5 153 -5.097 <.0001
## 2 - 8 -71.268 10.5 153 -6.803 <.0001
## 2 - 9 -85.489 10.5 153 -8.161 <.0001
## 3 - 4 -5.657 10.5 153 -0.540 0.9999
## 3 - 5 -25.526 10.5 153 -2.437 0.3118
## 3 - 6 -29.186 10.5 153 -2.786 0.1506
## 3 - 7 -35.759 10.5 153 -3.414 0.0274
## 3 - 8 -53.637 10.5 153 -5.120 <.0001
## 3 - 9 -67.859 10.5 153 -6.478 <.0001
## 4 - 5 -19.869 10.5 153 -1.897 0.6712
## 4 - 6 -23.529 10.5 153 -2.246 0.4303
## 4 - 7 -30.101 10.5 153 -2.874 0.1223
## 4 - 8 -47.980 10.5 153 -4.580 0.0004
## 4 - 9 -62.202 10.5 153 -5.938 <.0001
## 5 - 6 -3.660 10.5 153 -0.349 1.0000
## 5 - 7 -10.232 10.5 153 -0.977 0.9932
## 5 - 8 -28.111 10.5 153 -2.684 0.1898
## 5 - 9 -42.333 10.5 153 -4.041 0.0033
## 6 - 7 -6.572 10.5 153 -0.627 0.9998
## 6 - 8 -24.451 10.5 153 -2.334 0.3734
## 6 - 9 -38.673 10.5 153 -3.692 0.0112
## 7 - 8 -17.879 10.5 153 -1.707 0.7901
## 7 - 9 -32.101 10.5 153 -3.064 0.0750
## 8 - 9 -14.222 10.5 153 -1.358 0.9379
##
## Degrees-of-freedom method: kenward-roger
## P value adjustment: tukey method for comparing a family of 10 estimates
Explorando o pacote redres:
rc_resids <- compute_redres(m2)
plot(rc_resids,main="resíduos condicionais versus índices",ylim=c(-2,2))
abline(h=2, lty=2)
abline(h=-2, lty=2)
plot_resqq(m2)
shapiro.test(rc_resids)
##
## Shapiro-Wilk normality test
##
## data: rc_resids
## W = 0.97274, p-value = 0.001345
# creates normal quantile plots for each random effect
random <- ranef(m2)
aleatorio = random[["Subject"]][["(Intercept)"]]
plot(aleatorio,main="efeitos aleatórios versus índices")
abline(h=55, lty=3)
abline(h=-55, lty=3)
abline(h=0,lty=3,col=4)
plot_ranef(m2)
shapiro.test(aleatorio)
##
## Shapiro-Wilk normality test
##
## data: aleatorio
## W = 0.94606, p-value = 0.3666
aleatorio
## [1] 40.703420 -77.696293 -62.984327 4.397767 10.196077 8.205053
## [7] 16.468010 -2.991081 -45.192981 72.040582 -21.154520 14.083583
## [13] -7.846743 36.306808 7.022529 -6.350177 -3.287787 18.080083
preditos=fitted(m2)
resids = data.frame(temp, preditos, rc_resids)
datatable(resids,options = list(pageLength = 5))
#launch_redres(m2)
Modelo linear de efeitos mistos:
m3 <- lmer(Reaction ~ Days + (Days | Subject), sleepstudy)
m3
## Linear mixed model fit by REML ['lmerModLmerTest']
## Formula: Reaction ~ Days + (Days | Subject)
## Data: sleepstudy
## REML criterion at convergence: 1743.628
## Random effects:
## Groups Name Std.Dev. Corr
## Subject (Intercept) 24.741
## Days 5.922 0.07
## Residual 25.592
## Number of obs: 180, groups: Subject, 18
## Fixed Effects:
## (Intercept) Days
## 251.41 10.47
Exibindo o AIC & BIC dos dois modelos
AIC(m2,m3)
## df AIC
## m2 12 1753.493
## m3 6 1755.628
BIC(m2,m3)
## df BIC
## m2 12 1791.808
## m3 6 1774.786
rc_resids <- compute_redres(m3)
plot(rc_resids,main="resíduos condicionais versus índices",ylim=c(-3,3))
abline(h=2, lty=2)
abline(h=-2, lty=2)
plot_resqq(m3)
shapiro.test(rc_resids)
##
## Shapiro-Wilk normality test
##
## data: rc_resids
## W = 0.90146, p-value = 1.408e-09
# creates normal quantile plots for each random effect
random <- ranef(m3)
valores = random[["Subject"]][["(Intercept)"]]
plot(valores,main="efeitos aleatórios versus índices")
abline(h=55, lty=3)
abline(h=-55, lty=3)
abline(h=0,lty=3,col=4)
plot_ranef(m3)
shapiro.test(valores)
##
## Shapiro-Wilk normality test
##
## data: valores
## W = 0.95017, p-value = 0.4277