|
Estatística Aplicada à Ciência do Solo
|
#-----------------------------------------------------------------------
# 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
p <- seq(0, 1, by = 0.01)
v <- sapply(p, esp)
plot(log(v) ~ p, type = "o")
abline(v = op$minimum)
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
# Reduzindo o modelo pela retirada da interação.
m0 <- update(m0, . ~ gen + dosep)
anova(m0)
## 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
## estimate se df t.stat p.value gen dosep
## 1 25.48490 6.389534 121 3.988538 1.142593e-04 1 0.6269589
## 2 25.44834 6.391887 121 3.981350 1.173558e-04 2 0.6269589
## 3 51.09700 6.389238 121 7.997355 8.598656e-13 3 0.6269589
## 4 16.44309 9.773049 121 1.682493 9.505201e-02 4 0.6269589
## 5 18.39484 9.826002 121 1.872057 6.361290e-02 6 0.6269589
## 6 28.53353 9.774087 121 2.919304 4.184812e-03 7 0.6269589
## 7 45.42637 9.760563 121 4.654072 8.399081e-06 9 0.6269589
## 8 29.08239 6.902114 121 4.213549 4.868040e-05 10 0.6269589
## 9 47.58187 8.452834 121 5.629103 1.194137e-07 11 0.6269589
## 10 49.24313 5.987374 121 8.224495 2.562139e-13 12 0.6269589
## 11 53.88322 6.389882 121 8.432584 8.386814e-14 13 0.6269589
## 12 17.89199 7.584515 121 2.359016 1.992531e-02 14 0.6269589
## 13 40.70770 7.576505 121 5.372887 3.816902e-07 15 0.6269589
## 14 48.86975 6.900963 121 7.081584 1.017314e-10 16 0.6269589
## 15 43.99059 6.902315 121 6.373310 3.501766e-09 17 0.6269589
## 16 32.70363 6.901826 121 4.738402 5.925657e-06 18 0.6269589
## 17 32.61655 6.902219 121 4.725517 6.251622e-06 19 0.6269589
## 18 28.94176 7.560492 121 3.828027 2.059866e-04 20 0.6269589
## 19 15.98486 6.903122 121 2.315598 2.226407e-02 21 0.6269589
## 20 46.72101 5.979800 121 7.813139 2.279566e-12 22 0.6269589
## 21 13.84041 6.902928 121 2.005006 4.719430e-02 23 0.6269589
## 22 40.76478 6.912110 121 5.897589 3.427676e-08 24 0.6269589
## 23 45.49590 6.914780 121 6.579516 1.270363e-09 25 0.6269589
## 24 37.91675 6.911905 121 5.485716 2.296426e-07 26 0.6269589
## 25 19.88570 8.452793 121 2.352560 2.025870e-02 27 0.6269589
## 26 33.85135 6.405298 121 5.284898 5.649573e-07 28 0.6269589
## 27 35.10951 9.759782 121 3.597367 4.666451e-04 29 0.6269589
# 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$K
rownames(L) <- levels(dc$gen)
# Obtém os contrastes dois a dois.
grid <- apmc(X = L,
model = m0,
focus = "gen",
test = "fdr",
cld2 = TRUE)
# 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)",
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)
})
# 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
# Reduzindo o modelo pela retirada da interação.
m0 <- update(m0, . ~ gen + dosep)
anova(m0)
## 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
## estimate se df t.stat p.value gen dosep
## 1 45.26388 8.064544 121 5.612702 1.287469e-07 1 0.6269589
## 2 27.35658 8.067514 121 3.390955 9.413101e-04 2 0.6269589
## 3 49.43934 8.064170 121 6.130741 1.132526e-08 3 0.6269589
## 4 27.05740 12.335045 121 2.193539 3.017992e-02 4 0.6269589
## 5 33.80255 12.401879 121 2.725599 7.371319e-03 6 0.6269589
## 6 49.82171 12.336355 121 4.038609 9.475646e-05 7 0.6269589
## 7 49.07870 12.319285 121 3.983892 1.162518e-04 9 0.6269589
## 8 37.43955 8.711496 121 4.297717 3.510162e-05 10 0.6269589
## 9 33.23227 10.668736 121 3.114921 2.297682e-03 11 0.6269589
## 10 47.22113 7.556958 121 6.248696 6.416797e-09 12 0.6269589
## 11 40.96683 8.064984 121 5.079592 1.390392e-06 13 0.6269589
## 12 60.87733 9.572789 121 6.359414 3.747442e-09 14 0.6269589
## 13 55.52931 9.562678 121 5.806879 5.243149e-08 15 0.6269589
## 14 52.12317 8.710044 121 5.984260 2.276596e-08 16 0.6269589
## 15 52.84983 8.711750 121 6.066499 1.539849e-08 17 0.6269589
## 16 37.73162 8.711133 121 4.331426 3.075640e-05 18 0.6269589
## 17 50.27594 8.711629 121 5.771129 6.193545e-08 19 0.6269589
## 18 51.59985 9.542468 121 5.407391 3.269640e-07 20 0.6269589
## 19 33.12227 8.712769 121 3.801578 2.266351e-04 21 0.6269589
## 20 62.72801 7.547399 121 8.311209 1.610107e-13 22 0.6269589
## 21 12.41845 8.712524 121 1.425356 1.566289e-01 23 0.6269589
## 22 54.20243 8.724113 121 6.212944 7.626683e-09 24 0.6269589
## 23 54.23551 8.727483 121 6.214336 7.575621e-09 25 0.6269589
## 24 45.81420 8.723855 121 5.251600 6.547130e-07 26 0.6269589
## 25 23.05228 10.668684 121 2.160742 3.268590e-02 27 0.6269589
## 26 30.54741 8.084441 121 3.778543 2.462079e-04 28 0.6269589
## 27 39.12636 12.318300 121 3.176280 1.893023e-03 29 0.6269589
# 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$K
rownames(L) <- levels(dc$gen)
# Obtém os contrastes dois a dois.
grid <- apmc(X = L,
model = m0,
focus = "gen",
test = "fdr",
cld2 = TRUE)
# 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
# Reduzindo o modelo mantendo apenas genótipo.
m0 <- update(m0, . ~ gen)
anova(m0)
## 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
## estimate se df t.stat p.value gen
## 1 63.62133 5.135820 122 12.387764 2.551870e-23 1
## 2 51.78488 5.135820 122 10.083080 9.268901e-18 2
## 3 48.44291 5.135820 122 9.432361 3.398118e-16 3
## 4 67.89599 7.845095 122 8.654579 2.404057e-14 4
## 5 64.10164 7.845095 122 8.170920 3.267864e-13 6
## 6 55.78156 7.845095 122 7.110374 8.538101e-11 7
## 7 52.64793 7.845095 122 6.710936 6.455023e-10 9
## 8 65.20578 5.547320 122 11.754465 8.506928e-22 10
## 9 43.28080 6.794051 122 6.370396 3.481879e-09 11
## 10 47.49003 4.804120 122 9.885272 2.777272e-17 12
## 11 40.20310 5.135820 122 7.827981 2.029459e-12 13
## 12 76.81261 6.076784 122 12.640339 6.339157e-24 14
## 13 54.15808 6.076784 122 8.912292 5.905162e-15 15
## 14 50.53784 5.547320 122 9.110317 1.997304e-15 16
## 15 55.48512 5.547320 122 10.002150 1.452478e-17 17
## 16 49.85844 5.547320 122 8.987843 3.906904e-15 18
## 17 63.70715 5.547320 122 11.484312 3.815350e-21 19
## 18 64.24398 6.076784 122 10.572036 6.115431e-19 20
## 19 70.45197 5.547320 122 12.700181 4.560180e-24 21
## 20 60.07648 4.804120 122 12.505200 1.334853e-23 22
## 21 45.96119 5.547320 122 8.285296 1.768879e-13 23
## 22 56.90921 5.547320 122 10.258867 3.490743e-18 24
## 23 56.40877 5.547320 122 10.168653 5.762755e-18 25
## 24 54.95541 5.547320 122 9.906661 2.466745e-17 26
## 25 61.35946 6.794051 122 9.031351 3.078918e-15 27
## 26 48.83365 5.135820 122 9.508443 2.233357e-16 28
## 27 53.57043 7.845095 122 6.828526 3.575988e-10 29
# Atribui nomes às linhas da matriz.
L <- lsm$K
rownames(L) <- levels(dc$gen)
# Obtém os contrastes dois a dois.
grid <- apmc(X = L,
model = m0,
focus = "gen",
test = "fdr",
cld2 = TRUE)
# 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
## estimate se df t.stat p.value gen dias I(dias^2)
## 1 229.1299 20.45033 257 11.204214 5.474996e-24 1 135 18225
## 2 204.3863 20.55556 257 9.943114 6.405929e-20 2 135 18225
## 3 249.8023 20.46428 257 12.206749 2.463392e-27 3 135 18225
## 4 234.0891 21.22625 257 11.028286 2.072367e-23 4 135 18225
## 5 239.0207 20.97922 257 11.393213 1.300236e-24 5 135 18225
## 6 257.2867 21.24493 257 12.110495 5.203910e-27 6 135 18225
## 7 251.6079 21.03579 257 11.960946 1.658161e-26 7 135 18225
## 8 229.1710 22.62822 257 10.127665 1.671569e-20 8 135 18225
## 9 293.2978 20.81983 257 14.087427 8.727442e-34 9 135 18225
## 10 241.8955 20.57914 257 11.754403 8.164078e-26 10 135 18225
## 11 244.0259 20.83084 257 11.714643 1.108617e-25 11 135 18225
## 12 256.6244 20.44675 257 12.550861 1.679643e-28 12 135 18225
## 13 304.2299 20.45033 257 14.876526 1.568915e-36 13 135 18225
## 14 306.2868 20.83551 257 14.700230 6.457492e-36 14 135 18225
## 15 292.6924 20.53780 257 14.251400 2.353023e-34 15 135 18225
## 16 274.1041 20.67383 257 13.258510 6.379765e-31 16 135 18225
## 17 249.0225 20.55448 257 12.115244 5.015574e-27 17 135 18225
## 18 250.1860 20.91005 257 11.964871 1.608562e-26 18 135 18225
## 19 269.2655 20.65352 257 13.037266 3.667506e-30 19 135 18225
## 20 261.6519 20.76175 257 12.602597 1.119976e-28 20 135 18225
## 21 244.0047 20.65461 257 11.813567 5.175470e-26 21 135 18225
## 22 263.2802 20.46009 257 12.867987 1.392729e-29 22 135 18225
## 23 167.3192 20.96875 257 7.979454 4.883165e-14 23 135 18225
## 24 239.6175 20.53947 257 11.666201 1.608763e-25 24 135 18225
## 25 308.5157 20.66247 257 14.931208 1.011369e-36 25 135 18225
## 26 312.1832 20.76345 257 15.035225 4.385870e-37 26 135 18225
## 27 243.6126 21.15186 257 11.517314 5.038111e-25 27 135 18225
## 28 219.6331 20.62396 257 10.649414 3.552397e-22 28 135 18225
## 29 216.9944 21.21943 257 10.226211 8.123827e-21 29 135 18225
## dosep
## 1 0.71885
## 2 0.71885
## 3 0.71885
## 4 0.71885
## 5 0.71885
## 6 0.71885
## 7 0.71885
## 8 0.71885
## 9 0.71885
## 10 0.71885
## 11 0.71885
## 12 0.71885
## 13 0.71885
## 14 0.71885
## 15 0.71885
## 16 0.71885
## 17 0.71885
## 18 0.71885
## 19 0.71885
## 20 0.71885
## 21 0.71885
## 22 0.71885
## 23 0.71885
## 24 0.71885
## 25 0.71885
## 26 0.71885
## 27 0.71885
## 28 0.71885
## 29 0.71885
# 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$K
rownames(L) <- levels(dc$gen)
# Obtém os contrastes dois a dois.
grid <- apmc(X = L,
model = m0,
focus = "gen",
test = "fdr",
cld2 = FALSE)
# 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
## estimate se df t.stat p.value gen dias I(dias^2)
## 1 96.97325 5.297346 258 18.30601 1.523758e-48 1 135 18225
## 2 88.95442 5.323903 258 16.70850 5.628797e-43 2 135 18225
## 3 112.46946 5.300884 258 21.21711 1.677498e-58 3 135 18225
## 4 91.69000 5.491145 258 16.69779 6.135638e-43 4 135 18225
## 5 103.07483 5.429358 258 18.98472 6.841776e-51 5 135 18225
## 6 111.46690 5.495773 258 20.28230 2.444830e-55 6 135 18225
## 7 117.35549 5.443533 258 21.55870 1.196763e-59 7 135 18225
## 8 101.64860 5.856792 258 17.35568 3.086408e-45 8 135 18225
## 9 109.44675 5.389529 258 20.30729 2.009991e-55 9 135 18225
## 10 103.58798 5.329710 258 19.43595 1.914550e-52 10 135 18225
## 11 114.70709 5.392285 258 21.27244 1.092894e-58 11 135 18225
## 12 116.63049 5.296405 258 22.02069 3.432179e-61 12 135 18225
## 13 118.29325 5.297346 258 22.33066 3.208126e-62 13 135 18225
## 14 105.56124 5.393521 258 19.57186 6.540590e-53 14 135 18225
## 15 115.38373 5.319152 258 21.69213 4.280895e-60 15 135 18225
## 16 111.85168 5.353490 258 20.89323 2.073085e-57 16 135 18225
## 17 111.79522 5.323604 258 20.99991 9.045598e-58 17 135 18225
## 18 91.49377 5.415242 258 16.89560 1.247987e-43 18 135 18225
## 19 108.09777 5.348126 258 20.21227 4.233173e-55 19 135 18225
## 20 103.63771 5.375036 258 19.28130 6.510263e-52 20 135 18225
## 21 104.76823 5.348289 258 19.58911 5.707617e-53 21 135 18225
## 22 118.06383 5.299790 258 22.27708 4.829067e-62 22 135 18225
## 23 78.15492 5.430518 258 14.39180 7.110685e-35 23 135 18225
## 24 117.37902 5.319521 258 22.06571 2.431064e-61 24 135 18225
## 25 114.90375 5.350385 258 21.47579 2.269046e-59 25 135 18225
## 26 109.68375 5.376145 258 20.40193 9.580199e-56 26 135 18225
## 27 94.93268 5.475013 258 17.33926 3.521553e-45 27 135 18225
## 28 105.17067 5.341611 258 19.68894 2.596020e-53 28 135 18225
## 29 100.16542 5.489465 258 18.24685 2.444286e-48 29 135 18225
# Atribui nomes às linhas da matriz.
L <- lsm$K
rownames(L) <- levels(dc$gen)
# Obtém os contrastes dois a dois.
grid <- apmc(X = L,
model = m0,
focus = "gen",
test = "fdr",
cld2 = TRUE)
# 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 16 de abril de 2017.
##
## R version 3.3.3 (2017-03-06)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 16.04.2 LTS
##
## 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] methods grid stats graphics grDevices utils
## [7] datasets base
##
## other attached packages:
## [1] multcomp_1.4-6 TH.data_1.0-8 MASS_7.3-45
## [4] survival_2.40-1 mvtnorm_1.0-5 doBy_4.5-15
## [7] plyr_1.8.4 gridExtra_2.2.1 EACS_0.0-3
## [10] wzRfun_0.77 captioner_2.2.3 latticeExtra_0.6-28
## [13] RColorBrewer_1.1-2 lattice_0.20-34 rmarkdown_1.3
## [16] knitr_1.15.1
##
## loaded via a namespace (and not attached):
## [1] Rcpp_0.12.9 tools_3.3.3 digest_0.6.12
## [4] evaluate_0.10 memoise_1.0.0 gtable_0.2.0
## [7] Matrix_1.2-8 commonmark_1.1 yaml_2.1.14
## [10] rpanel_1.1-3 withr_1.0.2 stringr_1.1.0
## [13] roxygen2_6.0.1 xml2_1.1.1 devtools_1.12.0
## [16] rprojroot_1.2 R6_2.2.0 magrittr_1.5
## [19] backports_1.0.5 codetools_0.2-15 htmltools_0.3.5
## [22] splines_3.3.3 sandwich_2.3-4 stringi_1.1.2
## [25] zoo_1.7-14
Estatística Aplicada à Ciência do Solo |
github.com/walmes/EACS |