Período de latência em folhas (in vivo) para ferrugem da figueira em função da temperatura

Eliane Aparecida Rogovski Czaja
Walmes Marques Zeviani
Louise Larissa May De Mio

Material e métodos

O experimento consistiu na avaliação do período de latência e número de pústulas de ferrugem da figueira avaliada in vivo nas folhas de figueira em função da temperatura, com 9 níveis. Foram consideradas de 3 à 5 folhas por planta (unidade experimental) e 3 plantas por temperatura. Para avaliar os 9 níveis, foram feitos 3 experimentos sob o mesmo delineamento (DIC), mudando-se apenas as temperaturas avaliadas. Assim, cada repetição do experimento representa um bloco.

O tempo para aparecimento de pustulas e o valor de número de pústulas (severidade) foram os objetivos de investigação. Como as avaliações foram diárias, o tempo para aparecimento de pústula é uma variável registrada com censura intervalar quando a ocorre entre dois dias e censura à direita quando ocorre após o último dia de avaliação. A partir das avaliações foram obtidos os tempos e tipos de censura. O seguinte modelo foi considerado:

\[ \begin{aligned} Y_{ijk} &\sim Normal(\mu_{ij}, \sigma^2) \newline \mu_{ij} &= \mu+ \alpha_i +\tau_j \newline \end{aligned} \]

em que \(Y_{ijk}\) é o tempo para aparecimento de pústula na unidade experimental \(k\) da temperatura \(j\) no bloco \(i\). O efeito fixo de bloco e manejo são representados por \(\alpha_i\) e \(\tau_j\). A variância residual representada por \(\sigma^2\). O modelo teve seus parâmetros estimados por máxima verossimilhança considerando o tipos de censura intervalar e à direita.

O teste de Wald foi aplicado para avaliar a significância dos termos de efeito fixo. Foram aplicados contrastes entre médias para os níveis de temperatura. O p-valor para os contrastes foram corrigidos pelo método fdr (false discovery rate). Todos os testes de hipótese foram conduzidos sob um nível nominal de significância de 5%.

Para análise da severidade foi considerado à área abaixo da curva do número de pústulas nas folhas ao longo das avaliações dividido pelo número de dias em avaliação o que representa assim a média do número de pústulas. O efeito da temperatura foi representado pelo modelo de regressão não linear:

\[ \begin{aligned} f(x) &= \theta_{y} \exp\{\theta_{q} (x-\theta_{x})^2+\theta_{c}(x-\theta_{x})^3\} \end{aligned} \]

em que \(\theta_y\) representa o valor médio da resposta para a temperatura (\(x\)) ótima \(\theta_x\), \(\theta_q\) está relacionado ao nível de especificidade à temperatura de ótimo (quanto maior \(\theta_q\) menor é a severidade para temperaturas longe do ótimo) e \(\theta_c\) está relacionado à assimetria na resposta para variações de estímulo da temperatura ao redor do ótimo.

O modelo teve seus parâmetros estimados por máxima verossimilhança. Os pressupostos do modelo considerado foram inspecionados por análise gráfica dos resíduos. Transformações da resposta, eliminação de observações ou modelagem da variância foram abordagens considerados para adequar os pressupostos se apresentassem fuga. Todos os testes de hipótese foram conduzidos sob um nível nominal de significância de 5%.

Leitura e organização dos dados

##-----------------------------------------------------------------------------
## Definições da sessão.

## rm(list=ls())

## Lista de pacotes a serem usados na sessão.
pkg <- c("lattice", "latticeExtra", "doBy", "multcomp", "plyr",
         "reshape", "survival", "nlme")
sapply(pkg, require, character.only=TRUE)

## Funções carregadas da Public do dropbox.
## dburl <- "http://dl.dropboxusercontent.com/u/48140237/"
dburl <- "~/Dropbox/Public/"
extrafun <- c("aac.R","apc.R","desdobrglht.R","equallevels.R","bandas.R")
sapply(paste0(dburl, extrafun), source)

trellis.device(color=FALSE)

##-----------------------------------------------------------------------------
## Para formatar tabelas.

myformat <- function(table, digits){
    tb <- table
    for(i in 1:ncol(tb)){
        x <- tb[,i]
        d <- digits[i]
        if(is.numeric(x)){
            f <- paste0("      %0.", d, "f")
            x <- sprintf(f, x) 
        } else {
            x <- as.character(x)
        }
        tb[,i] <- x
    }
    return(tb)
}
## myformat(cars, c(2,4))
##-----------------------------------------------------------------------------
## Leitura.

