Período de latência in vitro 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 vitro via discos de folhas em função da temperatura, com 8 níveis. Foram consideradas 4 repetições para cada temperatura. O experimento foi realizado duas vezes sob o mesmo delineamento (DIC) e níveis de temperatura. 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("disco_pustula.txt", header=TRUE, sep="\t")
str(da)
## 'data.frame':    64 obs. of  20 variables:
##  $ bloco: Factor w/ 2 levels "I","II": 1 1 1 1 1 1 1 1 1 1 ...
##  $ temp : int  18 18 18 18 20 20 20 20 22 22 ...
##  $ rept : int  1 2 3 4 1 2 3 4 1 2 ...
##  $ dia3 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ dia4 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ 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 0 0 0 0 0 0 0 0 ...
##  $ dia10: int  0 0 0 0 0 0 0 0 21 8 ...
##  $ dia11: int  0 0 0 0 0 0 0 4 82 32 ...
##  $ dia12: int  0 0 0 0 0 3 5 7 228 123 ...
##  $ dia13: int  0 0 0 0 4 15 10 20 451 468 ...
##  $ dia14: int  1 0 0 0 47 79 18 29 510 557 ...
##  $ dia15: int  3 0 0 1 74 162 27 110 565 563 ...
##  $ dia16: int  3 5 0 2 123 238 40 163 570 580 ...
##  $ dia17: int  7 8 0 4 273 344 88 247 570 580 ...
##  $ dia18: int  7 8 0 4 273 344 88 247 570 580 ...
##  $ dia19: int  7 8 7 7 273 344 88 247 570 580 ...
##-----------------------------------------------------------------------------
## Conversões.

## Criar os níveis de unidade experimental.

da <- transform(da,
                ue=interaction(bloco,temp,rept),
                rept=interaction(bloco,rept),
                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)+2
                  tot <- length(x)+2
                  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"),
           measure.vars=diacol, variable_name="dia")
db$dia <- as.integer(gsub("\\D", "", db$dia))
db <- na.omit(db)
str(db)
## 'data.frame':    1088 obs. of  6 variables:
##  $ bloco: Factor w/ 2 levels "I","II": 1 1 1 1 1 1 1 1 1 1 ...
##  $ temp : int  18 18 18 18 20 20 20 20 22 22 ...
##  $ Temp : Factor w/ 8 levels "18","20","22",..: 1 1 1 1 2 2 2 2 3 3 ...
##  $ ue   : Factor w/ 64 levels "I.18.1","II.18.1",..: 1 17 33 49 3 19 35 51 5 21 ...
##  $ dia  : int  3 3 3 3 3 3 3 3 3 3 ...
##  $ value: int  0 0 0 0 0 0 0 0 0 0 ...
da <- da[,-diacol]
## str(da)

Análise exploratória

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

cap <-
"Tempo para o aparecimento de pustulas em discos 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 <- "Unidades experimentais"
ylab <- "Tempo para o aparecimento de pustulas nos discos"

dotplot(time2+time~rept|Temp, data=subset(da), layout=c(NA,1),
        scales=list(x=list(relation="free", draw=FALSE)),
        xlab=xlab, ylab=ylab)+
as.layer(
    segplot(rept~time2+time|Temp, data=subset(da), draw=FALSE,
            layout=c(NA,1), horizontal=FALSE,
            scales=list(x=list(relation="free", draw=FALSE))))
Figura 1: Tempo para o aparecimento de pustulas em discos 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 pustulas 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 pustulas.

ylab <- "Pustulas"
xlab <- "Dias de avaliação"

xyplot(value~dia|Temp, groups=ue, data=db, type="o",
       xlab=xlab, ylab=ylab)
Figura 2: Número de pustulas 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 <- "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)        59 281.8      NA       NA        NA
## 2             bloco + Temp        54 259.9    =  5    21.89 0.0005484
## Estimativas dos parâmetros.
summary(m1)
## 
## Call:
## survreg(formula = S ~ bloco + Temp, data = da, dist = dist)
##              Value Std. Error     z        p
## (Intercept) 15.341     0.7257 21.14 3.45e-99
## blocoII      0.410     0.4827  0.85 3.95e-01
## Temp20      -2.546     0.9662 -2.64 8.40e-03
## Temp22      -5.046     0.9662 -5.22 1.76e-07
## Temp24      -6.796     0.9662 -7.03 2.00e-12
## Temp25      -7.296     0.9662 -7.55 4.30e-14
## Temp26      -8.046     0.9662 -8.33 8.23e-17
## Temp28      -7.921     0.9662 -8.20 2.43e-16
## Temp30      -0.692     0.9738 -0.71 4.77e-01
## Log(scale)   0.644     0.0948  6.79 1.10e-11
## 
## Scale= 1.9 
## 
## Gaussian distribution
## Loglik(model)= -129.9   Loglik(intercept only)= -169.9
##  Chisq= 79.97 on 8 degrees of freedom, p= 5e-14 
## Number of Newton-Raphson Iterations: 5 
## n= 64
##-----------------------------------------------------------------------------
## Predição.

