AUCPD em função de temperatura e molhamento para experimento exvivo
Autor
Prof. Dr. Walmes Zeviani
1 Carregamento de pacotes
Código
#-----------------------------------------------------------------------# Pacotes.library(emmeans)library(lattice)library(readxl)library(tidyverse)# Área abaixo da curva.auc <-function(time, resp) { i <-!is.na(resp) time <- time[i] resp <- resp[i] alt <-diff(time) bas <- resp[-length(resp)] +diff(resp)/2 a <-sum(alt * bas)return(a)}# Contornos em gráficos 3D.source("https://raw.githubusercontent.com/walmes/wzRfun/master/R/panel.3d.contour.R")
2 Importação e preparo dos dados
Código
#-----------------------------------------------------------------------# Importação e preparo dos dados.tb <-read_excel("exvivo.xlsx", na ="NA")str(tb)
#-----------------------------------------------------------------------# Cálculo da área abaixo da curva.tb_auc <- tb |>group_by(exp, iso, tem, mol, rept) |>arrange(time) |>summarise(AUCPD =auc(time, sev)) |>ungroup()str(tb_auc)
# Gráfico para mostrar a AUCPD em função de mol e tem.ggplot(data = tb_auc,mapping =aes(x = mol, y = AUCPD, col = Tem)) +geom_point() +stat_summary(fun = mean, geom ="line") +facet_grid(facets = Exp ~ Iso) +labs(y ="Severity AUDPC",x ="Wetness period (h)",color ="Temperature (°C)") +guides(color =guide_legend(nrow =1, title.position ="left")) +theme(legend.position ="top")
Código
# Gráfico para mostrar a AUCPD em função de mol e tem.ggplot(data = tb_auc,mapping =aes(x = tem, y = AUCPD, col = Mol)) +geom_point() +stat_summary(fun = mean, geom ="line") +facet_grid(facets = Exp ~ Iso) +labs(y ="Severity AUDPC",color ="Wetness period (h)",x ="Temperature (°C)") +guides(color =guide_legend(nrow =1, title.position ="left")) +theme(legend.position ="top")
Código
# IMPORTANT: Não existe um claro sinal de que a resposta como função da# temperatura seja quadrática. O padrão desejável só é observado para# dois isolados. Da mesma forma, não se observa padrão consistente com# alguma função contínua para o efeito de molhamento. Dito isto,# espera-se falta de ajuste ao declarar o modelo de segundo grau# completo na temperatura e molhamento.
3 Análise do experimento 1
Código
#-----------------------------------------------------------------------# Experimento 1 --------------------------------------------------------tbi <- tb_auc |>filter(Exp =="1")# Confere qual o intervalo de valores.summary(tbi$AUCPD)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0 0.0 982.2 2248.3 4534.4 6978.0
Código
# Soma uma constante para evitar valores negativos.m0 <-lm((AUCPD +500) ~ Tem * Iso * Mol, data = tbi)# Exame dos pressupostos.par(mfrow =c(2, 2))plot(m0)
Código
layout(1)# Transformação Box-Cox.MASS::boxcox(m0)abline(v =0, col ="red")
Código
# Ajuste com os dados transformados.m1 <-lm(log(AUCPD +500) ~ Tem * Iso * Mol, data = tbi)# Confere os pressupostos.par(mfrow =c(2, 2))plot(m1)
Código
layout(1)#-----------------------------------------------------------------------# Modelo que descreve uma superfície para temperatura e molhamento.# Refina o modelo para descrever a superfície de resposta.m2 <-lm(log(AUCPD +500) ~ Iso * (tem +I(tem^2) + mol +I(mol^0.5) + tem:mol),data = tbi)# Teste da falta de ajuste.anova(m2, m1)
Analysis of Variance Table
Model 1: log(AUCPD + 500) ~ Iso * (tem + I(tem^2) + mol + I(mol^0.5) +
tem:mol)
Model 2: log(AUCPD + 500) ~ Tem * Iso * Mol
Res.Df RSS Df Sum of Sq F Pr(>F)
1 296 121.469
2 256 90.257 40 31.212 2.2132 0.000118 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Código
# ATTENTION: Conforme antecipado, houve falta de ajuste. Isso quer dizer# que o modelo considerado é uma alternativa muito grosseira para# descrever o efeito do molhamento x temperatura. Portanto, o estudo dos# fatores será feito considerando que temperatura e molhamento são# fatores de níveis qualitativos.#-----------------------------------------------------------------------# Estudo com procedimento de comparação múltipla de médias.anova(m1)
tb_means <-emmeans(m1, specs =~Tem * Iso * Mol) |>as.data.frame() |>mutate(tem =as.numeric(as.character(Tem)),mol =as.numeric(as.character(Mol)))ggplot(data = tb_means,mapping =aes(x = mol, y = emmean, group =1)) +geom_line(color ="gray50", lty =1, linewidth =0.5) +geom_point() +geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),width =0) +facet_grid(facets = Iso ~ Tem) +labs(y ="Log of severity AUDPC",x ="Wetness period (h)")
Código
ggplot(data = tb_means,mapping =aes(x = tem, y = emmean, group =1)) +geom_line(color ="gray50", lty =1, linewidth =0.5) +geom_point() +geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),width =0.1) +facet_grid(facets = Iso ~ Mol) +labs(y ="Log of severity AUDPC",x ="Temperature (°C)")
4 Análise do experimento 2
Código
#-----------------------------------------------------------------------# Experimento 2 --------------------------------------------------------tbi <- tb_auc |>filter(Exp =="2")# Confere qual o intervalo de valores.summary(tbi$AUCPD)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0 0.0 295.5 1695.2 3513.8 8213.0
Código
# Soma uma constante para evitar valores negativos.m0 <-lm((AUCPD +50) ~ Tem * Iso * Mol, data = tbi)# Exame dos pressupostos.par(mfrow =c(2, 2))plot(m0)
Código
layout(1)# Transformação Box-Cox.MASS::boxcox(m0)abline(v =0, col ="red")
Código
# Ajuste com os dados transformados.m1 <-lm(log(AUCPD +50) ~ Tem * Iso * Mol, data = tbi)# Confere os pressupostos.par(mfrow =c(2, 2))plot(m1)
Código
layout(1)#-----------------------------------------------------------------------# Modelo que descreve uma superfície para temperatura e molhamento.# Refina o modelo para descrever a superfície de resposta.m2 <-lm(log(AUCPD +50) ~ Iso * (tem +I(tem^2) + mol +I(mol^0.5) + tem:mol),data = tbi)# Teste da falta de ajuste.anova(m2, m1)
Analysis of Variance Table
Model 1: log(AUCPD + 50) ~ Iso * (tem + I(tem^2) + mol + I(mol^0.5) +
tem:mol)
Model 2: log(AUCPD + 50) ~ Tem * Iso * Mol
Res.Df RSS Df Sum of Sq F Pr(>F)
1 296 778.26
2 256 567.32 40 210.93 2.3796 2.687e-05 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Código
# ATTENTION: Conforme antecipado, houve falta de ajuste. Isso quer dizer# que o modelo considerado é uma alternativa muito grosseira para# descrever o efeito do molhamento x temperatura. Portanto, o estudo dos# fatores será feito considerando que temperatura e molhamento são# fatores de níveis qualitativos.#-----------------------------------------------------------------------# Estudo com procedimento de comparação múltipla de médias.anova(m1)
tb_means <-emmeans(m1, specs =~Tem * Iso * Mol) |>as.data.frame() |>mutate(tem =as.numeric(as.character(Tem)),mol =as.numeric(as.character(Mol)))ggplot(data = tb_means,mapping =aes(x = mol, y = emmean, group =1)) +geom_line(color ="gray50", lty =1, linewidth =0.5) +geom_point() +geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),width =0) +facet_grid(facets = Iso ~ Tem) +labs(y ="Log of severity AUDPC",x ="Wetness period (h)")
Código
ggplot(data = tb_means,mapping =aes(x = tem, y = emmean, group =1)) +geom_line(color ="gray50", lty =1, linewidth =0.5) +geom_point() +geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),width =0.1) +facet_grid(facets = Iso ~ Mol) +labs(y ="Log of severity AUDPC",x ="Temperature (°C)")
5 Ajuste de modelos de spline e polinomial
Código
#-----------------------------------------------------------------------# Fazer ajuste usando splines por isolado x experimento para mostrar a# forma da relação temperatura x molhamento.library(rms)# Definir 3 knots para cada variável. Usar o ponto médio entre níveis já# que são 4 níveis por fator.get_knots <-function(x) { u <- x |>unique() |>sort()head(u, n =-1) +diff(u)/2}# Knots.tem_knots <-get_knots(tb_auc$tem)mol_knots <-get_knots(tb_auc$mol)seq_expand <-function(x, f =0.05, length.out =31) { er <-extendrange(x, f = f)seq(er[1], er[2], length.out = length.out)}seq_expand(0:10, f =0.05, length.out =31)
# Tabela com valores preditos no grid para fazer os gráficos.tb_pred <- tb_fits |>mutate(pred = {list(cbind(pred, fit =predict(model_rcs, newdata = pred)))# list(cbind(pred, fit = predict(model_2nd, newdata = pred))) }) |>ungroup() |>select(Exp, Iso, pred) |>unnest(pred)str(tb_pred)
# Gráfico de níveis com linhas de contornos de nível.levelplot(fit ~ tem + mol | Iso + Exp,data = tb_pred,ylab ="Período de molhamento (h)",xlab ="Temperatura (°C)",as.table =TRUE,contour =TRUE,# labels = TRUE,# at = seq(from = 0, to = 110, by = 5),col.regions =colr(101))
Código
# Fazer o gráfico de níveis com ggplot.ggplot(data = tb_pred,mapping =aes(x = tem, y = mol, z = fit, group =1)) +geom_tile(mapping =aes(fill = fit)) +geom_contour(color ="black", bins =20) +facet_grid(facets = Exp ~ Iso) +# scale_fill_gradientn(colours = colr(101)) +scale_fill_distiller(palette ="Spectral") +labs(y ="Wetness period (h)",x ="Temperature (°C)",fill ="AUCPD") +theme_bw()
Código
# NOTE: Os resultados realmente mostram que nem todas ascurvas não podem# ser simplificadas por modelos de segunda ordem ou splines.
6 GAM com bivariate thin-plate spline
Código
#-----------------------------------------------------------------------# Usando GAM com bivariate thin-plate spline.# https://stackoverflow.com/questions/52279218/rough-thin-plate-spline-fitting-thin-plate-spline-interpolation-in-r-with-mgcvlibrary(mgcv)# Serão necessários para voltar para escala original ao final.scaled_data <- tb_auc |>select(tem, mol) |>distinct() |>reframe(across(everything(), range))scaled_data
# A tibble: 2 × 2
tem mol
<dbl> <dbl>
1 15 6
2 33 48
Código
# Cria cópias com escalas padronizadas.for (v innames(scaled_data)) { tb_auc[[paste0(v, "_sc")]] <- (tb_auc[[v]] - scaled_data[[v]][1])/diff(scaled_data[[v]])}str(tb_auc)
# Confere se estão na mesma escala.tb_auc |>distinct(tem_sc, mol_sc) |>plot(tem_sc ~ mol_sc, data = _, asp =1)
Código
# Para obter os valores preditos.pred <-with(tb_auc, {expand.grid(tem_sc =seq_expand(c(0, 1), f =0.05, length.out =31),mol_sc =seq_expand(c(0, 1), f =0.05, length.out =31),KEEP.OUT.ATTRS =FALSE)})str(pred)
'data.frame': 961 obs. of 2 variables:
$ tem_sc: num -0.05 -0.0133 0.0233 0.06 0.0967 ...
$ mol_sc: num -0.05 -0.05 -0.05 -0.05 -0.05 -0.05 -0.05 -0.05 -0.05 -0.05 ...
Código
# Volta para a escala original.for (v innames(scaled_data)) { pred[[v]] <- pred[[paste0(v, "_sc")]] *diff(scaled_data[[v]]) + scaled_data[[v]][1]}str(pred)
'data.frame': 961 obs. of 4 variables:
$ tem_sc: num -0.05 -0.0133 0.0233 0.06 0.0967 ...
$ mol_sc: num -0.05 -0.05 -0.05 -0.05 -0.05 -0.05 -0.05 -0.05 -0.05 -0.05 ...
$ tem : num 14.1 14.8 15.4 16.1 16.7 ...
$ mol : num 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 3.9 ...
Código
# Número de combinações únicas.k <-nrow(distinct(tb_auc, tem_sc, mol_sc))k
[1] 16
Código
# Define a variável resposta.tb_auc$y <-log(tb_auc$AUCPD +500)# Ajustes para todas as combinações.tb_fits <- tb_auc |>group_by(Exp, Iso) |>do(model_tps = {# Com parâmetro de penalidade.# gam(y ~ s(tem_sc, mol_sc, k = k, sp = 1), data = .)gam(y ~s(tem_sc, mol_sc, k = k), data = .) } )# Tabela com valores preditos no grid para fazer os gráficos.tb_pred <- tb_fits |>mutate(pred = {# list(cbind(pred, fit = predict(model_rcs, newdata = pred)))list(cbind(pred, fit =predict(model_tps, newdata = pred))) }) |>ungroup() |>select(Exp, Iso, pred) |>unnest(pred)str(tb_pred)
# Gráfico de níveis com linhas de contornos de nível.levelplot(fit ~ tem + mol | Iso + Exp,data = tb_pred,ylab ="Período de molhamento (h)",xlab ="Temperatura (°C)",as.table =TRUE,contour =TRUE,# labels = TRUE,# at = seq(from = 0, to = 110, by = 5),col.regions =colr(101))
Código
# Fazer o gráfico de níveis com ggplot.ggplot(data = tb_pred,mapping =aes(x = tem, y = mol, z = fit, group =1)) +geom_tile(mapping =aes(fill = fit)) +geom_contour(color ="black", bins =20) +facet_grid(facets = Exp ~ Iso) +# scale_fill_gradientn(colours = colr(101)) +scale_fill_distiller(palette ="Spectral") +labs(y ="Wetness period (h)",x ="Temperature (°C)",fill ="AUCPD") +theme_bw()