Milson E. Serafim & Walmes M. Zeviani
vignettes/gen_teca.Rmd
gen_teca.Rmd
#-----------------------------------------------------------------------
# Carrega os pacotes necessários.
rm(list = ls())
library(lattice)
library(latticeExtra)
library(grid)
library(gridExtra)
library(plyr)
library(doBy)
library(multcomp)
library(wzRfun)
library(EACS)
# Obtém o intervalo em que a muda morreu.
deathint <- function(data, timevar, respvar) {
o <- order(data[, timevar])
x <- data[o, timevar]
y <- data[o, respvar]
nna <- !is.na(y)
if (sum(nna)) {
i <- which(nna)
imax <- max(i)
st <- 3 # Censura intervalar.
int <- x[imax + 0:1]
} else {
st <- 2 # Censura a esquerda.
int <- rep(min(x), 2)
}
if (is.na(int[2])) {
int[2] <- int[1]
st <- 0 # Censura a direita.
}
r <- c(int, st)
names(r) <- c("left", "right", "status")
return(r)
}
Os gráficos abaixo exibem a curva de crescimento das mudas em altura e diâmetro à altura do colo para cada um dos genótipos (paineis) e cada dose de cálcio (cores das linhas). Verifica-se que existem mudas com interrupção das medidas o que é resultado da morte das mudas.
#-----------------------------------------------------------------------
# Análise gráfica exploratória para altura e diâmetro.
# Estrutura dos dados.
str(gen_teca)
## 'data.frame': 5800 obs. of 7 variables:
## $ gen : Factor w/ 29 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ dose: num 0 0.0184 0.0368 0.0736 0.1472 ...
## $ data: Date, format: "2016-06-15" ...
## $ dac : num 38.6 40.2 43 40 39.8 23.8 33.9 37 40 41.8 ...
## $ alt : num 101 61.7 130 128 128 126 132 121 129 140 ...
## $ mspa: num NA NA NA NA NA NA NA NA NA NA ...
## $ msr : num NA NA NA NA NA NA NA NA NA NA ...
# Nomes curtos são mais fáceis de manipular.
da <- gen_teca
# Supondo que a primeira medida foi no dia 2.
da$dias <- as.numeric(da$data - min(da$data) + 2)
xyplot(alt ~ dias | gen,
data = da,
groups = dose,
type = "l",
xlab = "Tempo após a primeira avaliação (dias)",
ylab = "Altura das mudas de teca (mm)",
as.table = TRUE,
scales = list(y = list(log = FALSE)))
xyplot(dac ~ dias | gen,
data = da,
groups = dose,
type = "l",
xlab = "Tempo após a primeira avaliação (dias)",
ylab = "Diâmetro à altura do colo das mudas de teca (mm)",
as.table = TRUE)
Para utilizar o fator métrico dose de cálcio nas análises (dose
), é recomendável que se utilize uma transformação na escala das doses de forma a obter um espaçamento mais equidistante entre níveis, o que evita problemas de alancagem para ajustes de modelos de regressão. Em vista disso, definiu-se como critério minimizar a variância entre as diferenças de doses consecutivas na escala unitária por meio de uma função potência das doses transformadas. Na escala unitária, a menor é 0 e a maior é 1. O valor obtido para transformar a dose foi de 0.3.
#-----------------------------------------------------------------------
# Trabalhando com a dose.
# Criando dose categórico.
x <- unique(sort(da$dose))
da$dos <- factor(da$dose,
levels = x,
labels = seq_along(x) - 1)
# Variância das distâncias entre níveis em escala unitária.
esp <- function(p) {
u <- x^p
u <- (u - min(u))
u <- u/max(u)
var(diff(u))
}
# Otimiza para obter o valor de potência para maior uniformidade.
op <- optimize(f = esp, interval = c(0, 1))
op$minimum
## [1] 0.3064936
da$dosep <- da$dose^0.3
O gráfico de segmentos a seguir exibe os intervalos de tempo em que as mudas morreram no experimento. A morte das mudas, até onde se sabe, pode não ter relação com os fatores estudados pois depende muito de fatores agronômicos que representam o estado inicial da muda. No entanto, embora o emperimento não tenha sido realizado para estudar fatores relacionados ao “pegamento” das mudas, pode-se verificar se existe influência dos fatores estudados na sobreviênvia das mudas.
#-----------------------------------------------------------------------
# Determinar o intervalo em que a muda morreu.
# Cria a variável unidade experimental.
da$ue <- with(da, interaction(gen, dos, drop = TRUE))
# Número de níveis dos fatores.
with(da, c(gen = nlevels(gen),
dos = nlevels(dos),
ue = nlevels(ue)))
## gen dos ue
## 29 10 290
summary(da)
## gen dose data
## 1 : 200 Min. :0.0000 Min. :2016-06-15
## 2 : 200 1st Qu.:0.0368 1st Qu.:2016-07-18
## 3 : 200 Median :0.2208 Median :2016-08-20
## 4 : 200 Mean :0.9402 Mean :2016-08-20
## 5 : 200 3rd Qu.:1.1776 3rd Qu.:2016-09-22
## 6 : 200 Max. :4.7104 Max. :2016-10-26
## (Other):4600
## dac alt mspa msr
## Min. : 23.30 Min. : 17.0 Min. : 2.96 Min. : 3.07
## 1st Qu.: 52.00 1st Qu.:106.0 1st Qu.:19.36 1st Qu.: 27.81
## Median : 62.00 Median :130.0 Median :36.83 Median : 40.01
## Mean : 67.92 Mean :141.5 Mean :35.76 Mean : 43.79
## 3rd Qu.: 79.03 3rd Qu.:157.0 3rd Qu.:48.67 3rd Qu.: 59.72
## Max. :149.70 Max. :528.0 Max. :93.43 Max. :133.07
## NA's :1728 NA's :1730 NA's :5643 NA's :5643
## dias dos dosep ue
## Min. : 2.00 0 : 580 Min. :0.0000 1.0 : 20
## 1st Qu.: 35.25 1 : 580 1st Qu.:0.3713 2.0 : 20
## Median : 68.50 2 : 580 Median :0.6279 3.0 : 20
## Mean : 68.50 3 : 580 Mean :0.7174 4.0 : 20
## 3rd Qu.:101.75 4 : 580 3rd Qu.:1.0503 5.0 : 20
## Max. :135.00 5 : 580 Max. :1.5919 6.0 : 20
## (Other):2320 (Other):5680
# Obtém os intervalos em que as mudas morrem.
db <- ddply(da,
~gen + dose + dos + dosep + ue,
deathint,
timevar = "dias",
respvar = "alt")
# Áreas abaixo da curva (usando semanas e cm como unidades).
dc <- ddply(da,
~gen + dose + dos + dosep + ue,
summarise,
aacalt = auc(dias/7, alt/10),
aacdac = auc(dias/7, dac/10))
# Junta os dois.
db <- merge(db, dc)
# str(db)
# Gráfico de segmentos que indica o intervalo em que a muda morreu.
segplot(dos ~ left + right | gen,
data = db,
as.table = TRUE,
xlab = "Tempo após a primeira avaliação",
ylab = "Dose (codificada)") # +
# layer(panel.text(x = x[subscripts],
# y = z[subscripts],
# labels = db$status[subscripts],
# pos = 2,
# cex = 0.6))
A análise dos dados de massa seca de parte aérea foi feita apenas considerando genótipos com 3 ou mais registros, que correspondem ao número de doses de cálcio que restaram ao final do experimento.
dc <- subset(da, data == max(data))
dc <- dc[complete.cases(dc), ]
# Tabela de frequência do número de observações por cela experimental.
addmargins(xtabs(~gen + dos, data = dc))
## dos
## gen 0 1 2 3 4 5 6 7 8 9 Sum
## 1 1 1 1 0 0 1 1 1 1 0 7
## 2 1 0 1 1 1 1 1 1 0 0 7
## 3 1 1 1 0 1 1 0 1 1 0 7
## 4 1 0 0 0 0 0 0 1 1 0 3
## 5 0 1 1 0 0 0 0 0 0 0 2
## 6 0 0 0 1 0 0 1 0 0 1 3
## 7 0 0 0 1 0 0 1 1 0 0 3
## 8 0 0 0 0 1 0 0 0 0 0 1
## 9 1 0 0 0 0 1 0 1 0 0 3
## 10 1 0 1 0 1 1 1 1 0 0 6
## 11 0 1 0 1 0 0 1 1 0 0 4
## 12 0 1 1 1 1 1 1 1 0 1 8
## 13 1 1 1 1 0 1 0 1 1 0 7
## 14 1 1 1 0 0 1 1 0 0 0 5
## 15 1 0 0 0 0 1 1 1 1 0 5
## 16 1 1 1 0 0 1 0 1 1 0 6
## 17 1 1 1 0 0 1 1 0 1 0 6
## 18 1 1 0 1 1 0 0 1 0 1 6
## 19 1 1 1 0 1 1 0 0 0 1 6
## 20 1 1 1 0 0 1 0 0 0 1 5
## 21 0 1 1 0 1 1 1 0 1 0 6
## 22 1 1 1 1 1 1 1 0 1 0 8
## 23 1 1 0 0 1 0 1 1 1 0 6
## 24 0 1 1 1 0 1 0 1 0 1 6
## 25 1 1 1 0 1 1 0 1 0 0 6
## 26 1 1 0 1 1 1 0 1 0 0 6
## 27 0 1 1 0 0 1 0 0 1 0 4
## 28 1 1 1 1 1 1 0 1 0 0 7
## 29 1 0 1 0 0 0 0 0 0 1 3
## Sum 20 20 19 11 13 20 13 18 11 7 152
# Manter apenas genótipos com 3 ou mais registros.
k <- which(xtabs(~gen, data = dc) >= 3)
# Filtra para os genótipos com 3 ou mais registros.
dc <- droplevels(subset(dc, gen %in% names(k)))
xy1 <- xyplot(mspa + msr ~ dosep | gen,
outer = FALSE,
data = dc,
ylab = "Massa seca (g)",
xlab = "Dose de Ca (escala quase equidistante)",
auto.key = TRUE,
type = "o")
xy2 <- xyplot(mspa + msr ~ dosep | gen,
outer = FALSE,
data = dc,
ylab = "Massa seca (g)",
xlab = "Dose de Ca (escala quase equidistante)",
auto.key = TRUE,
type = c("p", "r"))
# grid.arrange(xy1, xy2, nrow = 1)
xy2
Foi considerado um modelo fatorial duplo contendo os efeitos do fator genótipo (níveis categóricos), do fator dose de cálcio (níveis métricos, expresso na escala transformada) e a interação entre estes fatores. Para representar o efeito de cálcio, foram utilizados polinômio de segundo grau, sendo o grau do polinômio aumentado ou diminuido conforme necessidade de melhorar ou simplificar o ajuste.
# Modelo de efeitos quadráticos por genótipo.
m0 <- lm(mspa ~ gen * (dosep + I(dosep^2)), data = dc)
# Verificação dos pressupostos.
par(mfrow = c(2, 2))
plot(m0); layout(1)
# Quadro de análise de variância.
anova(m0)
## Analysis of Variance Table
##
## Response: mspa
## Df Sum Sq Mean Sq F value Pr(>F)
## gen 26 22105.4 850.21 2.8684 0.000272 ***
## dosep 1 1477.5 1477.53 4.9848 0.028866 *
## I(dosep^2) 1 27.4 27.37 0.0923 0.762168
## gen:dosep 26 10089.5 388.06 1.3092 0.187858
## gen:I(dosep^2) 26 4301.5 165.44 0.5582 0.950194
## Residuals 68 20155.5 296.41
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Reduzindo o modelo com a remoção dos termos quadráticos.
m0 <- update(m0, . ~ gen * dosep)
# par(mfrow = c(2, 2))
# plot(m0); layout(1)
# Quadro de análise de variância.
anova(m0)
## Analysis of Variance Table
##
## Response: mspa
## Df Sum Sq Mean Sq F value Pr(>F)
## gen 26 22105.4 850.21 3.2839 1.278e-05 ***
## dosep 1 1477.5 1477.53 5.7069 0.01887 *
## gen:dosep 26 9978.3 383.78 1.4823 0.08749 .
## Residuals 95 24595.6 258.90
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Variance Table
##
## Response: mspa
## Df Sum Sq Mean Sq F value Pr(>F)
## gen 26 22105 850.21 2.9755 3.03e-05 ***
## dosep 1 1478 1477.53 5.1710 0.02473 *
## Residuals 121 34574 285.73
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Estimativas dos parâmetros.
summary(m0)
##
## Call:
## lm(formula = mspa ~ gen + dosep, data = dc)
##
## Residuals:
## Min 1Q Median 3Q Max
## -37.957 -12.348 0.087 9.066 48.438
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 30.26998 6.75309 4.482 1.69e-05 ***
## gen2 -0.03656 9.03960 -0.004 0.99678
## gen3 25.61210 9.03647 2.834 0.00538 **
## gen4 -9.04181 11.67273 -0.775 0.44008
## gen6 -7.09007 11.71266 -0.605 0.54609
## gen7 3.04863 11.67346 0.261 0.79441
## gen9 19.94146 11.66706 1.709 0.08998 .
## gen10 3.59749 9.40674 0.382 0.70281
## gen11 22.09697 10.59505 2.086 0.03912 *
## gen12 23.75822 8.75296 2.714 0.00761 **
## gen13 28.39832 9.03739 3.142 0.00211 **
## gen14 -7.59291 9.92236 -0.765 0.44562
## gen15 15.22280 9.90683 1.537 0.12700
## gen16 23.38485 9.40502 2.486 0.01427 *
## gen17 18.50569 9.40698 1.967 0.05145 .
## gen18 7.21872 9.40439 0.768 0.44423
## gen19 7.13165 9.40687 0.758 0.44985
## gen20 3.45686 9.89985 0.349 0.72756
## gen21 -9.50005 9.40479 -1.010 0.31445
## gen22 21.23611 8.75317 2.426 0.01674 *
## gen23 -11.64449 9.40472 -1.238 0.21806
## gen24 15.27988 9.40946 1.624 0.10700
## gen25 20.01100 9.41877 2.125 0.03566 *
## gen26 12.43185 9.41623 1.320 0.18924
## gen27 -5.59920 10.59503 -0.528 0.59814
## gen28 8.36645 9.05152 0.924 0.35716
## gen29 9.62461 11.66465 0.825 0.41093
## dosep -7.63221 3.35632 -2.274 0.02473 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.9 on 121 degrees of freedom
## Multiple R-squared: 0.4055, Adjusted R-squared: 0.2729
## F-statistic: 3.057 on 27 and 121 DF, p-value: 1.542e-05
Não houve interação entre genótipo e dose de cálcio. Em função disso, o modelo obtido para a predição contém apenas os efeitos aditivos dos fatores. Foi necessário apenas o polinômio de grau um para representar o efeito de cálcio. Os resultados serão representados com as retas ajustadas para cada genótipo.
# Cria um conjunto de valores para predição.
pred <- with(dc,
expand.grid(# dosep = eseq(dose, f = 0)^0.3)
dosep = eseq(dosep, f = 0),
gen = levels(gen)))
ic <- predict(m0, newdata = pred, interval = "confidence")
pred <- cbind(pred, as.data.frame(ic))
xyplot(mspa ~ dosep | gen,
data = dc,
# type = c("p", "r"),
xlab = "Dose de cálcio (escala transformada)",
ylab = "Massa seca de parte áerea (g)") +
as.layer(xyplot(fit ~ dosep | gen,
data = pred,
type = "l",
ly = pred$lwr,
uy = pred$upr,
cty = "bands",
prepanel = prepanel.cbH,
panel = panel.cbH))
# Médias ajustadas, considerando um valor fixo de cálcio.
lsm <- LSmeans(m0, effect = "gen")
lsm
## Coefficients:
## estimate se df t.stat p.value
## [1,] 25.4849 6.3895 121.0000 3.9885 0.0001
## [2,] 25.4483 6.3919 121.0000 3.9814 0.0001
## [3,] 51.0970 6.3892 121.0000 7.9974 0.0000
## [4,] 16.4431 9.7730 121.0000 1.6825 0.0951
## [5,] 18.3948 9.8260 121.0000 1.8721 0.0636
## [6,] 28.5335 9.7741 121.0000 2.9193 0.0042
## [7,] 45.4264 9.7606 121.0000 4.6541 0.0000
## [8,] 29.0824 6.9021 121.0000 4.2135 0.0000
## [9,] 47.5819 8.4528 121.0000 5.6291 0.0000
## [10,] 49.2431 5.9874 121.0000 8.2245 0.0000
## [11,] 53.8832 6.3899 121.0000 8.4326 0.0000
## [12,] 17.8920 7.5845 121.0000 2.3590 0.0199
## [13,] 40.7077 7.5765 121.0000 5.3729 0.0000
## [14,] 48.8698 6.9010 121.0000 7.0816 0.0000
## [15,] 43.9906 6.9023 121.0000 6.3733 0.0000
## [16,] 32.7036 6.9018 121.0000 4.7384 0.0000
## [17,] 32.6166 6.9022 121.0000 4.7255 0.0000
## [18,] 28.9418 7.5605 121.0000 3.8280 0.0002
## [19,] 15.9849 6.9031 121.0000 2.3156 0.0223
## [20,] 46.7210 5.9798 121.0000 7.8131 0.0000
## [21,] 13.8404 6.9029 121.0000 2.0050 0.0472
## [22,] 40.7648 6.9121 121.0000 5.8976 0.0000
## [23,] 45.4959 6.9148 121.0000 6.5795 0.0000
## [24,] 37.9167 6.9119 121.0000 5.4857 0.0000
## [25,] 19.8857 8.4528 121.0000 2.3526 0.0203
## [26,] 33.8513 6.4053 121.0000 5.2849 0.0000
## [27,] 35.1095 9.7598 121.0000 3.5974 0.0005
# Dose usada para obter as médias (é a média de cálcio dos dados
# observados).
d <- lsm$grid$dosep[1]^(1/0.3)
d
## [1] 0.210926
# Atribui nomes às linhas da matriz.
L <- lsm$L
rownames(L) <- levels(dc$gen)
# Obtém os contrastes dois a dois.
grid <- apmc(X = L,
model = m0,
focus = "gen",
test = "fdr",
cld2 = FALSE)
grid <- grid[order(grid$fit, decreasing = TRUE), ]
ocld <- ordered_cld(grid$cld, grid$fit)
grid$cld <- ocld
# x <- attr(ocld, "ind") * 1
# print.table(local({x[x == 0] <- NA; x}))
# Gráfico de segmentos com as letras resumo das comparações múltiplas.
segplot(reorder(gen, fit) ~ lwr + upr,
centers = fit,
data = grid,
draw = FALSE,
xlab = "Massa seca de parte áerea (g)",
ylab = "Genótipos (ordenados pela média)",
# par.settings = list(layout.widths = list(right.padding = 10)),
sub = list(
sprintf("Estimativas correspondentes à %0.2f de Ca", d),
font = 3, cex = 0.8),
txt = sprintf("%0.1f %s", grid$fit, grid$cld)) +
layer({
x <- unit(centers, "native") - unit(0.005, "snpc")
y <- unit(z, "native")
grid.rect(x = x, y = y,
width = Reduce(unit.c,
lapply(txt,
FUN = unit,
x = 1.05,
units = "strwidth")) +
unit(0.005, "snpc"),
height = unit(1, "lines"),
just = "right",
gp = gpar(fill = "white",
col = NA,
fontsize = 12))
grid.text(label = txt,
just = "right",
x = x - unit(0.005, "snpc"),
y = y)
})
# x <- attr(ocld, "ind")
# index <- which(x[nrow(x):1, ], arr.ind = TRUE)
# trellis.focus("panel", column = 1, row = 1, clip.off = TRUE)
# xcor <- 1.03 + (index[, 2] - 1)/50
# grid.segments(x0 = unit(xcor, "npc"),
# x1 = unit(xcor, "npc"),
# y0 = unit(index[, 1] + 0.5, units = "native"),
# y1 = unit(index[, 1] - 0.5, units = "native"),
# gp = gpar(lwd = 2, col = "red"))
# trellis.unfocus()
# Modelo de efeitos quadráticos por genótipo.
m0 <- lm(msr ~ gen * (dosep + I(dosep^2)), data = dc)
# Verificação dos pressupostos.
par(mfrow = c(2, 2))
plot(m0); layout(1)
# Quadro de análise de variância.
anova(m0)
## Analysis of Variance Table
##
## Response: msr
## Df Sum Sq Mean Sq F value Pr(>F)
## gen 26 23001 884.6 1.7046 0.041564 *
## dosep 1 3884 3884.1 7.4840 0.007933 **
## I(dosep^2) 1 377 376.8 0.7260 0.397171
## gen:dosep 26 6946 267.2 0.5148 0.969154
## gen:I(dosep^2) 26 12463 479.3 0.9236 0.576167
## Residuals 68 35291 519.0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Reduzindo o modelo com a remoção dos termos quadráticos.
m0 <- update(m0, . ~ gen * dosep)
# par(mfrow = c(2, 2))
# plot(m0); layout(1)
# Quadro de análise de variância.
anova(m0)
## Analysis of Variance Table
##
## Response: msr
## Df Sum Sq Mean Sq F value Pr(>F)
## gen 26 23001 884.6 1.7598 0.02569 *
## dosep 1 3884 3884.1 7.7265 0.00656 **
## gen:dosep 26 7320 281.5 0.5601 0.95354
## Residuals 95 47757 502.7
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Variance Table
##
## Response: msr
## Df Sum Sq Mean Sq F value Pr(>F)
## gen 26 23001 884.6 1.9435 0.008623 **
## dosep 1 3884 3884.1 8.5331 0.004162 **
## Residuals 121 55077 455.2
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Estimativas dos parâmetros.
summary(m0)
##
## Call:
## lm(formula = msr ~ gen + dosep, data = dc)
##
## Residuals:
## Min 1Q Median 3Q Max
## -37.807 -11.047 -1.707 9.904 82.182
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 53.0222 8.5234 6.221 7.34e-09 ***
## gen2 -17.9073 11.4093 -1.570 0.11914
## gen3 4.1755 11.4054 0.366 0.71493
## gen4 -18.2065 14.7327 -1.236 0.21893
## gen6 -11.4613 14.7831 -0.775 0.43968
## gen7 4.5578 14.7336 0.309 0.75759
## gen9 3.8148 14.7256 0.259 0.79603
## gen10 -7.8243 11.8727 -0.659 0.51114
## gen11 -12.0316 13.3725 -0.900 0.37005
## gen12 1.9572 11.0475 0.177 0.85967
## gen13 -4.2971 11.4065 -0.377 0.70704
## gen14 15.6134 12.5235 1.247 0.21490
## gen15 10.2654 12.5039 0.821 0.41327
## gen16 6.8593 11.8705 0.578 0.56444
## gen17 7.5859 11.8730 0.639 0.52408
## gen18 -7.5323 11.8697 -0.635 0.52690
## gen19 5.0121 11.8729 0.422 0.67367
## gen20 6.3360 12.4951 0.507 0.61302
## gen21 -12.1416 11.8702 -1.023 0.30841
## gen22 17.4641 11.0478 1.581 0.11654
## gen23 -32.8454 11.8702 -2.767 0.00655 **
## gen24 8.9385 11.8761 0.753 0.45312
## gen25 8.9716 11.8879 0.755 0.45190
## gen26 0.5503 11.8847 0.046 0.96314
## gen27 -22.2116 13.3725 -1.661 0.09930 .
## gen28 -14.7165 11.4244 -1.288 0.20015
## gen29 -6.1375 14.7225 -0.417 0.67751
## dosep -12.3745 4.2362 -2.921 0.00416 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 21.33 on 121 degrees of freedom
## Multiple R-squared: 0.328, Adjusted R-squared: 0.1781
## F-statistic: 2.188 on 27 and 121 DF, p-value: 0.002119
Não houve interação entre genótipo e dose de cálcio. Em função disso, o modelo obtido para a predição contém apenas os efeitos aditivos dos fatores. Foi necessário apenas o polinômio de grau um para representar o efeito de cálcio. Os resultados serão representados com as retas ajustadas para cada genótipo.
# Cria um conjunto de valores para predição.
pred <- with(dc,
expand.grid(# dosep = eseq(dose, f = 0)^0.3)
dosep = eseq(dosep, f = 0),
gen = levels(gen)))
ic <- predict(m0, newdata = pred, interval = "confidence")
pred <- cbind(pred, as.data.frame(ic))
xyplot(mspa ~ dosep | gen,
data = dc,
# type = c("p", "r"),
xlab = "Dose de cálcio (escala transformada)",
ylab = "Massa seca de raízes (g)") +
as.layer(xyplot(fit ~ dosep | gen,
data = pred,
type = "l",
ly = pred$lwr,
uy = pred$upr,
cty = "bands",
prepanel = prepanel.cbH,
panel = panel.cbH))
# Médias ajustadas, considerando um valor fixo de cálcio.
lsm <- LSmeans(m0, effect = "gen")
lsm
## Coefficients:
## estimate se df t.stat p.value
## [1,] 45.2639 8.0645 121.0000 5.6127 0.0000
## [2,] 27.3566 8.0675 121.0000 3.3910 0.0009
## [3,] 49.4393 8.0642 121.0000 6.1307 0.0000
## [4,] 27.0574 12.3350 121.0000 2.1935 0.0302
## [5,] 33.8026 12.4019 121.0000 2.7256 0.0074
## [6,] 49.8217 12.3364 121.0000 4.0386 0.0001
## [7,] 49.0787 12.3193 121.0000 3.9839 0.0001
## [8,] 37.4395 8.7115 121.0000 4.2977 0.0000
## [9,] 33.2323 10.6687 121.0000 3.1149 0.0023
## [10,] 47.2211 7.5570 121.0000 6.2487 0.0000
## [11,] 40.9668 8.0650 121.0000 5.0796 0.0000
## [12,] 60.8773 9.5728 121.0000 6.3594 0.0000
## [13,] 55.5293 9.5627 121.0000 5.8069 0.0000
## [14,] 52.1232 8.7100 121.0000 5.9843 0.0000
## [15,] 52.8498 8.7118 121.0000 6.0665 0.0000
## [16,] 37.7316 8.7111 121.0000 4.3314 0.0000
## [17,] 50.2759 8.7116 121.0000 5.7711 0.0000
## [18,] 51.5999 9.5425 121.0000 5.4074 0.0000
## [19,] 33.1223 8.7128 121.0000 3.8016 0.0002
## [20,] 62.7280 7.5474 121.0000 8.3112 0.0000
## [21,] 12.4184 8.7125 121.0000 1.4254 0.1566
## [22,] 54.2024 8.7241 121.0000 6.2129 0.0000
## [23,] 54.2355 8.7275 121.0000 6.2143 0.0000
## [24,] 45.8142 8.7239 121.0000 5.2516 0.0000
## [25,] 23.0523 10.6687 121.0000 2.1607 0.0327
## [26,] 30.5474 8.0844 121.0000 3.7785 0.0002
## [27,] 39.1264 12.3183 121.0000 3.1763 0.0019
# Dose usada para obter as médias (é a média de cálcio dos dados
# observados).
d <- lsm$grid$dosep[1]^(1/0.3)
d
## [1] 0.210926
# Atribui nomes às linhas da matriz.
L <- lsm$L
rownames(L) <- levels(dc$gen)
# Obtém os contrastes dois a dois.
grid <- apmc(X = L,
model = m0,
focus = "gen",
test = "fdr",
cld2 = FALSE)
grid <- grid[order(grid$fit, decreasing = TRUE), ]
ocld <- ordered_cld(grid$cld, grid$fit)
grid$cld <- ocld
# Gráfico de segmentos com as letras resumo das comparações múltiplas.
segplot(reorder(gen, fit) ~ lwr + upr,
centers = fit,
data = grid,
draw = FALSE,
xlab = "Massa seca de raízes (g)",
ylab = "Genótipos (ordenados pela média)",
sub = list(
sprintf("Estimativas correspondentes à %0.2f de Ca", d),
font = 3, cex = 0.8),
txt = sprintf("%0.1f %s", grid$fit, grid$cld)) +
layer({
x <- unit(centers, "native") - unit(0.005, "snpc")
y <- unit(z, "native")
grid.rect(x = x, y = y,
width = Reduce(unit.c,
lapply(txt,
FUN = unit,
x = 1.05,
units = "strwidth")) +
unit(0.005, "snpc"),
height = unit(1, "lines"),
just = "right",
gp = gpar(fill = "white",
col = NA,
fontsize = 12))
grid.text(label = txt,
just = "right",
x = x - unit(0.005, "snpc"),
y = y)
})
# Cria variável que a porcentagem de massa seca de raízes em relação a
# massa seca total da muda.
dc$r <- with(dc, 100 * msr/(msr + mspa))
# Modelo de efeitos quadráticos por genótipo.
m0 <- lm(r ~ gen * (dosep + I(dosep^2)), data = dc)
# Verificação dos pressupostos.
par(mfrow = c(2, 2))
plot(m0); layout(1)
# Quadro de análise de variância.
anova(m0)
## Analysis of Variance Table
##
## Response: r
## Df Sum Sq Mean Sq F value Pr(>F)
## gen 26 10846.5 417.17 2.3854 0.00225 **
## dosep 1 7.2 7.18 0.0410 0.84007
## I(dosep^2) 1 325.8 325.76 1.8627 0.17682
## gen:dosep 26 5523.2 212.43 1.2147 0.25788
## gen:I(dosep^2) 26 4777.1 183.73 1.0506 0.42085
## Residuals 68 11892.4 174.89
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Analysis of Variance Table
##
## Response: r
## Df Sum Sq Mean Sq F value Pr(>F)
## gen 26 10846 417.17 2.2594 0.001592 **
## Residuals 122 22526 184.64
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Estimativas dos parâmetros.
summary(m0)
##
## Call:
## lm(formula = r ~ gen, data = dc)
##
## Residuals:
## Min 1Q Median 3Q Max
## -44.368 -6.919 0.295 9.255 28.680
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 63.62133 5.13582 12.388 < 2e-16 ***
## gen2 -11.83644 7.26315 -1.630 0.10575
## gen3 -15.17842 7.26315 -2.090 0.03871 *
## gen4 4.27467 9.37668 0.456 0.64928
## gen6 0.48032 9.37668 0.051 0.95923
## gen7 -7.83977 9.37668 -0.836 0.40474
## gen9 -10.97340 9.37668 -1.170 0.24417
## gen10 1.58445 7.55972 0.210 0.83434
## gen11 -20.34053 8.51679 -2.388 0.01846 *
## gen12 -16.13130 7.03251 -2.294 0.02351 *
## gen13 -23.41823 7.26315 -3.224 0.00162 **
## gen14 13.19129 7.95638 1.658 0.09990 .
## gen15 -9.46325 7.95638 -1.189 0.23660
## gen16 -13.08349 7.55972 -1.731 0.08604 .
## gen17 -8.13620 7.55972 -1.076 0.28394
## gen18 -13.76289 7.55972 -1.821 0.07113 .
## gen19 0.08582 7.55972 0.011 0.99096
## gen20 0.62266 7.95638 0.078 0.93775
## gen21 6.83064 7.55972 0.904 0.36801
## gen22 -3.54485 7.03251 -0.504 0.61512
## gen23 -17.66014 7.55972 -2.336 0.02112 *
## gen24 -6.71211 7.55972 -0.888 0.37635
## gen25 -7.21256 7.55972 -0.954 0.34193
## gen26 -8.66591 7.55972 -1.146 0.25390
## gen27 -2.26186 8.51679 -0.266 0.79101
## gen28 -14.78767 7.26315 -2.036 0.04392 *
## gen29 -10.05089 9.37668 -1.072 0.28588
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 13.59 on 122 degrees of freedom
## Multiple R-squared: 0.325, Adjusted R-squared: 0.1812
## F-statistic: 2.259 on 26 and 122 DF, p-value: 0.001592
# Médias ajustadas, considerando um valor fixo de cálcio.
lsm <- LSmeans(m0, effect = "gen")
lsm
## Coefficients:
## estimate se df t.stat p.value
## [1,] 63.6213 5.1358 122.0000 12.3878 0
## [2,] 51.7849 5.1358 122.0000 10.0831 0
## [3,] 48.4429 5.1358 122.0000 9.4324 0
## [4,] 67.8960 7.8451 122.0000 8.6546 0
## [5,] 64.1016 7.8451 122.0000 8.1709 0
## [6,] 55.7816 7.8451 122.0000 7.1104 0
## [7,] 52.6479 7.8451 122.0000 6.7109 0
## [8,] 65.2058 5.5473 122.0000 11.7545 0
## [9,] 43.2808 6.7941 122.0000 6.3704 0
## [10,] 47.4900 4.8041 122.0000 9.8853 0
## [11,] 40.2031 5.1358 122.0000 7.8280 0
## [12,] 76.8126 6.0768 122.0000 12.6403 0
## [13,] 54.1581 6.0768 122.0000 8.9123 0
## [14,] 50.5378 5.5473 122.0000 9.1103 0
## [15,] 55.4851 5.5473 122.0000 10.0021 0
## [16,] 49.8584 5.5473 122.0000 8.9878 0
## [17,] 63.7071 5.5473 122.0000 11.4843 0
## [18,] 64.2440 6.0768 122.0000 10.5720 0
## [19,] 70.4520 5.5473 122.0000 12.7002 0
## [20,] 60.0765 4.8041 122.0000 12.5052 0
## [21,] 45.9612 5.5473 122.0000 8.2853 0
## [22,] 56.9092 5.5473 122.0000 10.2589 0
## [23,] 56.4088 5.5473 122.0000 10.1687 0
## [24,] 54.9554 5.5473 122.0000 9.9067 0
## [25,] 61.3595 6.7941 122.0000 9.0314 0
## [26,] 48.8337 5.1358 122.0000 9.5084 0
## [27,] 53.5704 7.8451 122.0000 6.8285 0
# Atribui nomes às linhas da matriz.
L <- lsm$L
rownames(L) <- levels(dc$gen)
# Obtém os contrastes dois a dois.
grid <- apmc(X = L,
model = m0,
focus = "gen",
test = "fdr",
cld2 = FALSE)
grid <- grid[order(grid$fit, decreasing = TRUE), ]
ocld <- ordered_cld(grid$cld, grid$fit)
grid$cld <- ocld
# Gráfico de segmentos com as letras resumo das comparações múltiplas.
segplot(reorder(gen, fit) ~ lwr + upr,
centers = fit,
data = grid,
draw = FALSE,
xlab = "Percentual de massa de raízes",
ylab = "Genótipos (ordenados pela média)",
txt = sprintf("%0.1f %s", grid$fit, grid$cld)) +
layer({
x <- unit(centers, "native") - unit(0.005, "snpc")
y <- unit(z, "native")
grid.rect(x = x, y = y,
width = Reduce(unit.c,
lapply(txt,
FUN = unit,
x = 1.05,
units = "strwidth")) +
unit(0.005, "snpc"),
height = unit(1, "lines"),
just = "right",
gp = gpar(fill = "white",
col = NA,
fontsize = 12))
grid.text(label = txt,
just = "right",
x = x - unit(0.005, "snpc"),
y = y)
})
# Utilizar como variável concomitante a última data em foi medida em uma
# ancova.
str(da)
## 'data.frame': 5800 obs. of 11 variables:
## $ gen : Factor w/ 29 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ dose : num 0 0.0184 0.0368 0.0736 0.1472 ...
## $ data : Date, format: "2016-06-15" ...
## $ dac : num 38.6 40.2 43 40 39.8 23.8 33.9 37 40 41.8 ...
## $ alt : num 101 61.7 130 128 128 126 132 121 129 140 ...
## $ mspa : num NA NA NA NA NA NA NA NA NA NA ...
## $ msr : num NA NA NA NA NA NA NA NA NA NA ...
## $ dias : num 2 2 2 2 2 2 2 2 2 2 ...
## $ dos : Factor w/ 10 levels "0","1","2","3",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ dosep: num 0 0.302 0.371 0.457 0.563 ...
## $ ue : Factor w/ 290 levels "1.0","2.0","3.0",..: 1 30 59 88 117 146 175 204 233 262 ...
# Função que extraí o registro completo mais velho de uma unidade
# experimental (última observação completa registrada).
last <- function(data, time, resp) {
tm <- data[, time]
data <- data[order(tm), ]
i <- max(which(!is.na(data[, resp])))
data[i, ]
}
# Reduz para uma tabela com uma linha por UE.
dc <- ddply(da,
~ue,
last, time = "data", resp = "alt")
str(dc)
## 'data.frame': 290 obs. of 11 variables:
## $ gen : Factor w/ 29 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ dose : num 0 0 0 0 0 0 0 0 0 0 ...
## $ data : Date, format: "2016-10-26" ...
## $ dac : num 88 76.1 105.9 51.6 109.2 ...
## $ alt : num 325 182 244 112 400 179 334 60 468 380 ...
## $ mspa : num 42.59 44.47 39.64 4.22 NA ...
## $ msr : num 47.9 53.5 49 11.4 78.2 ...
## $ dias : num 135 135 135 135 135 58 128 30 135 135 ...
## $ dos : Factor w/ 10 levels "0","1","2","3",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ dosep: num 0 0 0 0 0 0 0 0 0 0 ...
## $ ue : Factor w/ 290 levels "1.0","2.0","3.0",..: 1 2 3 4 5 6 7 8 9 10 ...
xyplot(alt + dac ~ dias,
outer = TRUE,
data = da,
xlab = "Tempo após a primeira avaliação (dias)",
ylab = "Altura das mudas de teca (mm)",
col = "gray",
type = c("p", "smooth")) +
as.layer(xyplot(alt + dac ~ I(dias + 1),
data = dc,
outer = TRUE,
col = "blue",
pch = 19,
type = c("p", "smooth")))
Para análise das variáveis altura e diâmetro à altura do colo será considerado análise de covariância. A covariável usada para corrigir os valores observados das respostas será o número de dias no último registro das variáveis. Dessa forma, todas as observações serão aproveitadas na análise, mesmo as que morreram antes do final do experimento.
Verfica-se que uma relação não linear entre a altura (diâmetro) em função do dia em que é medida. Cada ponto em azul no gráfico representa o último valor registrado das variáveis para uma unidade experimental, ou seja, é o valor das variáveis mais próximo do final do experimento, imediatamente antes da muda morrer. Dada a relação quadrática exibida, o efeito do tempo será considerado no modelo com um termo polinomial de grau 2.
# Modelo de efeitos quadráticos por genótipo.
m0 <- lm(alt ~ dias + I(dias^2) + gen * (dosep + I(dosep^2)),
data = dc)
# # Verificação dos pressupostos.
# par(mfrow = c(2, 2))
# plot(m0); layout(1)
# MASS::boxcox(m0)
# Quadro de análise de variância.
anova(m0)
## Analysis of Variance Table
##
## Response: alt
## Df Sum Sq Mean Sq F value Pr(>F)
## dias 1 1346945 1346945 310.0027 < 2.2e-16 ***
## I(dias^2) 1 26272 26272 6.0466 0.0147833 *
## gen 28 301451 10766 2.4778 0.0001522 ***
## dosep 1 107996 107996 24.8555 1.336e-06 ***
## I(dosep^2) 1 10278 10278 2.3656 0.1256161
## gen:dosep 28 114378 4085 0.9402 0.5564251
## gen:I(dosep^2) 28 73378 2621 0.6031 0.9435461
## Residuals 200 868989 4345
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Reduzindo o modelo com o abandono do termo quadrático e interação.
m0 <- update(m0, . ~ dias + I(dias^2) + gen + dosep)
anova(m0)
## Analysis of Variance Table
##
## Response: alt
## Df Sum Sq Mean Sq F value Pr(>F)
## dias 1 1346945 1346945 324.4210 < 2.2e-16 ***
## I(dias^2) 1 26272 26272 6.3278 0.0125 *
## gen 28 301451 10766 2.5931 4.704e-05 ***
## dosep 1 107996 107996 26.0116 6.595e-07 ***
## Residuals 257 1067024 4152
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Estimativas dos parâmetros.
summary(m0)
##
## Call:
## lm(formula = alt ~ dias + I(dias^2) + gen + dosep, data = dc)
##
## Residuals:
## Min 1Q Median 3Q Max
## -152.79 -37.90 -4.71 29.92 214.71
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 145.160655 31.157756 4.659 5.11e-06 ***
## dias -1.026481 0.839520 -1.223 0.22256
## I(dias^2) 0.013895 0.005057 2.747 0.00643 **
## gen2 -24.743539 28.834653 -0.858 0.39163
## gen3 20.672477 28.844344 0.717 0.47422
## gen4 4.959274 29.131254 0.170 0.86496
## gen5 9.890866 29.010954 0.341 0.73343
## gen6 28.156789 29.152219 0.966 0.33503
## gen7 22.478053 29.034382 0.774 0.43953
## gen8 0.041108 30.097746 0.001 0.99891
## gen9 64.167965 28.941270 2.217 0.02749 *
## gen10 12.765646 28.880980 0.442 0.65885
## gen11 14.896021 28.942090 0.515 0.60722
## gen12 27.494495 28.817248 0.954 0.34093
## gen13 75.100000 28.816118 2.606 0.00969 **
## gen14 77.156956 28.959852 2.664 0.00820 **
## gen15 63.562499 28.829519 2.205 0.02836 *
## gen16 44.974263 28.870276 1.558 0.12051
## gen17 19.892636 28.833911 0.690 0.49088
## gen18 21.056149 29.017472 0.726 0.46872
## gen19 40.135602 28.863130 1.391 0.16557
## gen20 32.522052 28.920526 1.125 0.26184
## gen21 14.874796 28.867703 0.515 0.60680
## gen22 34.150331 28.837773 1.184 0.23742
## gen23 -61.810695 29.056100 -2.127 0.03435 *
## gen24 10.487665 28.838070 0.364 0.71640
## gen25 79.385805 28.866006 2.750 0.00638 **
## gen26 83.053311 28.971415 2.867 0.00449 **
## gen27 14.482783 29.224624 0.496 0.62062
## gen28 -9.496780 28.944889 -0.328 0.74310
## gen29 -12.135498 29.147721 -0.416 0.67751
## dosep -42.705333 8.373344 -5.100 6.59e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 64.43 on 257 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.6256, Adjusted R-squared: 0.5804
## F-statistic: 13.85 on 31 and 257 DF, p-value: < 2.2e-16
Pelo quadro de ANOVA não existe interação entre genótipo e dose de cálcio. Verifica-se a existência apenas dos efeitos aditivos. No gráfico a seguir é representada a relação entre altura final e dose de cálcio para cada genótipo. Segundo o gráfico e também a estimativa do coeficiente do efeito de Ca, a altura do genótipo diminui com o aumento da dose de cálcio.
# Último dia de medição das mudas.
dmax <- max(dc$dias, na.rm = TRUE)
# Cria um conjunto de valores para predição.
pred <- with(dc,
expand.grid(
dosep = eseq(dosep, f = 0),
dias = dmax,
gen = levels(gen)))
ic <- predict(m0, newdata = pred, interval = "confidence")
pred <- cbind(pred, as.data.frame(ic))
xyplot(alt ~ dosep | gen,
data = subset(dc, dias == max(dias, na.rm = TRUE)),
# type = c("p", "r"),
xlab = "Dose de cálcio (escala transformada)",
ylab = "Altura das mudas (mm)") +
as.layer(xyplot(fit ~ dosep | gen,
data = pred,
type = "l",
ly = pred$lwr,
uy = pred$upr,
cty = "bands",
prepanel = prepanel.cbH,
panel = panel.cbH))
As médias de altura dos genótipos serão comparadas considerando a altura final, ou seja, aquela prevista para os 135 dias.
# Médias ajustadas, considerando um valor fixo de cálcio para o último
# dia de medição.
lsm <- LSmeans(m0,
effect = "gen",
at = list("dias" = dmax, "I(dias^2)" = dmax^2))
lsm
## Coefficients:
## estimate se df t.stat p.value
## [1,] 229.1299 20.4503 257.0000 11.2042 0
## [2,] 204.3863 20.5556 257.0000 9.9431 0
## [3,] 249.8023 20.4643 257.0000 12.2067 0
## [4,] 234.0891 21.2262 257.0000 11.0283 0
## [5,] 239.0207 20.9792 257.0000 11.3932 0
## [6,] 257.2867 21.2449 257.0000 12.1105 0
## [7,] 251.6079 21.0358 257.0000 11.9609 0
## [8,] 229.1710 22.6282 257.0000 10.1277 0
## [9,] 293.2978 20.8198 257.0000 14.0874 0
## [10,] 241.8955 20.5791 257.0000 11.7544 0
## [11,] 244.0259 20.8308 257.0000 11.7146 0
## [12,] 256.6244 20.4468 257.0000 12.5509 0
## [13,] 304.2299 20.4503 257.0000 14.8765 0
## [14,] 306.2868 20.8355 257.0000 14.7002 0
## [15,] 292.6924 20.5378 257.0000 14.2514 0
## [16,] 274.1041 20.6738 257.0000 13.2585 0
## [17,] 249.0225 20.5545 257.0000 12.1152 0
## [18,] 250.1860 20.9100 257.0000 11.9649 0
## [19,] 269.2655 20.6535 257.0000 13.0373 0
## [20,] 261.6519 20.7617 257.0000 12.6026 0
## [21,] 244.0047 20.6546 257.0000 11.8136 0
## [22,] 263.2802 20.4601 257.0000 12.8680 0
## [23,] 167.3192 20.9688 257.0000 7.9795 0
## [24,] 239.6175 20.5395 257.0000 11.6662 0
## [25,] 308.5157 20.6625 257.0000 14.9312 0
## [26,] 312.1832 20.7635 257.0000 15.0352 0
## [27,] 243.6126 21.1519 257.0000 11.5173 0
## [28,] 219.6331 20.6240 257.0000 10.6494 0
## [29,] 216.9944 21.2194 257.0000 10.2262 0
# Dose usada para obter as médias (é a média de cálcio dos dados
# observados).
d <- lsm$grid$dosep[1]^(1/0.3)
d
## [1] 0.3327573
# Atribui nomes às linhas da matriz.
L <- lsm$L
rownames(L) <- levels(dc$gen)
# Obtém os contrastes dois a dois.
grid <- apmc(X = L,
model = m0,
focus = "gen",
test = "fdr",
cld2 = FALSE)
grid <- grid[order(grid$fit, decreasing = TRUE), ]
ocld <- ordered_cld(grid$cld, grid$fit)
grid$cld <- ocld
# Gráfico de segmentos com as letras resumo das comparações múltiplas.
segplot(reorder(gen, fit) ~ lwr + upr,
centers = fit,
data = grid,
draw = FALSE,
xlab = sprintf("Altura das mudas aos %d dias (mm)", dmax),
ylab = "Genótipos (ordenados pela média)",
sub = list(
sprintf("Estimativas correspondentes à %0.2f de Ca", d),
font = 3, cex = 0.8),
txt = sprintf("%0.1f %s", grid$fit, grid$cld)) +
layer({
x <- unit(centers, "native") - unit(0.005, "snpc")
y <- unit(z, "native")
grid.rect(x = x, y = y,
width = Reduce(unit.c,
lapply(txt,
FUN = unit,
x = 1.05,
units = "strwidth")) +
unit(0.005, "snpc"),
height = unit(1, "lines"),
just = "right",
gp = gpar(fill = "white",
col = NA,
fontsize = 12))
grid.text(label = txt,
just = "right",
x = x - unit(0.005, "snpc"),
y = y)
})
A análise para diâmetro à altura do colo segue o mesmo roteiro da análise para altura das mudas.
# Modelo de efeitos quadráticos por genótipo.
m0 <- lm(dac ~ dias + I(dias^2) + gen * (dosep + I(dosep^2)),
data = dc)
# # Verificação dos pressupostos.
# par(mfrow = c(2, 2))
# plot(m0); layout(1)
# MASS::boxcox(m0)
# Quadro de análise de variância.
anova(m0)
## Analysis of Variance Table
##
## Response: dac
## Df Sum Sq Mean Sq F value Pr(>F)
## dias 1 140642 140642 512.5683 < 2.2e-16 ***
## I(dias^2) 1 1680 1680 6.1240 0.01417 *
## gen 28 27876 996 3.6284 5.305e-08 ***
## dosep 1 466 466 1.6977 0.19409
## I(dosep^2) 1 231 231 0.8426 0.35977
## gen:dosep 28 10831 387 1.4097 0.09281 .
## gen:I(dosep^2) 28 5488 196 0.7143 0.85411
## Residuals 200 54877 274
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Reduzindo o modelo com o abandono do termo quadrático e interação.
m0 <- update(m0, . ~ dias + I(dias^2) + gen)
anova(m0)
## Analysis of Variance Table
##
## Response: dac
## Df Sum Sq Mean Sq F value Pr(>F)
## dias 1 140642 140642 504.7161 < 2.2e-16 ***
## I(dias^2) 1 1680 1680 6.0302 0.01472 *
## gen 28 27876 996 3.5728 3.223e-08 ***
## Residuals 258 71893 279
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Estimativas dos parâmetros.
summary(m0)
##
## Call:
## lm(formula = dac ~ dias + I(dias^2) + gen, data = dc)
##
## Residuals:
## Min 1Q Median 3Q Max
## -55.793 -9.264 0.755 9.833 49.427
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 56.600728 7.891835 7.172 7.8e-12 ***
## dias -0.263033 0.217329 -1.210 0.22727
## I(dias^2) 0.004164 0.001308 3.183 0.00164 **
## gen2 -8.018830 7.470035 -1.073 0.28406
## gen3 15.496212 7.472634 2.074 0.03910 *
## gen4 -5.283248 7.544041 -0.700 0.48436
## gen5 6.101576 7.514009 0.812 0.41752
## gen6 14.493647 7.549360 1.920 0.05598 .
## gen7 20.382237 7.519841 2.710 0.00717 **
## gen8 4.675344 7.795536 0.600 0.54920
## gen9 12.473500 7.496640 1.664 0.09735 .
## gen10 6.614733 7.481964 0.884 0.37747
## gen11 17.733836 7.496809 2.366 0.01874 *
## gen12 19.657242 7.465616 2.633 0.00897 **
## gen13 21.320000 7.465323 2.856 0.00464 **
## gen14 8.587985 7.501422 1.145 0.25333
## gen15 18.410475 7.468671 2.465 0.01435 *
## gen16 14.878431 7.478959 1.989 0.04772 *
## gen17 14.821973 7.469839 1.984 0.04829 *
## gen18 -5.479486 7.517263 -0.729 0.46671
## gen19 11.124523 7.477072 1.488 0.13802
## gen20 6.664457 7.491505 0.890 0.37451
## gen21 7.794979 7.478214 1.042 0.29822
## gen22 21.090577 7.470931 2.823 0.00513 **
## gen23 -18.818336 7.527289 -2.500 0.01304 *
## gen24 20.405763 7.470871 2.731 0.00674 **
## gen25 17.930494 7.477796 2.398 0.01720 *
## gen26 12.710496 7.504954 1.694 0.09155 .
## gen27 -2.040574 7.569789 -0.270 0.78771
## gen28 8.197417 7.498590 1.093 0.27533
## gen29 3.192171 7.548354 0.423 0.67272
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 16.69 on 258 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.703, Adjusted R-squared: 0.6685
## F-statistic: 20.36 on 30 and 258 DF, p-value: < 2.2e-16
# Último dia de medição das mudas.
dmax <- max(dc$dias, na.rm = TRUE)
# Cria um conjunto de valores para predição.
pred <- with(dc,
expand.grid(
dosep = eseq(dosep, f = 0),
dias = dmax,
gen = levels(gen)))
ic <- predict(m0, newdata = pred, interval = "confidence")
pred <- cbind(pred, as.data.frame(ic))
xyplot(dac ~ dosep | gen,
data = subset(dc, dias == max(dias, na.rm = TRUE)),
# type = c("p", "r"),
xlab = "Dose de cálcio (escala transformada)",
ylab = "Altura das mudas (mm)") +
as.layer(xyplot(fit ~ dosep | gen,
data = pred,
type = "l",
ly = pred$lwr,
uy = pred$upr,
cty = "bands",
prepanel = prepanel.cbH,
panel = panel.cbH))
# Médias ajustadas, considerando um valor fixo de cálcio para o último
# dia de medição.
lsm <- LSmeans(m0,
effect = "gen",
at = list("dias" = dmax, "I(dias^2)" = dmax^2))
lsm
## Coefficients:
## estimate se df t.stat p.value
## [1,] 96.9733 5.2973 258.0000 18.3060 0
## [2,] 88.9544 5.3239 258.0000 16.7085 0
## [3,] 112.4695 5.3009 258.0000 21.2171 0
## [4,] 91.6900 5.4911 258.0000 16.6978 0
## [5,] 103.0748 5.4294 258.0000 18.9847 0
## [6,] 111.4669 5.4958 258.0000 20.2823 0
## [7,] 117.3555 5.4435 258.0000 21.5587 0
## [8,] 101.6486 5.8568 258.0000 17.3557 0
## [9,] 109.4468 5.3895 258.0000 20.3073 0
## [10,] 103.5880 5.3297 258.0000 19.4360 0
## [11,] 114.7071 5.3923 258.0000 21.2724 0
## [12,] 116.6305 5.2964 258.0000 22.0207 0
## [13,] 118.2933 5.2973 258.0000 22.3307 0
## [14,] 105.5612 5.3935 258.0000 19.5719 0
## [15,] 115.3837 5.3192 258.0000 21.6921 0
## [16,] 111.8517 5.3535 258.0000 20.8932 0
## [17,] 111.7952 5.3236 258.0000 20.9999 0
## [18,] 91.4938 5.4152 258.0000 16.8956 0
## [19,] 108.0978 5.3481 258.0000 20.2123 0
## [20,] 103.6377 5.3750 258.0000 19.2813 0
## [21,] 104.7682 5.3483 258.0000 19.5891 0
## [22,] 118.0638 5.2998 258.0000 22.2771 0
## [23,] 78.1549 5.4305 258.0000 14.3918 0
## [24,] 117.3790 5.3195 258.0000 22.0657 0
## [25,] 114.9037 5.3504 258.0000 21.4758 0
## [26,] 109.6837 5.3761 258.0000 20.4019 0
## [27,] 94.9327 5.4750 258.0000 17.3393 0
## [28,] 105.1707 5.3416 258.0000 19.6889 0
## [29,] 100.1654 5.4895 258.0000 18.2468 0
# Atribui nomes às linhas da matriz.
L <- lsm$L
rownames(L) <- levels(dc$gen)
# Obtém os contrastes dois a dois.
grid <- apmc(X = L,
model = m0,
focus = "gen",
test = "fdr",
cld2 = FALSE)
grid <- grid[order(grid$fit, decreasing = TRUE), ]
ocld <- ordered_cld(grid$cld, grid$fit)
grid$cld <- ocld
# Gráfico de segmentos com as letras resumo das comparações múltiplas.
segplot(reorder(gen, fit) ~ lwr + upr,
centers = fit,
data = grid,
draw = FALSE,
xlab = sprintf("Diâmetro à altura do colo aos %d dias (mm)", dmax),
ylab = "Genótipos (ordenados pela média)",
# sub = list(
# sprintf("Estimativas correspondentes à %0.2f de Ca", d),
# font = 3, cex = 0.8),
txt = sprintf("%0.1f %s", grid$fit, grid$cld)) +
layer({
x <- unit(centers, "native") - unit(0.005, "snpc")
y <- unit(z, "native")
grid.rect(x = x, y = y,
width = Reduce(unit.c,
lapply(txt,
FUN = unit,
x = 1.05,
units = "strwidth")) +
unit(0.005, "snpc"),
height = unit(1, "lines"),
just = "right",
gp = gpar(fill = "white",
col = NA,
fontsize = 12))
grid.text(label = txt,
just = "right",
x = x - unit(0.005, "snpc"),
y = y)
})
## Atualizado em 11 de julho de 2019.
##
## R version 3.6.1 (2019-07-05)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 18.04.2 LTS
##
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1
##
## locale:
## [1] LC_CTYPE=pt_BR.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=pt_BR.UTF-8 LC_COLLATE=en_US.UTF-8
## [5] LC_MONETARY=pt_BR.UTF-8 LC_MESSAGES=en_US.UTF-8
## [7] LC_PAPER=pt_BR.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=pt_BR.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] grid stats graphics grDevices utils datasets
## [7] methods base
##
## other attached packages:
## [1] multcomp_1.4-10 TH.data_1.0-10 MASS_7.3-51.4
## [4] survival_2.44-1.1 mvtnorm_1.0-11 doBy_4.6-2
## [7] plyr_1.8.4 gridExtra_2.3 EACS_0.0-7
## [10] wzRfun_0.91 captioner_2.2.3 latticeExtra_0.6-28
## [13] RColorBrewer_1.1-2 lattice_0.20-38 knitr_1.23
##
## loaded via a namespace (and not attached):
## [1] zoo_1.8-6 tidyselect_0.2.5 xfun_0.8
## [4] remotes_2.1.0 purrr_0.3.2 splines_3.6.1
## [7] testthat_2.1.1 htmltools_0.3.6 usethis_1.5.1
## [10] yaml_2.2.0 rlang_0.4.0 pkgbuild_1.0.3
## [13] pkgdown_1.3.0 pillar_1.4.2 glue_1.3.1
## [16] withr_2.1.2 sessioninfo_1.1.1 stringr_1.4.0
## [19] commonmark_1.7 gtable_0.3.0 devtools_2.1.0
## [22] codetools_0.2-16 memoise_1.1.0 evaluate_0.14
## [25] callr_3.3.0 ps_1.3.0 Rcpp_1.0.1
## [28] backports_1.1.4 desc_1.2.0 pkgload_1.0.2
## [31] fs_1.3.1 digest_0.6.20 stringi_1.4.3
## [34] processx_3.4.0 dplyr_0.8.3 rprojroot_1.3-2
## [37] cli_1.1.0 tools_3.6.1 sandwich_2.5-1
## [40] magrittr_1.5 tibble_2.1.3 crayon_1.3.4
## [43] pkgconfig_2.0.2 Matrix_1.2-17 xml2_1.2.0
## [46] prettyunits_1.0.2 assertthat_0.2.1 rmarkdown_1.13
## [49] roxygen2_6.1.1 rstudioapi_0.10 R6_2.4.0
## [52] compiler_3.6.1