da <- read.table("folha_pustula.txt", header=TRUE, sep="\t")
str(da)
## 'data.frame':    175 obs. of  17 variables:
##  $ bloco: Factor w/ 3 levels "I","II","III": 1 1 1 1 1 1 1 1 1 1 ...
##  $ temp : int  20 20 20 20 20 20 20 20 20 20 ...
##  $ rept : int  1 1 1 1 1 2 2 2 2 2 ...
##  $ folha: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5 1 2 3 4 5 ...
##  $ dia5 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ dia6 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ dia7 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ dia8 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ dia9 : int  0 0 1 0 0 0 0 4 2 1 ...
##  $ dia10: int  0 0 3 0 3 1 0 23 4 5 ...
##  $ dia11: int  2 3 19 3 11 15 5 98 10 19 ...
##  $ dia12: int  48 9 25 17 43 35 18 107 41 38 ...
##  $ dia13: int  60 11 27 20 57 68 24 110 55 58 ...
##  $ dia14: int  60 11 29 20 59 75 25 113 55 60 ...
##  $ dia15: int  NA NA NA NA NA NA NA NA NA NA ...
##  $ dia16: int  NA NA NA NA NA NA NA NA NA NA ...
##  $ dia17: int  NA NA NA NA NA NA NA NA NA NA ...
##-----------------------------------------------------------------------------
## Conversões.

## Criar os níveis de unidade experimental (plantas).
## Criar os níveis de unidade amostral (folhas).

da <- transform(da,
                ue=interaction(bloco,temp,rept),
                ua=interaction(bloco,temp,rept,folha),
                uf=interaction(rept,folha),
                Temp=factor(temp))

## Calcular o tempo para a primeira observação não nula de
## pustulas. Esse será o limite superior do intervalo censurado de
## observação.

diacol <- grep("^dia\\d", names(da))
surv <- apply(da[,diacol], 1,
              function(x){
                  x <- na.omit(x)
                  cs <- cumsum(x)
                  time <- sum(cs==0)+4
                  tot <- length(x)+4
                  isless <- time<tot
                  c(time2=time+isless, status=ifelse(isless, 3, 0))
              })
da <- cbind(da, t(surv))
da$time <- with(da, ifelse(status==0, time2, time2-1))
## str(da)

##-----------------------------------------------------------------------------
## Empilhar nas folhas.

db <- melt(da, id.vars=c("bloco","temp","Temp","ue","ua","uf"),
           measure.vars=diacol, variable_name="dia")
db$dia <- as.integer(gsub("\\D", "", db$dia))
db <- na.omit(db)
str(db)
## 'data.frame':    1975 obs. of  8 variables:
##  $ bloco: Factor w/ 3 levels "I","II","III": 1 1 1 1 1 1 1 1 1 1 ...
##  $ temp : int  20 20 20 20 20 20 20 20 20 20 ...
##  $ Temp : Factor w/ 9 levels "15","18","20",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ ue   : Factor w/ 135 levels "I.15.1","II.15.1",..: 7 7 7 7 7 34 34 34 34 34 ...
##  $ ua   : Factor w/ 675 levels "I.15.1.A","II.15.1.A",..: 7 142 277 412 547 34 169 304 439 574 ...
##  $ uf   : Factor w/ 25 levels "1.A","2.A","3.A",..: 1 6 11 16 21 2 7 12 17 22 ...
##  $ dia  : int  5 5 5 5 5 5 5 5 5 5 ...
##  $ value: int  0 0 0 0 0 0 0 0 0 0 ...
##  - attr(*, "na.action")=Class 'omit'  Named int [1:300] 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 ...
##   .. ..- attr(*, "names")= chr [1:300] "1751" "1752" "1753" "1754" ...
da <- da[,-diacol]
## str(da)

Análise exploratória

##-----------------------------------------------------------------------------

cap <-
"Tempo para o aparecimento de pústulas nas folhas em função da
 temperatura. Pontos ligados por segmentos indicam que o evento foi
 observado no intervalo (censura intervalar). Pontos sem segmentos
 indicam o evento não ocorreu antes da avaliação (censura à direita)."

##-----------------------------------------------------------------------------
## Enfolhamento.

xlab <- "Folhas"
ylab <- "Tempo para o aparecimento de pústulas nas folhas"

dotplot(time2+time~uf|Temp, data=da, layout=c(NA,1),
        scales=list(x=list(relation="free", draw=FALSE)),
        xlab=xlab, ylab=ylab)+
as.layer(
    segplot(uf~time2+time|Temp, data=da, draw=FALSE,
            layout=c(NA,1), horizontal=FALSE,
            scales=list(x=list(relation="free", draw=FALSE))))
