Walmes Zeviani
##-----------------------------------------------------------------------------
## Definições da sessão.
## rm(list=ls())
## Lista de pacotes a serem usados na sessão.
pkg <- c("lattice", "latticeExtra", "doBy", "multcomp", "plyr", "aod",
"survival")
sapply(pkg, require, character.only=TRUE)
## lattice latticeExtra doBy multcomp plyr aod survival
## TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## Funções extras carregadas do dropbox.
fun <- c("apc.R", "desdobrglht.R", "equallevels.R")
dropbox <- "http://dl.dropboxusercontent.com/u/48140237/"
sapply(paste0(dropbox, fun), source)
## http://dl.dropboxusercontent.com/u/48140237/apc.R
## value ?
## visible FALSE
## http://dl.dropboxusercontent.com/u/48140237/desdobrglht.R
## value ?
## visible FALSE
## http://dl.dropboxusercontent.com/u/48140237/equallevels.R
## value ?
## visible FALSE
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] methods splines stats graphics grDevices utils datasets base
##
## other attached packages:
## [1] aod_1.3 plyr_1.8.1 multcomp_1.3-3 TH.data_1.0-3
## [5] mvtnorm_0.9-9997 doBy_4.5-10 MASS_7.3-33 survival_2.37-7
## [9] latticeExtra_0.6-26 RColorBrewer_1.0-5 lattice_0.20-29 knitr_1.6
##
## loaded via a namespace (and not attached):
## [1] evaluate_0.5.5 formatR_0.10 grid_3.1.0 lme4_1.1-6
## [5] Matrix_1.1-3 minqa_1.2.3 nlme_3.1-117 Rcpp_0.11.2
## [9] RcppEigen_0.3.2.0.2 sandwich_2.3-0 stringr_0.6.2 tools_3.1.0
## [13] zoo_1.7-10
trellis.device(color=FALSE)
##-----------------------------------------------------------------------------
## Leitura dos dados.
da <- read.table("http://www.leg.ufpr.br/~walmes/data/estaca_viabilidade.txt",
header=TRUE, sep="\t")
da$trat <- factor(da$trat)
str(da)
## 'data.frame': 200 obs. of 6 variables:
## $ est : Factor w/ 4 levels "inverno","outono",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ trat : Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ rept : int 1 2 3 4 5 6 7 8 9 10 ...
## $ esq : int 7 9 9 7 9 9 3 9 9 9 ...
## $ dir : int 9 9 9 9 9 9 5 9 9 9 ...
## $ status: int 3 0 0 3 0 0 3 0 0 0 ...
##-----------------------------------------------------------------------------
## Ver.
dotplot(rept~esq+dir|est+trat, data=da,
ylab="Estaca", xlab="Dias")+
as.layer(segplot(rept~esq+dir|est+trat, data=da))
##-----------------------------------------------------------------------------
## Criando vetor que contém informação dos tempos para os eventos e as
## censuras.
S <- with(da,
Surv(time=esq,
time2=dir,
event=status,
type="interval"))
head(S, 10)
## [1] [7, 9] 9+ 9+ [7, 9] 9+ 9+ [3, 5] 9+ 9+ 9+
## Opções são várias: "exponential", "gamma", etc.
dist <- "weibull"
## survreg's scale = 1/(rweibull shape)
## survreg's intercept = log(rweibull scale)
## Modelo com interação.
s0 <- survreg(S~est*trat, data=da, dist=dist)
## Só efeitos aditivos (interação abandonada).
s1 <- survreg(S~est+trat, data=da, dist=dist)
## Só efeito de estação (trat abandonado).
s2 <- survreg(S~est, data=da, dist=dist)
## Sem efeitos de termos experimentais.
s3 <- survreg(S~1, data=da, dist=dist)
## Comparando os modelos o que implica em testar os termos abandonados
## de um para o outro.
anova(s3, s2, s1, s0)
## Terms Resid. Df -2*LL Test Df Deviance Pr(>Chi)
## 1 1 198 594.5 NA NA NA
## 2 est 195 521.3 = 3 73.183 8.882e-16
## 3 est + trat 191 518.8 = 4 2.449 6.538e-01
## 4 est * trat 179 496.0 = 12 22.798 2.949e-02
## Outra forma e aplicar a função dropterm() que testa o abandono de
## termos de efeito fixo mas sem fazer reajustes, via aproximação de Wald.
dropterm(s0, test="Chisq")
## Warning: no 'nobs' method is available
## Warning: no 'nobs' method is available
## Single term deletions
##
## Model:
## S ~ est * trat
## Df AIC LRT Pr(Chi)
## <none> 538
## est:trat 12 537 22.8 0.029 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
dropterm(s1, test="Chisq")
## Warning: no 'nobs' method is available
## Warning: no 'nobs' method is available
## Warning: no 'nobs' method is available
## Single term deletions
##
## Model:
## S ~ est + trat
## Df AIC LRT Pr(Chi)
## <none> 537
## est 3 605 74.1 5.7e-16 ***
## trat 4 531 2.4 0.65
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Estimativas dos parâmetros.
summary(s0)
##
## Call:
## survreg(formula = S ~ est * trat, data = da, dist = dist)
## Value Std. Error z p
## (Intercept) 2.4191 0.1275 18.979 2.52e-80
## estoutono 0.1631 0.1514 1.077 2.81e-01
## estprimavera -0.4405 0.1600 -2.754 5.89e-03
## estverão -0.3218 0.1530 -2.103 3.55e-02
## trat2 -0.1975 0.1552 -1.272 2.03e-01
## trat3 0.1012 0.1989 0.509 6.11e-01
## trat4 -0.1851 0.1599 -1.158 2.47e-01
## trat5 -0.2252 0.1519 -1.482 1.38e-01
## estoutono:trat2 0.2505 0.1976 1.267 2.05e-01
## estprimavera:trat2 0.4964 0.2423 2.049 4.05e-02
## estverão:trat2 0.2183 0.1935 1.128 2.59e-01
## estoutono:trat3 -0.1280 0.2292 -0.558 5.77e-01
## estprimavera:trat3 -0.3487 0.2358 -1.479 1.39e-01
## estverão:trat3 -0.0983 0.2295 -0.428 6.68e-01
## estoutono:trat4 0.1734 0.1982 0.875 3.82e-01
## estprimavera:trat4 0.1131 0.2073 0.546 5.85e-01
## estverão:trat4 0.3794 0.2069 1.833 6.67e-02
## estoutono:trat5 0.1745 0.1896 0.920 3.57e-01
## estprimavera:trat5 0.2087 0.2018 1.034 3.01e-01
## estverão:trat5 0.3218 0.1934 1.664 9.62e-02
## Log(scale) -1.5258 0.0884 -17.263 8.92e-67
##
## Scale= 0.217
##
## Weibull distribution
## Loglik(model)= -248 Loglik(intercept only)= -297.2
## Chisq= 98.43 on 19 degrees of freedom, p= 1e-12
## Number of Newton-Raphson Iterations: 6
## n= 200
##-----------------------------------------------------------------------------
## Obter as estimativas para cada tratamento em cada estação. A lm()
## aqui é só para obter a matriz.
## Médias para a estação primavera.
X <- LSmatrix(lm(dir~est*trat, data=da), effect=c("trat","est"))
grid <- attr(X, "grid")
L <- by(X, INDICES=grid$est, FUN=as.matrix)
L <- lapply(L, "rownames<-", levels(da$trat))
g <- lapply(L, desdobr.glht, m0=s0, focus="trat", test="fdr")
grid <- ldply(g); names(grid)[1] <- "est"
grid <- equallevels(grid, da)
grid
## est trat estimate lwr upr cld
## 1 inverno 1 2.419 2.169 2.669 a
## 2 inverno 2 2.222 2.045 2.398 a
## 3 inverno 3 2.520 2.213 2.827 a
## 4 inverno 4 2.234 2.042 2.426 a
## 5 inverno 5 2.194 2.030 2.358 a
## 6 outono 1 2.582 2.419 2.745 a
## 7 outono 2 2.635 2.459 2.811 a
## 8 outono 3 2.555 2.403 2.708 a
## 9 outono 4 2.570 2.408 2.733 a
## 10 outono 5 2.531 2.379 2.684 a
## 11 primavera 1 1.979 1.787 2.170 ab
## 12 primavera 2 2.278 1.970 2.585 a
## 13 primavera 3 1.731 1.577 1.885 b
## 14 primavera 4 1.907 1.731 2.082 ab
## 15 primavera 5 1.962 1.785 2.139 ab
## 16 verão 1 2.097 1.934 2.261 a
## 17 verão 2 2.118 1.963 2.273 a
## 18 verão 3 2.100 1.946 2.255 a
## 19 verão 4 2.292 2.098 2.485 a
## 20 verão 5 2.194 2.030 2.358 a
## Cuidado! Essas estimativas ainda não são as médias ou medianas de
## tempo para tornar inviável. Estão na escala do preditor linear de uma
## particular parametrização da distribuição Weibull. Operações tem que
## ser feitas para chegar aos valores desejados ou interpretáveis.
## Com essas igualdades podemos chegar às curvas de "sobrevivência".
## survreg's scale = 1/(rweibull shape)
## survreg's intercept = log(rweibull scale)
grid$wscale <- exp(grid$estimate)
grid$wshape <- 1/s0$scale
##-----------------------------------------------------------------------------
## As curvas de sobrevivência.
time <- seq(0, 15, by=0.5)
cur <- ddply(grid, .(est, trat), summarise,
time=time, prob=pweibull(time, shape=wshape, scale=wscale))
str(cur)
## 'data.frame': 620 obs. of 4 variables:
## $ est : Factor w/ 4 levels "inverno","outono",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ trat: Factor w/ 5 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ time: num 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 ...
## $ prob: num 0.00 6.08e-07 1.47e-05 9.51e-05 3.57e-04 ...
## Curvas de "sobrevivência" que expressam a probabilidade de ficar
## inviável como função do tempo.
xyplot(prob~time|est, groups=trat, data=cur, type="l",
auto.key=list(columns=3, lines=TRUE, points=FALSE),
xlab="Dias", ylab=expression(Pr(Inviável)))