El modelo lineal mixto se utiliza para hacer que las medias, varianzas y covarianzas sean más “flexibles”.
#install.packages
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(broom.mixed)
library(lme4)
## Loading required package: Matrix
##
## Attaching package: 'Matrix'
##
## The following objects are masked from 'package:tidyr':
##
## expand, pack, unpack
data("CO2")
uptake2 = CO2$uptake + runif(84, 0.04, 0.09)
uptake2
## [1] 16.057276 30.451652 34.859843 37.282537 35.384733 39.265259 39.759311
## [8] 13.641123 27.380591 37.161402 41.866319 40.688173 41.485973 44.378798
## [15] 16.287411 32.489718 40.385843 42.169039 42.962640 43.979473 45.551488
## [22] 14.276920 24.185653 30.370135 34.668188 32.572756 35.460099 38.771378
## [29] 9.361548 27.343475 35.065480 38.844475 38.672115 37.575503 42.487042
## [36] 15.156786 21.071451 38.159608 34.070736 38.986360 39.653808 41.456118
## [43] 10.680049 19.274765 26.286861 30.070364 30.963291 32.448584 35.560308
## [50] 12.056549 22.078177 30.641623 31.844167 32.488167 31.180225 31.540280
## [57] 11.350736 19.464444 25.886039 27.960491 28.552228 28.167547 27.884246
## [64] 10.563452 14.955251 18.188820 18.945564 19.579244 22.260716 21.982617
## [71] 7.785831 11.448243 12.351045 13.055331 12.569392 13.785241 14.442602
## [78] 10.653848 18.055111 17.955749 17.969659 17.979829 18.968227 19.944886
ggplot(CO2, aes(x = conc, y = uptake2)) + geom_point()
data("CO2")
ggplot(CO2, aes(x = conc, y = uptake, color = Type)) + geom_point()
Si medimos cual es la captaciòn de dioxido de carbono de distintas plantas, en distintas concentraciones, podremos observar, en este caso, una amplia variacion, es decir, al principio hay menos, pero al final hay mayor variabilidad.
En general, de la grafica se puede concluir que las plantas de Quebes tienen un mayor consumo en comparacion con las de Mississippi.
data("CO2")
ggplot(CO2, aes(x = conc, y = uptake, color = Type)) + geom_point(aes(shape = Treatment)) + theme_bw()
Plantas (variable aleatoria).
Tratamiento.
Concentracion.
Consumo.
data("CO2")
ggplot(CO2, aes(x = conc, y = uptake, color = Type)) +
geom_point(aes(shape = Treatment)) +
geom_path(aes(group = Plant, lty = Treatment)) +
theme_bw()
Si vemos a cada planta aislada, podemos apreciar comportamientos o tendencias inesperadas, si bien las plantas se escogieron de manera aleatoria, son del mismo tipo y por eso, esperariamos un comportamiento mas similar entre las repeticiones, por lo que podemos intuir que este efecto es causado por alguna variable que determinaria el resultado espeficico de cada una.
Para lidiar con esos modelos aleatorios, se utiliza el siguiente paquete.
# Lo que usariamos originalmente si tuvieramos un modelo lineal simple.
Fit1 <- lm(uptake ~ I(log(conc)) + Type:Treatment, data = CO2)
# Lo que usamos dadas las circunstancias en las que estamos con el factor aleatorio.
Fit2 <- lmer(uptake ~ I(log(conc)) + Type:Treatment + (1 | Plant), data = CO2)
## fixed-effect model matrix is rank deficient so dropping 1 column / coefficient
Se coloca la expresión “I(log())”, puesto a que la gráfica de los resultados toma una función de tipo logaritmica.
Como se notan diferencias entre el tipo y los tratamientos, se utiliza la expresión “Type:Treatment”, en lugar de sumarlos.
Lo que hace esta modificacion en particular es que cada una de las plantas va a tener un intercepto disitnto.
# Estimadores.
broom::glance(Fit1)
broom::tidy(Fit1)
broom.mixed::glance(Fit2)
broom.mixed::tidy(Fit2)
broom.mixed::tidy(Fit2)
data("ChickWeight")
Fit1_Poisson <- glm(weight ~ Diet:Time, data = ChickWeight, family = poisson)
Fit2_Poisson <- glmer(weight ~ Diet:Time + (1|Chick), data = ChickWeight, family = poisson)
## Warning in checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv, : Model is nearly unidentifiable: very large eigenvalue
## - Rescale variables?
Se toma una base de datos tipica de R; el peso de pollos. Podemos ver que el peso siempre es un valor positivo y además, no tiene decimales en esta base de datos, por lo que podemos asumir un modelo glm de tipo Poisson.
El peso es explicado por la dieta en interacción con el tiempo, esto porque queremos que parta siempre del mismo peso
tidy(Fit1_Poisson)
ggplot(ChickWeight, aes(x = Time, y = weight)) + geom_point(aes(color = Diet))
ggplot(ChickWeight, aes(x = Time, y = weight)) +
geom_point(aes(color = Diet)) +
geom_path(aes(color = Diet, group = Chick))
broom::tidy(Fit1_Poisson)
broom.mixed::tidy(Fit2_Poisson)
sjPlot::plot_model(Fit1_Poisson, type = "eff")
## Package `effects` is not available, but needed for `ggeffect()`. Either
## install package `effects`, or use `ggpredict()`. Calling `ggpredict()`
## now.
## $Diet
##
## $Time
Al tomar en cuenta la variabilidad de un individuo vs. otro, va a mejorar la confiabilidad del modelo.
Cuando nosotros tomamos la identidad, en este caso, del pollo, algo que es indispensable para que el modelo aleatorio ocurra es tener más de una medida por cada pollo o por cada individuo.
Estos modelos mixtos aplican para trabajos de fitomejoramiento, en donde tomamos en cuenta varios factores fijos al tiempo.
Se basan en predicciones, se han usado en cultivos o contextos donde el investigador tiene como objetivo seleccionar los individuos y familas que presenten las caracteristicas deseadas para ser recomendadas en futuras investigaciones. Los efectos aleatorios en este caso serian la capacidad especifica de combinacion y el efecto de los bloques (Bandera, F. Et al. 2018).