Figura 1: Tempo para o aparecimento de pústulas nas folhas em função da temperatura. Pontos ligados por segmentos indicam que o evento foi observado no intervalo (censura intervalar). Pontos sem segmentos indicam o evento não ocorreu antes da avaliação (censura à direita).
##-----------------------------------------------------------------------------

cap <-
"Número de pústulas em função dos dias de avaliação. Pontos unidos por linhas
 indicam a mesma folha em cada uma das temperaturas."

##-----------------------------------------------------------------------------
## Número acumulado de pústulas.

ylab <- "Pústulas"
xlab <- "Dias de avaliação"

xyplot(value~dia|Temp, groups=uf, data=db, type="o",
       xlab=xlab, ylab=ylab)
Figura 2: Número de pústulas em função dos dias de avaliação. Pontos unidos por linhas indicam a mesma folha em cada uma das temperaturas.

Análise para o período para latência

##-----------------------------------------------------------------------------
## Preparando resposta para análise de sobreviência.

S <- with(da, Surv(time=time, time2=time2, event=status, type="interval"))

##-----------------------------------------------------------------------------
## Ajuste considerando distribuição Weibull.

## dist <- "exponential"
## dist <- "weibull"
dist <- "gaussian"

## Modelo com efeito de temp dado por polinômio.
m0 <- survreg(S~bloco+temp+I(temp^2), data=da, dist=dist)

## Modelo com efeito categórico de temp.
m1 <- survreg(S~bloco+Temp, data=da, dist=dist)

## Existe falta de ajuste?
anova(m0, m1)
##                      Terms Resid. Df -2*LL Test Df Deviance Pr(>Chi)
## 1 bloco + temp + I(temp^2)       169 504.6      NA       NA       NA
## 2             bloco + Temp       163 504.3    =  6   0.3799    0.999
## Estimativas dos parâmetros.
summary(m0)
## 
## Call:
## survreg(formula = S ~ bloco + temp + I(temp^2), data = da, dist = dist)
##              Value Std. Error      z        p
## (Intercept) 96.919     7.4390  13.03 8.43e-39
## blocoII      0.983     0.3443   2.85 4.32e-03
## blocoIII     5.784     0.0000    Inf 0.00e+00
## temp        -7.681     0.6286 -12.22 2.46e-34
## I(temp^2)    0.166     0.0131  12.64 1.27e-36
## Log(scale)   0.607     0.0703   8.63 5.91e-18
## 
## Scale= 1.83 
## 
## Gaussian distribution
## Loglik(model)= -252.3   Loglik(intercept only)= -390.3
##  Chisq= 276 on 4 degrees of freedom, p= 0 
## Number of Newton-Raphson Iterations: 8 
## n= 175
##-----------------------------------------------------------------------------
## Estimativa pontual da temperatura ótima para latência.

c0 <- coef(m0)
tmin <- -0.5*c0[4]/c0[5]
tmin
##  temp 
## 23.18
##-----------------------------------------------------------------------------
## Predição.

pred <- with(da, expand.grid(bloco="I", temp=seq(15, 32, by=0.25)))
pred$time <- predict(m0, newdata=pred, type="quantile", p=0.5)

##-----------------------------------------------------------------------------
## Com bandas.

levels(pred$bloco) <- c("I","II","III")

b <- coef(m0)
b <- b[-3]
F <- model.matrix(~bloco+temp+I(temp^2), pred)
F <- F[,names(b)]
U <- chol(vcov(m0)[names(b),names(b)])

pred$se <- sqrt(apply(F%*%t(U), 1, function(x) sum(x^2)))
zval <- qnorm(p=c(lwr=0.025, fit=0.5, upr=0.975))
me <- outer(pred$se, zval, "*")
b <- sweep(me, 1, pred$time, "+")
pred <- cbind(pred, b)

Tabela 1: Quadro de testes de Wald para os termos de efeito fixo do modelo para o tempo até o aparecimento de pústulas em folhas.
FV GL chi-quadrado Pr(>chi)
bloco 1 8.15 0.0043
temp 1 149.30 0.0000
I(temp2) 1 159.78 0.0000

##-----------------------------------------------------------------------------

cap <-
"Tempo mediano estimado para latência em função da temperatura. O tempo
 mediano representa o tempo necessário para que 50% das folhas apresentem
 latência."

##-----------------------------------------------------------------------------
## Número acumulado de pústulas.

ylab <- "Tempo para latência (dias)"
xlab <- expression("Temperatura"~(degree*C))

xyplot(time~temp, data=pred, type="l",
       xlab=xlab, ylab=ylab,
       prepanel=prepanel.cbH, cty="bands",
       ly=pred$lwr, uy=pred$upr,
       panel=panel.cbH)+
    layer(panel.abline(v=tmin, lty=2))