pred <- with(da, expand.grid(bloco="I", Temp=levels(Temp)))
pred$time <- predict(m1, newdata=pred, type="quantile", p=0.5)

X <- LSmatrix(lm(time2~bloco+Temp, data=da), effect=c("Temp"))
rownames(X) <- levels(da$Temp)
grid <- equallevels(attr(X, "grid"), da)
## ci <- confint(glht(m1, linfct=X), calpha=univariate_calpha())$confint
## grid <- cbind(grid, ci)

grid <- desdobr.glht(X, m0=m1, focus="Temp", test="fdr")
grid$temp <- as.integer(as.character(grid$Temp))
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 discos.
FV GL chi-quadrado Pr(>chi)
bloco 1 0.72 0.3952
Temp 7 161.07 0.0000

Tabela 2: Estimativas acompanhadas do intervalo de confiança de 95% para o tempo mediano para aparecimento de pústulas em função da temperatura. Estimativas seguidas de letras iguais indicam contraste entre médias não diferente de zero.
  Temp estimate lwr upr cld temp
1 18 16 14.20 16.89 a 18
2 20 13 11.67 14.33 b 20
3 22 11 9.17 11.83 c 22
4 24 9 7.42 10.08 cd 24
5 25 8 6.92 9.58 d 25
6 26 8 6.17 8.83 d 26
7 28 8 6.29 8.96 d 28
8 30 15 13.50 16.21 ab 30
##-----------------------------------------------------------------------------

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. Barras de erro representam o intervalo de confiança de 95%."

##-----------------------------------------------------------------------------
## Número acumulado de pustulas.

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

## xyplot(time~as.integer(as.character(Temp)), data=pred,
##        xlab=xlab, ylab=ylab)

xyplot(estimate~temp, data=grid,
       xlab=xlab, ylab=ylab,
       ly=grid$lwr, uy=grid$upr, cty="bars",
       prepanel=prepanel.cbH, panel=panel.cbH)
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. Barras de erro representam o intervalo de confiança de 95%.

Análise para a severidade

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

## O bloco dois não será considerado.

dc <- ddply(subset(db, bloco=="I"), .(temp, Temp, ue), summarise,
            aac=aac(dia/(19-3), value))

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

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

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

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))

n0 <- gnls(y~thy*exp(thq*(temp-thx)^2+thc*(temp-thx)^3),
           params=thy+thq+thx+thc~1,
           data=dc,
           start=unlist(start),
           weights=varComb(varIdent(form=~1), varPower(value=0.7,
               form=~fitted(.))))

summary(n0)
## Generalized nonlinear least squares fit
##   Model: y ~ thy * exp(thq * (temp - thx)^2 + thc * (temp - thx)^3) 
##   Data: dc 
##     AIC   BIC logLik
##   139.4 148.2  -63.7
## 
## Combination of variance functions: 
##  Structure: Power of variance covariate
##  Formula: ~fitted(.) 
##  Parameter estimates:
##  power 
## 0.4439 
## 
## Coefficients:
##      Value Std.Error t-value p-value
## thy 17.776    0.9098   19.54  0.0000
## thq -0.073    0.0058  -12.53  0.0000
## thx 23.981    0.2243  106.89  0.0000
## thc -0.001    0.0017   -0.47  0.6428
## 
##  Correlation: 
##     thy    thq    thx   
## thq -0.540              
## thx -0.173 -0.033       
## thc  0.114  0.100 -0.807
## 
## Standardized residuals:
##     Min      Q1     Med      Q3     Max 
## -2.2718 -0.5804 -0.0802  0.7452  1.8118 
## 
## Residual standard error: 0.8334 
## Degrees of freedom: 32 total; 28 residual
intervals(n0)
## Approximate 95% confidence intervals
## 
##  Coefficients:
##         lower       est.     upper
## thy 15.912167 17.7757201 19.639274
## thq -0.084683 -0.0727806 -0.060878
## thx 23.521461 23.9810113 24.440561
## thc -0.004181 -0.0007786  0.002624
## attr(,"label")
## [1] "Coefficients:"
## 
##  Variance function:
##          lower   est.  upper
## B.power 0.2028 0.4439 0.6849
## attr(,"label")
## [1] "Variance function:"
## 
##  Residual standard error:
##  lower   est.  upper 
## 0.4688 0.7796 1.2964
##-----------------------------------------------------------------------------
## Predição.

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

## 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(coef(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 3: 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 t-value p-value lower upper
thy 17.7757 0.9098 19.5390 0.0000 15.9122 19.6393
thq -0.0728 0.0058 -12.5258 0.0000 -0.0847 -0.0609
thx 23.9810 0.2243 106.8935 0.0000 23.5215 24.4406
thc -0.0008 0.0017 -0.4688 0.6428 -0.0042 0.0026

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

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 pustulas"

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:00 BRT"