Introducción
Con el objetivo de evaluar el potencial rol fitorremediador de una herbácea nativa (Tripogandra diuretica, Fl. Commelinaceae), se analizarán diferentes modelos para evaluar su tolerancia a metales pesados (Cobre y Zinc). Para tal fin, se considerarán los modelos de Cobre y Zinc (por separado) que mejor ajusten y predigan la cantidad de hojas promedio semana a semana en cada tratamiento. Se considera la cantidad de hojas como variable respuesta puesto que se relaciona directamente con el buen desarrollo de la planta en estudio.
Variable Respuesta: Número de hojas (potencial distribución POISSON)
Variables Explicativas:
Tratamiento
- Cualitativa, 5 niveles (control y dos niveles por cada metal en tierra).
- De efectos fijos.
- Cruzada con semana.
- Cualitativa, 5 niveles (control y dos niveles por cada metal en tierra).
Numero de replica
- Cualitativa, 25 niveles (cinco réplicas por cada tratamiento).
- De efectos aleatorios
- Anidada en tratamiento.
- Cualitativa, 25 niveles (cinco réplicas por cada tratamiento).
Semana
- Cualitativa de 5 niveles.
- De efectos fijos.
- Cruzada con tratamiento
- Cualitativa de 5 niveles.
Cobre
Tabla 1
tabla=tableby(Tratamiento~Nhojas, strata = Semana, data = datos[datos$Tratamiento%in%c("Control","Cu250","Cu500"),])
summary(tabla, text=T)
| Semana | Control (N=150) | Cu250 (N=150) | Cu500 (N=150) | Total (N=450) | p value | |
|---|---|---|---|---|---|---|
| 1 | Nhojas | 0.336 | ||||
| - Mean (SD) | 16.200 (1.495) | 16.400 (1.773) | 15.800 (1.495) | 16.133 (1.595) | ||
| - Range | 14.000 - 18.000 | 13.000 - 18.000 | 14.000 - 18.000 | 13.000 - 18.000 | ||
| 2 | Nhojas | < 0.001 | ||||
| - Mean (SD) | 17.800 (1.186) | 17.000 (1.287) | 16.200 (0.407) | 17.000 (1.218) | ||
| - Range | 16.000 - 19.000 | 15.000 - 18.000 | 16.000 - 17.000 | 15.000 - 19.000 | ||
| 3 | Nhojas | 0.032 | ||||
| - Mean (SD) | 22.400 (3.191) | 20.000 (3.913) | 21.000 (3.343) | 21.133 (3.595) | ||
| - Range | 19.000 - 28.000 | 16.000 - 26.000 | 18.000 - 25.000 | 16.000 - 28.000 | ||
| 4 | Nhojas | 0.235 | ||||
| - Mean (SD) | 29.200 (4.612) | 31.800 (7.029) | 30.000 (6.136) | 30.333 (6.041) | ||
| - Range | 26.000 - 38.000 | 20.000 - 39.000 | 23.000 - 39.000 | 20.000 - 39.000 | ||
| 5 | Nhojas | 0.010 | ||||
| - Mean (SD) | 35.200 (6.217) | 39.800 (9.974) | 40.800 (5.202) | 38.600 (7.736) | ||
| - Range | 26.000 - 45.000 | 22.000 - 50.000 | 34.000 - 49.000 | 22.000 - 50.000 |
cobre <- bd %>%
filter(Tratamiento %in% c("Control", "Cu250","Cu500")) %>%
mutate(Tratamiento=factor(Tratamiento))
cobre$Tratamiento <- droplevels(cobre$Tratamiento)
Gráficos descriptivos
Se realizaron gráficos de perfiles con la librería ggplot2 para describir la cantidad de hojas según el nivel de cobre en cada tratamiento y su evolución semana a semana.
cobre %>%
group_by(Tratamiento) %>%
ggplot(aes(Tratamiento,Nhojas)) +
geom_point(aes(color=Tratamiento)) + facet_grid (. ~ Semana) +
theme(axis.text.x = element_text(vjust=0.5, size=10,angle=45 ))+
ggtitle("Cantidad de hojas por réplica según tratamiento y por semana")+
ylab("Cantidad de hojas")+
scale_color_manual(values=c("#264653", "#e9c46a", "#e76f51"))
# Perfiles
cobre %>%
group_by(Tratamiento) %>%
ggplot(aes(as.numeric(Semana), Nhojas, color=Tratamiento)) +
geom_smooth(se=TRUE) + xlab("Semana") + ylab("Número de hojas por planta")+
ggtitle("Gráfico de perfiles de cantidad de hojas según tratamiento y semana",
"Media (EE)")+
scale_color_manual(values=c("#264653", "#e9c46a", "#e76f51"))
Modelo de Poisson
m1.cu <- glmmTMB(Nhojas ~ Tratamiento*Semana + (1|Replica), data = cobre, family = poisson)
Se ajustó un modelo de Poisson utilizando la librería glmmTMB. Se incluyeron como predictores al tratamiento y la semana, como así también su interacción. A su vez, se incluyó a la réplica como variable de efectos aleatorios.
Verificación de supuestos
Se utilizó la libraría DHARMa para el análisis de residuos. Esta librería utiliza un método basado en simulación para reescalar los residuos entre 0 y 1 a partir de los cuantiles.
Con estos residuos se evidenciaron problemas en los supuestos (e.g., distribución, dispersión).
# Parámetro de Dispersion
e1 <- resid(m1.cu, type = "pearson")
n <- nrow(cobre)
k <- length(fixef(m1.cu)) + 1 #parametros estimados; se suma 1varianza(Num replicas)
dispersion <- sum(e1^2) / (n - k)
Por otro lado, la estimación del parámetro de dispersión arrojó un valor de 0.236, por lo que se considera que el modelo presenta subdispersión.
Modelo de Poisson con basal como covariable
Se decidió probar el funcionamiento de un modelo en el que se controle el nivel basal de la cantidad de hojas en cada grupo, considerando ese nivel como una covariable predictora más.
cobre_wide <- spread(cobre, Semana, Nhojas)
tiempos <-cobre_wide[3:7]
colnames(tiempos) <- c("Semana 1","Semana 2","Semana 3","Semana 4","Semana 5")
ggpairs(tiempos)
#Heatmap
ggcorr(tiempos, label = TRUE, label_size = 3,limits = FALSE, midpoint = NULL, label_round = 2) #heatmap
keycol <- "Semana"
valuecol <- "Nhojas"
gathercols <- c("2", "3", "4", "5")
cobre_medrep <- gather_(cobre_wide, keycol, valuecol, gathercols)
# Renombro col 1 como Basal
names(cobre_medrep)[names(cobre_medrep) == "1"] <- "Basal"
# Con cualquiera de las dos libreraias vale, glmmTMB es mas robusta creo
m1.cu_basal <- glmmTMB(Nhojas ~ Tratamiento*Semana+Basal + (1|Replica) , data = cobre_medrep, family = poisson)
Verificación de supuestos
Se volvió a utilizar la libraría DHARMa para el análisis de residuos.
A partir del análisis gráfico de los residuos de este modelo también se evidenciaron problemas en los supuestos.
# Parámetro de Dispersion
e1 <- resid(m1.cu_basal, type = "pearson")
n <- nrow(cobre_medrep)
k <- length(fixef(m1.cu_basal)) + 1 #parametros estimados; se suma 1varianza(Num replicas)
dispersion <- sum(e1^2) / (n - k)
Por otro lado, la estimación del parámetro de dispersión arrojó un valor de 0.419, por lo que mejora respecta del modelo anterior, pero no demasiado.
La diferencia en el AIC entre el primer modelo (446.48) y el segundo (356.09) es de 90.39, por lo que el modelo con el nivel basal como predictor ajusta mejor.
Conway y Maxwell: Cuasi modelo de Poisson
Para resolver la subdispersión se decidió ajustar el cuasi modelo poisson de Conway y Maxwell. Se repitió el análisis con y sin el nivel basal de cantidad de hojas.
# Sin basal
m2.cu <- glmmTMB(Nhojas ~ Tratamiento*Semana + (1|Replica), data = cobre, family = compois, REML = TRUE)
# Sacando basal
m2.cu_basal <- glmmTMB(Nhojas ~ Tratamiento*Semana+Basal + (1|Replica), data = cobre_medrep, family = compois, REML = TRUE)
Verificación de supuestos
Semanas con los 5 niveles
# Con DHARMA
simulationOutput <- simulateResiduals(m2.cu)
plot(simulationOutput)
hist(simulationOutput)
e1 <- resid(m2.cu, type = "pearson")
n <- nrow(cobre)
k <- length(fixef(m2.cu)) + 1 #parametros estimados; se suma 1varianza(Num replicas)
dispersion <- sum(e1^2) / (n - k)
Los supuestos mejoran ampliamente en ese modelo. Por otro lado, el parámetro de dispersión también mejora (ϕ = 0.682).
Nivel basal como covariable
# Con DHARMA
simulationOutput <- simulateResiduals(m2.cu_basal)
plot(simulationOutput)
hist(simulationOutput)
e1 <- resid(m2.cu_basal, type = "pearson")
n <- nrow(cobre_medrep)
k <- length(fixef(m2.cu_basal)) + 1 #parametros estimados; se suma 1varianza(Num replicas)
dispersion <- sum(e1^2) / (n - k)
La estimación del parámentro de dispersión también mejora (ϕ = 0.674). Sin embargo, la estructura de residuos no permite suponer linealidad.
Selección de modelo por LOOCV
Se calculó el error cuadrático medio mediante la técnica Leave-one-out cross-validation para los dos últimos modelos y así seleccionar el modelo que prediga de forma más robusta la cantidad de hojas por réplica a partir del tratamiento y la semana. Para ello, se ajustó el modelo con todas las observaciones excepto una y se comparó la cantidad de hojas en ese tratamiento en esa semana con la predicción realizada a partir del modelo. Este proceso se repitió para todos tratamientos y todas las semanas. Luego se promedió este error cuadrático. El modelo que mejor ajuste será aquel que tenga un menor error cuadrático medio.
# cinco semanas
ec <- c()
for(i in levels(droplevels(cobre$Replica))){
for(j in levels(droplevels(cobre$Semana))){
cobre.loocv <- glmmTMB(Nhojas ~ Tratamiento*Semana + (1|Replica), data = cobre[cobre$Replica!=i|cobre$Semana!=j,], family = compois, REML = TRUE)
ec <- c(ec,(predict(cobre.loocv, newdata = cobre[cobre$Replica==i&cobre$Semana==j,])-cobre$Nhojas[cobre$Replica==i&cobre$Semana==j])^2)
}
}
ecm <- mean(ec)
# sacando basal
cobre_medrep$Semana <- as.factor(cobre_medrep$Semana)
ec_basal <- c()
for(i in levels(droplevels(cobre_medrep$Replica))){
for(j in levels(droplevels(cobre_medrep$Semana))){
cobre.loocv <- glmmTMB(Nhojas ~ Tratamiento*Semana+Basal + (1|Replica), data = cobre_medrep[cobre_medrep$Replica!=i|cobre_medrep$Semana!=j,], family = compois, REML = TRUE)
ec_basal <- c(ec_basal,(predict(cobre.loocv, newdata = cobre_medrep[cobre_medrep$Replica==i&cobre_medrep$Semana==j,])-cobre_medrep$Nhojas[cobre_medrep$Replica==i&cobre_medrep$Semana==j])^2)
}
}
ecm_basal <- mean(ec_basal)
El error cuadrático medio del modelo sin controlar por el nivel basal de hojas por réplica (ECM = 552.41) fue menor que aquel obtenido controlando por dicho nivel (ECM = 645.3).
Conclusión: Dados estos análisis, se decide avanzar con el modelo de Conway y Maxwell sin controlar por el nivel basal.
Interpretación del modelo
tabla <- kable(as.data.frame(car::Anova(m2.cu)))%>%
add_header_above(c("Tabla de Análisis de la Varianza" = 4))
for(i in 1:nrow(car::Anova(m2.cu))){
if(car::Anova(m2.cu)$`Pr(>Chisq)`[i]<.05){
tabla <- row_spec(tabla,i,background = "#94ccd4", bold = T)
}
}
tabla
| Chisq | Df | Pr(>Chisq) | |
|---|---|---|---|
| Tratamiento | 0.0636618 | 2 | 0.9686704 |
| Semana | 916.9040271 | 4 | 0.0000000 |
| Tratamiento:Semana | 15.5814436 | 8 | 0.0487781 |
El análisis de la varianza indica que tanto la semana como la interacción con el tratamiento resultaron significativas, pero no el tratamiento de forma independiente.
Las comparaciones de Dunnett de cada tratamiento vs. control indicaron que no habría diferencias significativas en ninguna de las semanas para ninguno de los dos niveles de cobre.
# Dunnett Comparacion contra control EN CADA SEMANA
comp2 <- emmeans(m2.cu, specs = trt.vs.ctrl ~ Tratamiento|Semana, ref = 1,type="response")
tabla <- kable(summary(comp2$contrasts))
for(i in 1:nrow(summary(comp2$contrasts))){
if(summary(comp2$contrasts)$p.value[i]<.05){
tabla <- row_spec(tabla,i,background = "#94ccd4", bold = T)
}
}
tabla
| contrast | Semana | ratio | SE | df | null | t.ratio | p.value |
|---|---|---|---|---|---|---|---|
| Cu250 / Control | 1 | 1.0019402 | 0.1274262 | 73 | 1 | 0.0152409 | 0.9994516 |
| Cu500 / Control | 1 | 0.9744070 | 0.1243172 | 73 | 1 | -0.2032109 | 0.9602640 |
| Cu250 / Control | 2 | 0.9451153 | 0.1188085 | 73 | 1 | -0.4490438 | 0.8511473 |
| Cu500 / Control | 2 | 0.9090803 | 0.1147537 | 73 | 1 | -0.7551409 | 0.6652794 |
| Cu250 / Control | 3 | 0.8837193 | 0.1075734 | 73 | 1 | -1.0155081 | 0.4982100 |
| Cu500 / Control | 3 | 0.9365462 | 0.1135295 | 73 | 1 | -0.5407987 | 0.7992221 |
| Cu250 / Control | 4 | 1.0780750 | 0.1249584 | 73 | 1 | 0.6485872 | 0.7333982 |
| Cu500 / Control | 4 | 1.0264268 | 0.1193325 | 73 | 1 | 0.2243555 | 0.9530694 |
| Cu250 / Control | 5 | 1.1193260 | 0.1269288 | 73 | 1 | 0.9940844 | 0.5115756 |
| Cu500 / Control | 5 | 1.1578446 | 0.1311104 | 73 | 1 | 1.2942822 | 0.3383795 |
Gráficos
# Medias con IC
gfxcomp.cu <-as.data.frame(comp2$emmeans)
ggplot(gfxcomp.cu, aes(Tratamiento, y=response)) +
geom_errorbar(aes(ymin=lower.CL, ymax=upper.CL,colour = factor(gfxcomp.cu$Semana)), width=.1) +
geom_point(aes(colour = factor(gfxcomp.cu$Semana)), size = 4)+ ylab("Numero de hojas predichas por replica") +
xlab("Tratamiento") +
theme_grey(base_size = 10) +
ggtitle("Número de hojas predichas según semana en cada tratamiento",
"Media (EE)") + guides(color=guide_legend("Numero de hojas\nen c/semana"))+
theme(axis.text.x = element_text(vjust=0.5, size=10,angle=0, ))+
scale_color_manual(values=c("#264653", "#2a9d8f", "#e9c46a", "#f4a261", "#e76f51"))
ggplot(gfxcomp.cu, aes(Semana, y=response)) +
geom_errorbar(aes(ymin=lower.CL, ymax=upper.CL,colour = factor(gfxcomp.cu$Tratamiento)), width=.1) +
geom_point(aes(colour = factor(gfxcomp.cu$Tratamiento)), size = 4)+ ylab("Numero de hojas predichas por replica") +
xlab("Semana") +
theme_grey(base_size = 16) +
ggtitle("Número de hojas predichas según tratamientos en cada semana",
"Media (EE)") + guides(color=guide_legend("Numero de hojas\nsegún tratamiento"))+
theme(plot.title = element_text(size = 12),
plot.subtitle = element_text(size = 10),
axis.title = element_text(size=12),
legend.title = element_text(size=12),
axis.text.x = element_text(vjust=0.5, size=10))+
scale_color_manual(values=c("#264653", "#e9c46a", "#e76f51"))
Zinc
Tabla 2
datos$Tratamiento <- factor(datos$Tratamiento, levels = c("Control","Zn500","Zn1700","Cu250","Cu500"))
tabla=tableby(Tratamiento~Nhojas, strata = Semana, data = datos[datos$Tratamiento%in%c("Control","Zn500","Zn1700"),])
kable(summary(tabla, text=T))
| Semana | Control (N=150) | Zn500 (N=150) | Zn1700 (N=150) | Total (N=450) | p value | |
|---|---|---|---|---|---|---|
| 1 | Nhojas | < 0.001 | ||||
|
16.200 (1.495) | 15.200 (1.186) | 16.400 (1.037) | 15.933 (1.347) | ||
|
14.000 - 18.000 | 14.000 - 17.000 | 15.000 - 18.000 | 14.000 - 18.000 | ||
| 2 | Nhojas | 0.025 | ||||
|
17.800 (1.186) | 17.200 (1.495) | 17.000 (0.643) | 17.333 (1.199) | ||
|
16.000 - 19.000 | 16.000 - 20.000 | 16.000 - 18.000 | 16.000 - 20.000 | ||
| 3 | Nhojas | 0.088 | ||||
|
22.400 (3.191) | 24.400 (2.621) | 22.600 (5.170) | 23.133 (3.884) | ||
|
19.000 - 28.000 | 22.000 - 28.000 | 17.000 - 31.000 | 17.000 - 31.000 | ||
| 4 | Nhojas | < 0.001 | ||||
|
29.200 (4.612) | 37.600 (4.621) | 33.200 (8.640) | 33.333 (7.079) | ||
|
26.000 - 38.000 | 33.000 - 45.000 | 23.000 - 47.000 | 23.000 - 47.000 | ||
| 5 | Nhojas | < 0.001 | ||||
|
35.200 (6.217) | 47.800 (3.934) | 50.200 (5.732) | 44.400 (8.492) | ||
|
26.000 - 45.000 | 42.000 - 54.000 | 42.000 - 59.000 | 26.000 - 59.000 |
zinc <- bd %>%
filter(Tratamiento %in% c("Control","Zn500","Zn1700")) %>%
mutate(Tratamiento=factor(Tratamiento))
zinc$Tratamiento <- factor(zinc$Tratamiento, levels = c("Control","Zn500","Zn1700"))
Gráficos descriptivos
Se realizaron gráficos de perfiles con la librería ggplot2 para describir la cantidad de hojas según el nivel de zinc en cada tratamiento y su evolución semana a semana.
zinc %>%
group_by(Tratamiento) %>%
ggplot(aes(Tratamiento,Nhojas)) +
geom_point(aes(color=Tratamiento)) + facet_grid (. ~ Semana) +
theme(axis.text.x = element_text(vjust=0.5, size=10,angle=45 ))+
ggtitle("Número de hojas según semana en cada tratamiento")+
ylab("Cantidad de hojas")+
scale_color_manual(values=c("#264653", "#e9c46a", "#e76f51"))
# Perfiles
zinc %>%
group_by(Tratamiento) %>%
ggplot(aes(as.numeric(Semana), Nhojas, color=Tratamiento)) +
geom_smooth(se=TRUE) + xlab("Semana") + ylab("Número de hojas por planta")+
ggtitle("Número de hojas según tratamientos en cada semana",
"Media (EE)")+
scale_color_manual(values=c("#264653", "#e9c46a", "#e76f51"))
Modelo de Poisson
m1.zn <- glmmTMB(Nhojas ~ Tratamiento*Semana + (1|Replica), data = zinc, family = poisson)
Se ajustó un modelo de Poisson utilizando la librería glmmTMB. Se incluyeron como predictores al tratamiento y la semana, como así también su interacción. A su vez, se incluyó a la réplica como variable de efectos aleatorios.
Verificación de supuestos
También para los modelos de Zinc se utilizó la libraría DHARMa para el análisis de residuos.
Con estos residuos también se evidenciaron problemas en los supuestos.
# dispersion
e1 <- resid(m1.zn, type = "pearson")
n <- nrow(zinc)
k <- length(fixef(m1.zn)) + 1 #parametros estimados; se suma 1varianza(Num replicas)
dispersion <- sum(e1^2) / (n - k)
Por otro lado, la estimación del parámetro de dispersión arrojó un valor de 0.347, por lo que se considera que el modelo presenta subdispersión.
Modelo de Poisson con basal como covariable
Se decidió probar el funcionamiento de un modelo en el que se controle el nivel basal de la cantidad de hojas en cada grupo, considerando ese nivel como una covariable predictora más.
zinc_wide <- spread(zinc, Semana, Nhojas)
tiempos <-zinc_wide[3:7]
colnames(tiempos) <- c("Semana 1","Semana 2","Semana 3","Semana 4","Semana 5")
ggpairs(tiempos)
#Heatmap
ggcorr(tiempos, label = TRUE, label_size = 3,limits = FALSE, midpoint = NULL, label_round = 2) #heatmap
keycol <- "Semana"
valuecol <- "Nhojas"
gathercols <- c("2", "3", "4", "5")
zinc_medrep <- gather_(zinc_wide, keycol, valuecol, gathercols)
# Renombro col 1 como Basal
names(zinc_medrep)[names(zinc_medrep) == "1"] <- "Basal"
# Con cualquiera de las dos libreraias vale, glmmTMB es mas robusta creo
m1.zn_basal <- glmmTMB(Nhojas ~ Tratamiento*Semana+Basal + (1|Replica) , data = zinc_medrep, family = poisson)
Verificación de supuestos
Nuevamente, los residuos a partir de simulaciones presentaron problemas.
# Dispersion
e1 <- resid(m1.zn_basal, type = "pearson")
n <- nrow(zinc_medrep)
k <- length(fixef(m1.zn_basal)) + 1 #parametros estimados; se suma 1varianza(Num replicas)
dispersion <- sum(e1^2) / (n - k)
Por otro lado, la estimación del parámetro de dispersión arrojó un valor de 0.33, por lo que empeora respecta del modelo anterior, pero no demasiado.
La diferencia en el AIC entre el primer modelo (447) y el segundo (369.74) es de 77.25, por lo que el modelo con el nivel basal como predictor ajusta mejor.
Conway y Maxwell: Cuasi modelo de Poisson
Para resolver la subdispersión se decidió ajustar el cuasi modelo poisson de Conway y Maxwell. Se repitió el análisis con y sin el nivel basal de cantidad de hojas.
# Sin basal
m2.zn <- glmmTMB(Nhojas ~ Tratamiento*Semana + (1|Replica), data = zinc, family = compois, REML = TRUE)
# En este caso es habiendo sacado el basal
# Presten atencion a que cuando se saca el basal, los datos tienen que estar en el
# formato del dataset cobre_medrep
m2.zn_basal <- glmmTMB(Nhojas ~ Tratamiento*Semana+Basal + (1|Replica), data = zinc_medrep, family = compois, REML = TRUE)
Verificación de supuestos
Semanas con los 5 niveles
# Con DHARMA
simulationOutput <- simulateResiduals(m2.zn)
plot(simulationOutput)
hist(simulationOutput)
e1 <- resid(m2.zn, type = "pearson")
n <- nrow(zinc)
k <- length(fixef(m2.zn)) + 1 #parametros estimados; se suma 1varianza(Num replicas)
dispersion <- sum(e1^2) / (n - k)
Los supuestos mejoran ampliamente en ese modelo. Por otro lado, el parámetro de dispersión también mejora (ϕ = 0.705).
Nivel basal como covariable
# Con DHARMA
simulationOutput <- simulateResiduals(m2.zn_basal)
plot(simulationOutput)
hist(simulationOutput)
e1 <- resid(m2.zn_basal, type = "pearson")
n <- nrow(zinc_medrep)
k <- length(fixef(m2.zn_basal)) + 1 #parametros estimados; se suma 1varianza(Num replicas)
dispersion <- sum(e1^2) / (n - k)
La estimación del parámentro de dispersión también mejora (ϕ = 0.667), pero no tanto como en el modelo con los cinco niveles en la variable Semana. El resto de los supuestos también mejoran.
Selección de modelo por LOOCV
Se calculó el error cuadrático medio mediante la técnica Leave-one-out cross-validation para los dos últimos modelos y así seleccionar el modelo que prediga de forma más robusta la cantidad de hojas por réplica a partir del tratamiento y la semana.
# cinco semanas
ec <- c()
for(i in levels(droplevels(zinc$Replica))){
for(j in levels(droplevels(zinc$Semana))){
zinc.loocv <- glmmTMB(Nhojas ~ Tratamiento*Semana + (1|Replica), data = zinc[zinc$Replica!=i|zinc$Semana!=j,], family = compois, REML = TRUE)
ec <- c(ec,(predict(zinc.loocv, newdata = zinc[zinc$Replica==i&zinc$Semana==j,])-zinc$Nhojas[zinc$Replica==i&zinc$Semana==j])^2)
}
}
ecm <- mean(ec)
# sacando basal
zinc_medrep$Semana <- as.factor(zinc_medrep$Semana)
ec_basal <- c()
for(i in levels(droplevels(zinc_medrep$Replica))){
for(j in levels(droplevels(zinc_medrep$Semana))){
zinc.loocv <- glmmTMB(Nhojas ~ Tratamiento*Semana+Basal + (1|Replica), data = zinc_medrep[zinc_medrep$Replica!=i|zinc_medrep$Semana!=j,], family = compois, REML = TRUE)
ec_basal <- c(ec_basal,(predict(zinc.loocv, newdata = zinc_medrep[zinc_medrep$Replica==i&zinc_medrep$Semana==j,])-zinc_medrep$Nhojas[zinc_medrep$Replica==i&zinc_medrep$Semana==j])^2)
}
}
ecm_basal <- mean(ec_basal)
El error cuadrático medio del modelo sin controlar por el nivel basal de hojas por réplica (ECM = 691.73) fue menor que aquel obtenido controlando por dicho nivel (ECM = 820.73).
Conclusión: Dados estos análisis, se decide avanzar con el modelo de Conway y Maxwell sin controlar por el nivel basal.
Interpretación del modelo
tabla <- kable(as.data.frame(car::Anova(m2.zn)))%>%
add_header_above(c("Tabla de Análisis de la Varianza" = 4))
for(i in 1:nrow(car::Anova(m2.zn))){
if(car::Anova(m2.zn)$`Pr(>Chisq)`[i]<.05){
tabla <- row_spec(tabla,i,background = "#94ccd4", bold = T)
}
}
tabla
| Chisq | Df | Pr(>Chisq) | |
|---|---|---|---|
| Tratamiento | 5.421345 | 2 | 0.0664921 |
| Semana | 951.420357 | 4 | 0.0000000 |
| Tratamiento:Semana | 34.983223 | 8 | 0.0000269 |
El análisis de la varianza indica que tanto la semana como la interacción con el tratamiento resultaron significativas, pero la significación del tratamiento fue marginal.
Las comparaciones de Dunnett de cada tratamiento vs. control indicaron que no habría diferencias significativas en ninguna de las semanas para ninguno de los dos niveles de cobre.
# Dunnett Comparacion contra control EN CADA SEMANA
comp2 <- emmeans(m2.zn, specs = trt.vs.ctrl ~ Tratamiento|Semana, ref = 1,type="response")
tabla <- kable(summary(comp2$contrasts))
for(i in 1:nrow(summary(comp2$contrasts))){
if(summary(comp2$contrasts)$p.value[i]<.05){
tabla <- row_spec(tabla,i,background = "#94ccd4", bold = T)
}
}
tabla
| contrast | Semana | ratio | SE | df | null | t.ratio | p.value |
|---|---|---|---|---|---|---|---|
| Zn500 / Control | 1 | 0.9406353 | 0.1066125 | 73 | 1 | -0.5399619 | 0.7997152 |
| Zn1700 / Control | 1 | 1.0109211 | 0.1131882 | 73 | 1 | 0.0970110 | 0.9885043 |
| Zn500 / Control | 2 | 0.9688918 | 0.1060740 | 73 | 1 | -0.2886594 | 0.9283717 |
| Zn1700 / Control | 2 | 0.9538501 | 0.1046388 | 73 | 1 | -0.4307029 | 0.8609394 |
| Zn500 / Control | 3 | 1.0920641 | 0.1099188 | 73 | 1 | 0.8749881 | 0.5875542 |
| Zn1700 / Control | 3 | 1.0078373 | 0.1024948 | 73 | 1 | 0.0767643 | 0.9922176 |
| Zn500 / Control | 4 | 1.2909666 | 0.1193369 | 73 | 1 | 2.7627796 | 0.0140511 |
| Zn1700 / Control | 4 | 1.1357350 | 0.1063692 | 73 | 1 | 1.3590058 | 0.3059328 |
| Zn500 / Control | 5 | 1.3613871 | 0.1203340 | 73 | 1 | 3.4902310 | 0.0016210 |
| Zn1700 / Control | 5 | 1.4243317 | 0.1254086 | 73 | 1 | 4.0171895 | 0.0002806 |
Gráficos
# Medias con IC
gfxcomp.zn <-as.data.frame(comp2$emmeans)
ggplot(gfxcomp.zn, aes(factor(Tratamiento, levels = c("Control","Zn500","Zn1700")), y=response)) +
geom_errorbar(aes(ymin=lower.CL, ymax=upper.CL,colour = factor(gfxcomp.zn$Semana)), width=.1) +
geom_point(aes(colour = factor(gfxcomp.zn$Semana)), size = 4)+ ylab("Numero de hojas predichas por replica") +
xlab("Tratamiento") +
theme_grey(base_size = 10) + ggtitle("Número de hojas predichas según semana en cada tratamiento","Media (EE)") + guides(color=guide_legend("Numero de hojas\nen cada semana"))+
theme(axis.text.x = element_text(vjust=0.5, size=12,angle=0))+
scale_color_manual(values=c("#264653", "#2a9d8f", "#e9c46a", "#f4a261", "#e76f51"))
ggplot(gfxcomp.zn, aes(Semana, y=response)) +
geom_errorbar(aes(ymin=lower.CL, ymax=upper.CL,colour = factor(gfxcomp.zn$Tratamiento, levels = c("Control","Zn500","Zn1700"))), width=.1) +
geom_point(aes(colour = factor(gfxcomp.zn$Tratamiento, levels = c("Control","Zn500","Zn1700"))), size = 4)+ ylab("Numero de hojas predichas por replica") +
xlab("Semana") +
theme_grey(base_size = 16) + ggtitle("Número de hojas predichas según tratamientos en cada semana", "Media (EE)") + guides(color=guide_legend("Numero de hojas\nsegún tratamiento"))+
theme(plot.title = element_text(size = 12),
plot.subtitle = element_text(size = 10),
axis.title = element_text(size=12),
legend.title = element_text(size=12),
axis.text.x = element_text(vjust=0.5, size=10))+
scale_color_manual(values=c("#264653", "#e9c46a", "#e76f51"))
Conclusiones
Dados los resultados obtenidos con los modelos que mejor ajustaron se concluye que en el caso de cobre no se encontraron diferencias significativas en cantidad de hojas por réplica de acuerdo al nivel de contaminación de la tierra por este metal. Es decir, tripogandra diuretica tendría buena tolerancia a la contaminación por cobre.
En el caso del zinc, sí se encontraron diferencias significativas, pero no en la dirección esperada. Ambos tratamientos con contaminación por zinc obtuvieron un promedio de hojas por réplica mayor al control, como si esta condición favoreciera su crecimiento. Se requiere especial atención a este resultado en la discusión y líneas futuras de investigación.