Figura 3: Tempo mediano estimado para latência em função da temperatura. O tempo mediano representa o tempo necessário para que 50% das folhas apresentem latência.

Análise para a severidade

##-----------------------------------------------------------------------------
## Área abaixo da curva do número de pústulas.

## Para que não ocorra viés devido o comprimento de observação ter sido
## diferente para os blocos, será selecionado o menor intervalo de
## observação, no caso, 14 dias. Além do mais, as temperaturas extremas
## (15 e 32), não tiveram registro de putulas e não serão consideradas
## nessa análise devido não apresentar variância entre suas observações.

## db <- droplevels(subset(db, dia<=14 & temp>15 & temp<32))
dc <- droplevels(subset(db, dia<=14))
dc <- ddply(dc, .(bloco, temp, Temp, ue, ua, uf), summarise,
            aac=aac(dia/14, value))

##-----------------------------------------------------------------------------
## Ver.

## xyplot(aac~temp, groups=bloco, data=dc)
## xyplot(sqrt(aac)~temp, groups=bloco, data=dc)
## xyplot(log(aac+1)~temp, groups=bloco, data=dc)
## xyplot(aac^(1/3)~temp, groups=bloco, data=dc)

##-----------------------------------------------------------------------------
## Análise.

## Beta generalizada.
## dc$y <- log(dc$aac+1)
## plot(y~temp, data=dc)
## start <- list(b0=0.01, tmax=35, tmin=15, thx=1, thn=1)
## with(start, curve(b0*(tmax-x)^thx*(x-tmin)^thn, add=TRUE))
## n0 <- nls(y~b0*(tmax-temp)^thx*(temp-tmin)^thn, data=dc,
##           start=start)
## Não dá para ajustar.

dc$y <- dc$aac^(1/2)
start <- list(thy = 3.811, thq = -0.075, thx = 22.862, thc = 0.001)
## plot(y~temp, data=dc)
## with(start, curve(thy*exp(thq*(x-thx)^2+thc*(x-thx)^3), add=TRUE))

dc <- groupedData(y~temp|ue, data=dc, order=FALSE)
n0 <- nlme(y~thy*exp(thq*(temp-thx)^2+thc*(temp-thx)^3),
           random=thy~1,
           fixed=thy+thq+thx+thc~1,
           data=dc,
           start=unlist(start),
           weights=varComb(varIdent(form=~1), varPower(value=0.7,
               form=~fitted(.))))

summary(n0)
## Nonlinear mixed-effects model fit by maximum likelihood
##   Model: y ~ thy * exp(thq * (temp - thx)^2 + thc * (temp - thx)^3) 
##  Data: dc 
##     AIC   BIC logLik
##   361.9 384.1   -174
## 
## Random effects:
##  Formula: thy ~ 1 | ue
##             thy Residual
## StdDev: 4.4e-07   0.9189
## 
## Combination of variance functions: 
##  Structure: Power of variance covariate
##  Formula: ~fitted(.) 
##  Parameter estimates:
##  power 
## 0.6114 
## Fixed effects: thy + thq + thx + thc ~ 1 
##      Value Std.Error  DF t-value p-value
## thy  6.282    0.4409 127   14.25  0.0000
## thq -0.086    0.0068 127  -12.54  0.0000
## thx 22.883    0.1873 127  122.17  0.0000
## thc  0.001    0.0013 127    0.92  0.3614
##  Correlation: 
##     thy    thq    thx   
## thq -0.623              
## thx -0.198  0.353       
## thc  0.297 -0.572 -0.750
## 
## Standardized Within-Group Residuals:
##     Min      Q1     Med      Q3     Max 
## -1.1952 -0.4996 -0.1969  0.1741  7.2246 
## 
## Number of Observations: 175
## Number of Groups: 45
intervals(n0)
## Approximate 95% confidence intervals
## 
##  Fixed effects:
##        lower      est.     upper
## thy  5.41977  6.282235  7.144698
## thq -0.09926 -0.085866 -0.072471
## thx 22.51642 22.882804 23.249190
## thc -0.00135  0.001189  0.003727
## attr(,"label")
## [1] "Fixed effects:"
## 
##  Random Effects:
##   Level: ue 
##             lower    est.     upper
## sd(thy) 7.891e-84 4.4e-07 2.454e+70
## 
##  Variance function:
##          lower   est.  upper
## B.power 0.5409 0.6114 0.6819
## attr(,"label")
## [1] "Variance function:"
## 
##  Within-group standard error:
##  lower   est.  upper 
## 0.8216 0.9189 1.0277
##-----------------------------------------------------------------------------
## Predição.

pred <- data.frame(temp=seq(15, 32, by=0.25))
pred$y <- predict(n0, newdata=pred, level=0)

## xyplot(y~temp, data=dc)+
##     as.layer(xyplot(y~temp, data=pred, type="l"))

##-----------------------------------------------------------------------------
## Inclusão das bandas.

model <- deriv3(~thy*exp(thq*(temp-thx)^2+thc*(temp-thx)^3),
                c("thy","thq","thx","thc"),
                function(temp, thy,thq,thx,thc){NULL})
pred2 <- pred

m <- do.call(model, args=c(list(temp=pred2$temp),
                        as.list(fixef(n0))))

F <- attr(m, "gradient")
U <- chol(vcov(n0))

pred2$se <- sqrt(apply(F%*%t(U), 1, function(x) sum(x^2)))
zval <- qnorm(p=c(lwr=0.025, fit=0.5, upr=0.975))
me <- outer(pred2$se, zval, "*")
b <- sweep(me, 1, m, "+")
pred2 <- cbind(pred2, b)
## str(pred2)

Tabela 2: Quadro de de estimativas dos parâmetros do modelo de regressão não linear para a curva do número médio de pústulas em função da temperatura.
Parâmetro Value Std.Error DF t-value p-value
thy 6.2822 0.4409 127.0000 14.2482 0.0000
thq -0.0859 0.0068 127.0000 -12.5392 0.0000
thx 22.8828 0.1873 127.0000 122.1678 0.0000
thc 0.0012 0.0013 127.0000 0.9160 0.3614

##-----------------------------------------------------------------------------

cap <-
"Raíz do número médio de pústulas ao longo das avaliações em função da
 temperatura. Linha representa o valor ajustado pelo modelo não linear
 considerado com a respectiva banda de confiança de 95%."

##-----------------------------------------------------------------------------

## Gráfico.

xlab <- "Temperatura"
ylab <- "Raíz do número médio de pústulas"

xyplot(y~temp, data=dc, type="p", xlab=xlab, ylab=ylab)+
    as.layer(xyplot(fit~temp, data=pred2, type="l",
                    prepanel=prepanel.cbH, cty="bands",
                    ly=pred2$lwr, uy=pred2$upr,
                    panel=panel.cbH
                    ))
Figura 4: Raíz do número médio de pústulas ao longo das avaliações em função da temperatura. Linha representa o valor ajustado pelo modelo não linear considerado com a respectiva banda de confiança de 95%.

Informações da sessão, sistema e data de processamento

##-----------------------------------------------------------------------------

sessionInfo()
## R version 3.1.0 (2014-04-10)
## Platform: x86_64-pc-linux-gnu (64-bit)
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=pt_BR.UTF-8       
##  [4] LC_COLLATE=en_US.UTF-8     LC_MONETARY=pt_BR.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=pt_BR.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
## [10] LC_TELEPHONE=C             LC_MEASUREMENT=pt_BR.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] splines   stats     graphics  grDevices utils     datasets  base     
## 
## other attached packages:
##  [1] nlme_3.1-117        reshape_0.8.5       plyr_1.8.1          multcomp_1.3-3     
##  [5] TH.data_1.0-3       mvtnorm_0.9-9997    doBy_4.5-10         MASS_7.3-33        
##  [9] survival_2.37-7     latticeExtra_0.6-26 RColorBrewer_1.0-5  lattice_0.20-29    
## [13] knitr_1.6          
## 
## loaded via a namespace (and not attached):
##  [1] aod_1.3             cluster_1.15.2      evaluate_0.5.5      formatR_0.10       
##  [5] Formula_1.1-1       Gmisc_0.6.2.3       grid_3.1.0          Hmisc_3.14-4       
##  [9] lme4_1.1-6          Matrix_1.1-4        methods_3.1.0       minqa_1.2.3        
## [13] Rcpp_0.11.2         RcppEigen_0.3.2.0.2 sandwich_2.3-0      sp_1.0-15          
## [17] stringr_0.6.2       tools_3.1.0         zoo_1.7-10
cbind(Sys.info())
##                [,1]                                        
## sysname        "Linux"                                     
## release        "3.13.0-30-generic"                         
## version        "#54-Ubuntu SMP Mon Jun 9 22:45:01 UTC 2014"
## nodename       "brother"                                   
## machine        "x86_64"                                    
## login          "walmes"                                    
## user           "walmes"                                    
## effective_user "walmes"
Sys.time()
## [1] "2014-06-30 17:22:23 BRT"