Modelos de Regressão e aplicações no ambiente R |
|
13 a 17 de Abril de 2015 - Manaus - AM |
Prof. Dr. Walmes M. Zeviani |
Fundação Oswaldo Cruz - FIOCRUZ |
Lab. de Estatística e Geoinformação - LEG |
Departamento de Estatística - UFPR |
##=============================================================================
## Modelos de Regressão e aplicações no ambiente R
##
## 13 a 17 de Abril de 2015 - Manaus/AM
## Fundação Oswaldo Cruz - FIOCRUZ
##
## Prof. Dr. Walmes M. Zeviani
## LEG/DEST/UFPR
##=============================================================================
##-----------------------------------------------------------------------------
## Definições da sessão.
pkg <- c("lattice", "latticeExtra", "gridExtra", "car", "alr3",
"plyr", "reshape", "doBy", "multcomp", "ellipse", "wzRfun")
sapply(pkg, require, character.only=TRUE)
## lattice latticeExtra gridExtra car alr3 plyr
## TRUE TRUE TRUE TRUE TRUE TRUE
## reshape doBy multcomp ellipse wzRfun
## TRUE TRUE TRUE TRUE TRUE
trellis.device(color=FALSE)
extendseq <- function(x, f=0.1, length.out=20){
er <- extendrange(x, f=f)
seq(er[1], er[2], length.out=length.out)
}
##-----------------------------------------------------------------------------
## Tamanho de tartarugas em função do sexo.
url <- "http://westfall.ba.ttu.edu/isqs5349/Rdata/turtles.txt"
tur <- read.table(url, header=TRUE, sep="\t")
str(tur)
## 'data.frame': 48 obs. of 4 variables:
## $ length: int 98 103 103 105 109 123 123 133 133 133 ...
## $ width : int 81 84 86 86 88 92 95 99 102 102 ...
## $ height: int 38 38 42 42 44 50 46 51 51 51 ...
## $ gender: int 1 1 1 1 1 1 1 1 1 1 ...
xtabs(~gender, tur)
## gender
## 0 1
## 24 24
## xyplot(width+height~length, groups=gender, data=tur, type=c("p","smooth"),
## scales=list(y=list(relation="free")))
splom(tur[,1:3], groups=tur$gender, type=c("p","smooth"), auto.key=TRUE)
##-----------------------------------------------------------------------------
## Ajustar reta separada por gender. São só 2 níveis, então codificada
## como numérica (dummy) ou fator implica no mesmo modelo.
## Possíveis modelos:
## fórmula | n. par. | equação
## ~1 | 1 | b0
## ~length | 2 | b0+b1*x
## ~gender+length | 3 | b0+a0*(sexo==1)+b1*x
## ~gender*length | 4 | b0+a0*(sexo==1)+b1*x+a1*(sexo==1)
## Modelo com interação (modelo maior).
m0 <- lm(height~gender*length, data=tur)
par(mfrow=c(2,2)); plot(m0); layout(1)
summary(m0)
##
## Call:
## lm(formula = height ~ gender * length, data = tur)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.2913 -0.9333 0.0084 1.0328 3.9903
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 10.17217 3.23946 3.140 0.00302 **
## gender -8.13218 3.89842 -2.086 0.04281 *
## length 0.26934 0.02843 9.475 3.43e-12 ***
## gender:length 0.09821 0.03250 3.022 0.00418 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.606 on 44 degrees of freedom
## Multiple R-squared: 0.9655, Adjusted R-squared: 0.9631
## F-statistic: 410.5 on 3 and 44 DF, p-value: < 2.2e-16
## Usando gender como fator de dois níveis.
tur$Gender <- factor(tur$gender)
str(tur)
## 'data.frame': 48 obs. of 5 variables:
## $ length: int 98 103 103 105 109 123 123 133 133 133 ...
## $ width : int 81 84 86 86 88 92 95 99 102 102 ...
## $ height: int 38 38 42 42 44 50 46 51 51 51 ...
## $ gender: int 1 1 1 1 1 1 1 1 1 1 ...
## $ Gender: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 2 2 2 ...
m1 <- lm(height~Gender*length, data=tur)
m1 <- lm(height~Gender*length, data=tur,
contrasts=list(Gender=contr.SAS))
summary(m1)
##
## Call:
## lm(formula = height ~ Gender * length, data = tur, contrasts = list(Gender = contr.SAS))
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.2913 -0.9333 0.0084 1.0328 3.9903
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.03999 2.16877 0.941 0.35204
## Gender1 8.13218 3.89842 2.086 0.04281 *
## length 0.36755 0.01576 23.323 < 2e-16 ***
## Gender1:length -0.09821 0.03250 -3.022 0.00418 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.606 on 44 degrees of freedom
## Multiple R-squared: 0.9655, Adjusted R-squared: 0.9631
## F-statistic: 410.5 on 3 and 44 DF, p-value: < 2.2e-16
## contr.treatment
## contr.SAS
## contr.sum
## contr.helmert
## contr.poly
## Diagnóstico
par(mfrow=c(2,2)); plot(m1); layout(1)
## Essa parametrização de nível de referência é útil para testar
## hipóteses. A parametrização de estimativas por categoria é mais
## interessante para interpretação.
m2 <- update(m1, .~0+Gender/length)
summary(m2)
##
## Call:
## lm(formula = height ~ Gender + Gender:length - 1, data = tur,
## contrasts = list(Gender = contr.SAS))
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.2913 -0.9333 0.0084 1.0328 3.9903
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## Gender0 10.17217 3.23946 3.140 0.00302 **
## Gender1 2.03999 2.16877 0.941 0.35204
## Gender0:length 0.26934 0.02843 9.475 3.43e-12 ***
## Gender1:length 0.36755 0.01576 23.323 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.606 on 44 degrees of freedom
## Multiple R-squared: 0.9989, Adjusted R-squared: 0.9988
## F-statistic: 1.031e+04 on 4 and 44 DF, p-value: < 2.2e-16
## Veja que o R² aumentou pelo fato de o modelo declarado não ter o
## modelo nulo como modelo mínimo por considerar efeitos iguais a zero.
## Mesmo nessa parametrização é possível comparar as inclinações. Basta
## escrever a matriz de funções lineares corretamente.
L <- rbind(c(0,0,-1,1))
summary(glht(m2, linfct=L))
##
## Simultaneous Tests for General Linear Hypotheses
##
## Fit: lm(formula = height ~ Gender + Gender:length - 1, data = tur,
## contrasts = list(Gender = contr.SAS))
##
## Linear Hypotheses:
## Estimate Std. Error t value Pr(>|t|)
## 1 == 0 0.09821 0.03250 3.022 0.00418 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)
##-----------------------------------------------------------------------------
## Predição.
pred <- ddply(tur, .(Gender), summarise, length=extendseq(length, l=12))
pred <- cbind(pred, predict(m2, newdata=pred, interval="confidence"))
p1 <- xyplot(height~length, groups=Gender, data=tur,
xlab="Altura", ylab="Comprimento")
p2 <- xyplot(fit~length, groups=Gender, data=pred, type="l",
ly=pred$lwr, uy=pred$upr, cty="bands", alpha=0.5,
prepanel=prepanel.cbH, panel=panel.superpose,
panel.groups=panel.cbH)
p1+as.layer(p2, under=TRUE)
##-----------------------------------------------------------------------------
## Total de tempo dormindo em função do peso corporal e nível de
## agressividade de mamíferos.
str(sleep1)
## 'data.frame': 62 obs. of 10 variables:
## $ SWS : num NA 6.3 NA NA 2.1 9.1 15.8 5.2 10.9 8.3 ...
## $ PS : num NA 2 NA NA 1.8 0.7 3.9 1 3.6 1.4 ...
## $ TS : num 3.3 8.3 12.5 16.5 3.9 9.8 19.7 6.2 14.5 9.7 ...
## $ BodyWt : num 6654 1 3.38 0.92 2547 ...
## $ BrainWt: num 5712 6.6 44.5 5.7 4603 ...
## $ Life : num 38.6 4.5 14 NA 69 27 19 30.4 28 50 ...
## $ GP : num 645 42 60 25 624 180 35 392 63 230 ...
## $ P : int 3 3 1 5 3 4 1 4 1 1 ...
## $ SE : int 5 1 1 2 5 4 1 5 2 1 ...
## $ D : int 3 3 1 3 4 4 1 4 1 1 ...
## help(sleep1, h="html")
## Danger Index.
sleep1$D <- factor(sleep1$D)
sleep1$lbw <- log(sleep1$BodyWt)
xyplot(TS~lbw|D, data=sleep1)
xyplot(TS~lbw|D, data=sleep1, type=c("p","r"))
##-----------------------------------------------------------------------------
## Ajuste do modelo.
m0 <- lm(TS~D*lbw, data=sleep1)
## Diagnóstico.
par(mfrow=c(2,2)); plot(m0); layout(1)
## Relação média variância.
## Transformar a resposta?
MASS::boxcox(m0)
m1 <- update(m0, log(TS)~.)
par(mfrow=c(2,2)); plot(m1); layout(1)
## Quadro de anova e de estimativas.
anova(m1)
## Analysis of Variance Table
##
## Response: log(TS)
## Df Sum Sq Mean Sq F value Pr(>F)
## D 4 7.6814 1.92036 18.3334 3.348e-09 ***
## lbw 1 2.2637 2.26371 21.6113 2.636e-05 ***
## D:lbw 4 0.5504 0.13761 1.3137 0.2783
## Residuals 48 5.0278 0.10475
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary(m1)
##
## Call:
## lm(formula = log(TS) ~ D + lbw + D:lbw, data = sleep1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.73527 -0.13732 0.00532 0.21433 0.56142
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.557673 0.084026 30.439 <2e-16 ***
## D2 -0.142271 0.123092 -1.156 0.2535
## D3 -0.326209 0.132434 -2.463 0.0174 *
## D4 -0.310486 0.149163 -2.082 0.0427 *
## D5 -0.734857 0.313919 -2.341 0.0234 *
## lbw -0.041075 0.026081 -1.575 0.1219
## D2:lbw -0.009806 0.068207 -0.144 0.8863
## D3:lbw -0.084594 0.040404 -2.094 0.0416 *
## D4:lbw -0.017844 0.039409 -0.453 0.6527
## D5:lbw -0.079605 0.072602 -1.096 0.2783
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3236 on 48 degrees of freedom
## (4 observations deleted due to missingness)
## Multiple R-squared: 0.6761, Adjusted R-squared: 0.6154
## F-statistic: 11.13 on 9 and 48 DF, p-value: 3.839e-09
## summary(glht(m1))
summary(glht(m1), test=adjusted(type="fdr"))
##
## Simultaneous Tests for General Linear Hypotheses
##
## Fit: lm(formula = log(TS) ~ D + lbw + D:lbw, data = sleep1)
##
## Linear Hypotheses:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) == 0 2.557673 0.084026 30.439 <2e-16 ***
## D2 == 0 -0.142271 0.123092 -1.156 0.3479
## D3 == 0 -0.326209 0.132434 -2.463 0.0781 .
## D4 == 0 -0.310486 0.149163 -2.082 0.0855 .
## D5 == 0 -0.734857 0.313919 -2.341 0.0781 .
## lbw == 0 -0.041075 0.026081 -1.575 0.2031
## D2:lbw == 0 -0.009806 0.068207 -0.144 0.8863
## D3:lbw == 0 -0.084594 0.040404 -2.094 0.0855 .
## D4:lbw == 0 -0.017844 0.039409 -0.453 0.7253
## D5:lbw == 0 -0.079605 0.072602 -1.096 0.3479
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- fdr method)
##-----------------------------------------------------------------------------
## Estimativas por grupo.
## R² com SQT corrigida para média.
summary(m1)
##
## Call:
## lm(formula = log(TS) ~ D + lbw + D:lbw, data = sleep1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.73527 -0.13732 0.00532 0.21433 0.56142
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.557673 0.084026 30.439 <2e-16 ***
## D2 -0.142271 0.123092 -1.156 0.2535
## D3 -0.326209 0.132434 -2.463 0.0174 *
## D4 -0.310486 0.149163 -2.082 0.0427 *
## D5 -0.734857 0.313919 -2.341 0.0234 *
## lbw -0.041075 0.026081 -1.575 0.1219
## D2:lbw -0.009806 0.068207 -0.144 0.8863
## D3:lbw -0.084594 0.040404 -2.094 0.0416 *
## D4:lbw -0.017844 0.039409 -0.453 0.6527
## D5:lbw -0.079605 0.072602 -1.096 0.2783
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3236 on 48 degrees of freedom
## (4 observations deleted due to missingness)
## Multiple R-squared: 0.6761, Adjusted R-squared: 0.6154
## F-statistic: 11.13 on 9 and 48 DF, p-value: 3.839e-09
m2 <- update(m1, .~0+D/lbw)
## R² com SQT **não** corrigida para a média.
summary(m2)
##
## Call:
## lm(formula = log(TS) ~ D + D:lbw - 1, data = sleep1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.73527 -0.13732 0.00532 0.21433 0.56142
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## D1 2.55767 0.08403 30.439 < 2e-16 ***
## D2 2.41540 0.08995 26.852 < 2e-16 ***
## D3 2.23146 0.10236 21.799 < 2e-16 ***
## D4 2.24719 0.12324 18.234 < 2e-16 ***
## D5 1.82282 0.30246 6.027 2.28e-07 ***
## D1:lbw -0.04107 0.02608 -1.575 0.121853
## D2:lbw -0.05088 0.06302 -0.807 0.423452
## D3:lbw -0.12567 0.03086 -4.072 0.000173 ***
## D4:lbw -0.05892 0.02954 -1.994 0.051817 .
## D5:lbw -0.12068 0.06776 -1.781 0.081224 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3236 on 48 degrees of freedom
## (4 observations deleted due to missingness)
## Multiple R-squared: 0.9836, Adjusted R-squared: 0.9802
## F-statistic: 287.5 on 10 and 48 DF, p-value: < 2.2e-16
deviance(m1)
## [1] 5.027836
deviance(m2)
## [1] 5.027836
m3 <- update(m1, .~0+D+lbw)
summary(m3)
##
## Call:
## lm(formula = log(TS) ~ D + lbw - 1, data = sleep1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.76671 -0.17367 0.03659 0.22033 0.59205
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## D1 2.59984 0.08007 32.469 < 2e-16 ***
## D2 2.40702 0.08775 27.430 < 2e-16 ***
## D3 2.22816 0.10358 21.512 < 2e-16 ***
## D4 2.27415 0.11370 20.002 < 2e-16 ***
## D5 1.62525 0.13947 11.653 4.07e-16 ***
## lbw -0.07229 0.01574 -4.594 2.80e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3275 on 52 degrees of freedom
## (4 observations deleted due to missingness)
## Multiple R-squared: 0.9818, Adjusted R-squared: 0.9797
## F-statistic: 467 on 6 and 52 DF, p-value: < 2.2e-16
##-----------------------------------------------------------------------------
## Preço dos carros em função da categoria (simples, sedan ou cross).
url <- "http://www.leg.ufpr.br/~walmes/data/hb20_venda_webmotors_280314.txt"
db <- read.table(url, header=TRUE, sep="\t")
str(db)
## 'data.frame': 783 obs. of 6 variables:
## $ carro : Factor w/ 3 levels "hb20","hb20s",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ especificacao: Factor w/ 20 levels "HYUNDAI HB20 1.0 COMFORT 12V FLEX 4P MANUAL",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ cor : Factor w/ 8 levels "azul","branco",..: 2 2 2 8 2 7 7 8 2 2 ...
## $ km : int 0 0 0 0 0 0 0 0 0 0 ...
## $ anomod : Factor w/ 4 levels "2012/2013","2013/2013",..: 3 3 3 3 2 2 3 4 4 4 ...
## $ preco : int 32890 32900 33240 33240 33250 33250 33295 33490 33890 33990 ...
db <- subset(db, select=c("carro", "km", "preco"))
db <- transform(db, km=km/1000, preco=preco/1000)
## Variável indicadora de carro zero km.
## db$novo <- ifelse(db$km==0, 1, 0)
db$novo <- as.integer(db$km==0)
xyplot(preco~km|carro, data=db)
xyplot(preco~km|carro, groups=novo, data=db,
type=c("p", "r"))
##-----------------------------------------------------------------------------
## Ajuste do modelo.
m0 <- lm(preco~carro*(km+novo), data=db)
## Diagnóstico.
par(mfrow=c(2,2)); plot(m0); layout(1)
summary(m0)
##
## Call:
## lm(formula = preco ~ carro * (km + novo), data = db)
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.6217 -4.1564 -0.6292 4.2707 13.9216
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 43.11022 0.81051 53.189 < 2e-16 ***
## carrohb20s 5.16347 1.99321 2.591 0.009763 **
## carrohb20x 8.51989 2.12692 4.006 6.78e-05 ***
## km -0.16338 0.04657 -3.508 0.000477 ***
## novo -1.09179 0.85393 -1.279 0.201441
## carrohb20s:km 0.13727 0.16622 0.826 0.409163
## carrohb20x:km -0.01700 0.22733 -0.075 0.940394
## carrohb20s:novo 0.43735 2.05390 0.213 0.831432
## carrohb20x:novo 2.13607 2.23495 0.956 0.339493
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.397 on 774 degrees of freedom
## Multiple R-squared: 0.3358, Adjusted R-squared: 0.329
## F-statistic: 48.92 on 8 and 774 DF, p-value: < 2.2e-16
anova(m0)
## Analysis of Variance Table
##
## Response: preco
## Df Sum Sq Mean Sq F value Pr(>F)
## carro 2 10887.2 5443.6 186.9200 < 2.2e-16 ***
## km 1 375.3 375.3 12.8884 0.0003515 ***
## novo 1 45.0 45.0 1.5445 0.2143218
## carro:km 2 63.8 31.9 1.0958 0.3347842
## carro:novo 2 26.7 13.4 0.4587 0.6323066
## Residuals 774 22540.9 29.1
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
m1 <- update(m0, .~ carro*km)
summary(m1)
##
## Call:
## lm(formula = preco ~ carro + km + carro:km, data = db)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.7632 -4.2316 -0.5568 4.2432 13.8134
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 42.12663 0.25499 165.208 < 2e-16 ***
## carrohb20s 5.52513 0.47911 11.532 < 2e-16 ***
## carrohb20x 10.45011 0.65283 16.007 < 2e-16 ***
## km -0.12156 0.03312 -3.670 0.000259 ***
## carrohb20s:km 0.14059 0.09970 1.410 0.158892
## carrohb20x:km -0.12830 0.17801 -0.721 0.471302
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.393 on 777 degrees of freedom
## Multiple R-squared: 0.3341, Adjusted R-squared: 0.3298
## F-statistic: 77.97 on 5 and 777 DF, p-value: < 2.2e-16
anova(m1)
## Analysis of Variance Table
##
## Response: preco
## Df Sum Sq Mean Sq F value Pr(>F)
## carro 2 10887.2 5443.6 187.1577 < 2.2e-16 ***
## km 1 375.3 375.3 12.9048 0.0003484 ***
## carro:km 2 76.9 38.4 1.3219 0.2672326
## Residuals 777 22599.6 29.1
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## m2 <- update(m1, .~. -carro:km)
m2 <- update(m1, .~carro+km)
summary(m2)
##
## Call:
## lm(formula = preco ~ carro + km, data = db)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.7684 -4.1862 -0.5109 4.1713 13.8413
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 42.09873 0.25321 166.263 < 2e-16 ***
## carrohb20s 5.72797 0.45598 12.562 < 2e-16 ***
## carrohb20x 10.35724 0.63180 16.393 < 2e-16 ***
## km -0.11049 0.03077 -3.591 0.00035 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 5.395 on 779 degrees of freedom
## Multiple R-squared: 0.3318, Adjusted R-squared: 0.3293
## F-statistic: 129 on 3 and 779 DF, p-value: < 2.2e-16
##-----------------------------------------------------------------------------
## Predição.
pred <- expand.grid(carro=levels(db$carro),
km=seq(0,50,l=10))
aux <- predict(m2, newdata=pred, interval="confidence")
pred <- cbind(pred, aux)
p1 <- xyplot(preco~km, groups=carro, data=db, auto.key=TRUE)
p2 <- xyplot(fit~km, groups=carro, data=pred, type="l",
ly=pred$lwr, uy=pred$upr, cty="bands", alpha=0.5,
panel=panel.superpose, panel.groups=panel.cbH)
p1+as.layer(p2, under=TRUE)
##-----------------------------------------------------------------------------
## Dados de índice agronômico de milho.
da <- read.table("http://www.leg.ufpr.br/~walmes/cursoR/anovareg.txt",
header=TRUE, sep="\t")
str(da)
## 'data.frame': 72 obs. of 4 variables:
## $ cultivar: Factor w/ 3 levels "Ag-1002","BR-300",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ dose : int 0 0 0 0 60 60 60 60 120 120 ...
## $ bloco : Factor w/ 4 levels "I","II","III",..: 1 2 3 4 1 2 3 4 1 2 ...
## $ indice : int 46 48 44 46 48 47 49 48 52 50 ...
xyplot(indice~dose|cultivar, data=da, type=c("p","a"), jitter.x=TRUE)
## xyplot(indice~dose|cultivar, data=da, groups=bloco, type="b")
## Por que sempre dois pontos são iguais?
##-----------------------------------------------------------------------------
## Ajuste do modelo saturado (equivalente ao poli grau 5).
da$Dose <- factor(da$dose)
m0 <- lm(indice~bloco+cultivar*Dose, data=da)
## Diagnóstico.
par(mfrow=c(2,2)); plot(m0); layout(1)
anova(m0)
## Analysis of Variance Table
##
## Response: indice
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 3 13.83 4.611 4.4232 0.007709 **
## cultivar 2 38.08 19.042 18.2657 1.042e-06 ***
## Dose 5 729.17 145.833 139.8903 < 2.2e-16 ***
## cultivar:Dose 10 53.25 5.325 5.1080 3.863e-05 ***
## Residuals 51 53.17 1.042
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Ajuste dos modelos de trabalho.
m1 <- update(m0, .~bloco+cultivar*(dose+I(dose^2)+I(dose^3)))
m2 <- update(m0, .~bloco+cultivar*(dose+I(dose^2)))
## Teste da falta de ajuste.
anova(m0, m1)
## Analysis of Variance Table
##
## Model 1: indice ~ bloco + cultivar * Dose
## Model 2: indice ~ bloco + cultivar + dose + I(dose^2) + I(dose^3) + cultivar:dose +
## cultivar:I(dose^2) + cultivar:I(dose^3)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 51 53.167
## 2 57 57.542 -6 -4.375 0.6995 0.6512
anova(m0, m2)
## Analysis of Variance Table
##
## Model 1: indice ~ bloco + cultivar * Dose
## Model 2: indice ~ bloco + cultivar + dose + I(dose^2) + cultivar:dose +
## cultivar:I(dose^2)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 51 53.167
## 2 60 64.804 -9 -11.637 1.2404 0.2922
##-----------------------------------------------------------------------------
## Predição (considerar o efeito de um bloco qualquer, o 1 primeiro).
pred <- with(da,
expand.grid(bloco=levels(bloco)[1],
cultivar=levels(cultivar),
dose=extendseq(dose)))
pred <- cbind(pred, predict(m2, newdata=pred, interval="confidence"))
p1 <- xyplot(indice~dose|cultivar, data=da)
p2 <- xyplot(fit~dose|cultivar, data=pred, type="l",
ly=pred$lwr, uy=pred$upr, cty="bands", alpha=0.25,
prepanel=prepanel.cbH,
panel=panel.cbH)
p1+as.layer(p2)
## Não passa no meio dos pontos porque essa predição está
## particularizada para o efeito do bloco 1 e não na média dos blocos.
##-----------------------------------------------------------------------------
## Caso alguém tenha necessidade, é possível conduzir testes para saber
## se as inclinações são iguais na origem, ou seja, comparar o b1 das
## curvas. Só é necessário montar a matriz de contrastes.
levels(da$cultivar)
## [1] "Ag-1002" "BR-300" "Pioneer-B815"
cbind(coef(m2))
## [,1]
## (Intercept) 4.658929e+01
## blocoII -1.055556e+00
## blocoIII -8.888889e-01
## blocoIV -1.055556e+00
## cultivarBR-300 -3.491071e+00
## cultivarPioneer-B815 1.339286e+00
## dose 4.336310e-02
## I(dose^2) -5.208333e-05
## cultivarBR-300:dose 5.132440e-02
## cultivarPioneer-B815:dose 1.223214e-02
## cultivarBR-300:I(dose^2) -1.401290e-04
## cultivarPioneer-B815:I(dose^2) -5.704365e-05
L <- rbind("Ag vs BR"=c(0, 0,0,0, 0,0, 0, 0, 1,0, 0,0),
"Ag vs Pi"=c(0, 0,0,0, 0,0, 0, 0, 0,1, 0,0),
"Br vs Pi"=c(0, 0,0,0, 0,0, 0, 0,-1,1, 0,0))
## Estimativa das diferenças em inclinação na origem.
L%*%coef(m2)
## [,1]
## Ag vs BR 0.05132440
## Ag vs Pi 0.01223214
## Br vs Pi -0.03909226
summary(glht(m2, linfct=L))
##
## Simultaneous Tests for General Linear Hypotheses
##
## Fit: lm(formula = indice ~ bloco + cultivar + dose + I(dose^2) + cultivar:dose +
## cultivar:I(dose^2), data = da)
##
## Linear Hypotheses:
## Estimate Std. Error t value Pr(>|t|)
## Ag vs BR == 0 0.05132 0.01044 4.915 < 1e-04 ***
## Ag vs Pi == 0 0.01223 0.01044 1.171 0.47468
## Br vs Pi == 0 -0.03909 0.01044 -3.744 0.00118 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)
## A produtividade na dose 240 é a mesma nessas cultivares? Como fazer
## esse teste de médias?
LSmeans(m2, effect="cultivar",
at=list("dose"=240))
## estimate se df t.stat p.value cultivar dose I(dose^2)
## 1 53.24643 0.2879825 60 184.8947 2.078013e-84 Ag-1002 240 33000
## 2 54.00179 0.2879825 60 187.5176 8.937457e-85 BR-300 240 33000
## 3 54.23571 0.2879825 60 188.3299 6.898701e-85 Pioneer-B815 240 33000
L <- LSmatrix(m2, effect="cultivar",
at=list("dose"=240))
levels(da$cultivar)
## [1] "Ag-1002" "BR-300" "Pioneer-B815"
L <- rbind(
"Ag"=LSmatrix(m2, at=list("cultivar"="Ag-1002", "dose"=320)),
"Br"=LSmatrix(m2, at=list("cultivar"="BR-300", "dose"=250)),
"Pi"=LSmatrix(m2, at=list("cultivar"="Pioneer-B815", "dose"=255)))
## Estimativas das produtividades nessa dose.
summary(glht(m2, linfct=L))
##
## Simultaneous Tests for General Linear Hypotheses
##
## Fit: lm(formula = indice ~ bloco + cultivar + dose + I(dose^2) + cultivar:dose +
## cultivar:I(dose^2), data = da)
##
## Linear Hypotheses:
## Estimate Std. Error t value Pr(>|t|)
## 1 == 0 54.3821 0.5982 90.91 <2e-16 ***
## 2 == 0 54.0068 0.2967 182.06 <2e-16 ***
## 3 == 0 54.2594 0.3040 178.49 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)
## Estimativas dos contrastes.
summary(glht(m2, linfct=apc(L)))
##
## Simultaneous Tests for General Linear Hypotheses
##
## Fit: lm(formula = indice ~ bloco + cultivar + dose + I(dose^2) + cultivar:dose +
## cultivar:I(dose^2), data = da)
##
## Linear Hypotheses:
## Estimate Std. Error t value Pr(>|t|)
## 1-2 == 0 0.3753 0.6677 0.562 0.837
## 1-3 == 0 0.1228 0.6710 0.183 0.981
## 2-3 == 0 -0.2526 0.4247 -0.595 0.820
## (Adjusted p values reported -- single-step method)
summary(glht(m2, linfct=apc(L)), test=Ftest())
##
## General Linear Hypotheses
##
## Linear Hypotheses:
## Estimate
## 1-2 == 0 0.3753
## 1-3 == 0 0.1228
## 2-3 == 0 -0.2526
##
## Global Test:
## F DF1 DF2 Pr(>F)
## 1 0.2557 2 60 0.7752
##-----------------------------------------------------------------------------
## Como obter as equações (se é que fato são necessárias).
m3 <- update(m2, .~0+cultivar/(dose+I(dose^2))+bloco,
contrasts=list(bloco=contr.sum))
summary(m3)$coeff
## Estimate Std. Error t value Pr(>|t|)
## cultivarAg-1002 4.583929e+01 4.709564e-01 97.3323244 9.533156e-68
## cultivarBR-300 4.234821e+01 4.709564e-01 89.9195977 1.070432e-65
## cultivarPioneer-B815 4.717857e+01 4.709564e-01 100.1760815 1.711340e-68
## bloco1 7.500000e-01 2.121389e-01 3.5354202 7.914710e-04
## bloco2 -3.055556e-01 2.121389e-01 -1.4403564 1.549646e-01
## bloco3 -1.388889e-01 2.121389e-01 -0.6547075 5.151582e-01
## cultivarAg-1002:dose 4.336310e-02 7.383254e-03 5.8731689 1.999069e-07
## cultivarBR-300:dose 9.468750e-02 7.383254e-03 12.8246306 7.687617e-19
## cultivarPioneer-B815:dose 5.559524e-02 7.383254e-03 7.5299104 3.112663e-10
## cultivarAg-1002:I(dose^2) -5.208333e-05 2.362354e-05 -2.2047219 3.131888e-02
## cultivarBR-300:I(dose^2) -1.922123e-04 2.362354e-05 -8.1364736 2.867760e-11
## cultivarPioneer-B815:I(dose^2) -1.091270e-04 2.362354e-05 -4.6194173 2.085883e-05
split(coef(m3), m3$assign)
## $`1`
## cultivarAg-1002 cultivarBR-300 cultivarPioneer-B815
## 45.83929 42.34821 47.17857
##
## $`2`
## bloco1 bloco2 bloco3
## 0.7500000 -0.3055556 -0.1388889
##
## $`3`
## cultivarAg-1002:dose cultivarBR-300:dose cultivarPioneer-B815:dose
## 0.04336310 0.09468750 0.05559524
##
## $`4`
## cultivarAg-1002:I(dose^2) cultivarBR-300:I(dose^2)
## -5.208333e-05 -1.922123e-04
## cultivarPioneer-B815:I(dose^2)
## -1.091270e-04
##-----------------------------------------------------------------------------
## É possível também, caso considerar necessário, repartir as somas de
## quadrados.
m4 <- aov(indice~bloco+cultivar/(dose+I(dose^2)), data=da)
m4$assign
## [1] 0 1 1 1 2 2 3 3 3 4 4 4
anova(m4)
## Analysis of Variance Table
##
## Response: indice
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 3 13.83 4.611 4.2693 0.008472 **
## cultivar 2 38.08 19.042 17.6300 9.489e-07 ***
## cultivar:dose 3 670.98 223.660 207.0788 < 2.2e-16 ***
## cultivar:I(dose^2) 3 99.80 33.267 30.8007 3.524e-12 ***
## Residuals 60 64.80 1.080
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coef(m4)
## (Intercept) blocoII
## 4.658929e+01 -1.055556e+00
## blocoIII blocoIV
## -8.888889e-01 -1.055556e+00
## cultivarBR-300 cultivarPioneer-B815
## -3.491071e+00 1.339286e+00
## cultivarAg-1002:dose cultivarBR-300:dose
## 4.336310e-02 9.468750e-02
## cultivarPioneer-B815:dose cultivarAg-1002:I(dose^2)
## 5.559524e-02 -5.208333e-05
## cultivarBR-300:I(dose^2) cultivarPioneer-B815:I(dose^2)
## -1.922123e-04 -1.091270e-04
summary(m4,
split=list(
"cultivar:dose"=list(Ag=1, BR=2, Pi=3),
"cultivar:I(dose^2)"=list(BR=2, Pi=3, Ag=1)
))
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 3 13.8 4.6 4.269 0.00847 **
## cultivar 2 38.1 19.0 17.630 9.49e-07 ***
## cultivar:dose 3 671.0 223.7 207.079 < 2e-16 ***
## cultivar:dose: Ag 1 193.9 193.9 179.516 < 2e-16 ***
## cultivar:dose: BR 1 345.4 345.4 319.824 < 2e-16 ***
## cultivar:dose: Pi 1 131.7 131.7 121.897 4.41e-16 ***
## cultivar:I(dose^2) 3 99.8 33.3 30.801 3.52e-12 ***
## cultivar:I(dose^2): BR 1 71.5 71.5 66.202 2.87e-11 ***
## cultivar:I(dose^2): Pi 1 23.0 23.0 21.339 2.09e-05 ***
## cultivar:I(dose^2): Ag 1 5.2 5.2 4.861 0.03132 *
## Residuals 60 64.8 1.1
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
m5 <- aov(indice~bloco+cultivar/(dose+I(dose^2)+I(dose^3)), data=da)
summary(m5,
split=list(
"cultivar:dose"=list(Ag=1, BR=2, Pi=3),
"cultivar:I(dose^2)"=list(Ag=1, BR=2, Pi=3),
"cultivar:I(dose^3)"=list(Ag=1, BR=2, Pi=3)
))
## Df Sum Sq Mean Sq F value Pr(>F)
## bloco 3 13.8 4.6 4.568 0.00617 **
## cultivar 2 38.1 19.0 18.862 5.17e-07 ***
## cultivar:dose 3 671.0 223.7 221.554 < 2e-16 ***
## cultivar:dose: Ag 1 193.9 193.9 192.064 < 2e-16 ***
## cultivar:dose: BR 1 345.4 345.4 342.180 < 2e-16 ***
## cultivar:dose: Pi 1 131.7 131.7 130.418 2.32e-16 ***
## cultivar:I(dose^2) 3 99.8 33.3 32.954 1.74e-12 ***
## cultivar:I(dose^2): Ag 1 5.2 5.2 5.201 0.02634 *
## cultivar:I(dose^2): BR 1 71.5 71.5 70.830 1.41e-11 ***
## cultivar:I(dose^2): Pi 1 23.0 23.0 22.831 1.28e-05 ***
## cultivar:I(dose^3) 3 7.3 2.4 2.398 0.07740 .
## cultivar:I(dose^3): Ag 1 0.7 0.7 0.666 0.41788
## cultivar:I(dose^3): BR 1 0.2 0.2 0.166 0.68479
## cultivar:I(dose^3): Pi 1 6.4 6.4 6.362 0.01448 *
## Residuals 57 57.5 1.0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
levels(da$cultivar)
## [1] "Ag-1002" "BR-300" "Pioneer-B815"
da$ind <- as.integer(da$cultivar=="Pioneer-B815")
m6 <- lm(indice~bloco+cultivar*(dose+I(dose^2))+ind:I(dose^3), data=da)
summary(m6)
##
## Call:
## lm(formula = indice ~ bloco + cultivar * (dose + I(dose^2)) +
## ind:I(dose^3), data = da)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.08750 -0.59226 -0.02361 0.34861 2.96806
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.659e+01 4.944e-01 94.233 < 2e-16 ***
## blocoII -1.056e+00 3.316e-01 -3.183 0.00232 **
## blocoIII -8.889e-01 3.316e-01 -2.681 0.00951 **
## blocoIV -1.056e+00 3.316e-01 -3.183 0.00232 **
## cultivarBR-300 -3.491e+00 6.375e-01 -5.476 9.39e-07 ***
## cultivarPioneer-B815 1.812e+00 6.639e-01 2.729 0.00837 **
## dose 4.336e-02 7.067e-03 6.136 7.68e-08 ***
## I(dose^2) -5.208e-05 2.261e-05 -2.303 0.02480 *
## cultivarBR-300:dose 5.132e-02 9.994e-03 5.135 3.32e-06 ***
## cultivarPioneer-B815:dose -2.371e-02 1.729e-02 -1.371 0.17547
## cultivarBR-300:I(dose^2) -1.401e-04 3.198e-05 -4.382 4.90e-05 ***
## cultivarPioneer-B815:I(dose^2) 2.709e-04 1.326e-04 2.042 0.04559 *
## ind:I(dose^3) -7.287e-07 2.861e-07 -2.548 0.01347 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.9947 on 59 degrees of freedom
## Multiple R-squared: 0.9342, Adjusted R-squared: 0.9208
## F-statistic: 69.82 on 12 and 59 DF, p-value: < 2.2e-16
## As mesmas conclusões são obtidas se olhar para o quadro de
## estimativas.
summary.lm(m4)$coeff
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.658929e+01 5.165296e-01 90.196732 8.911513e-66
## blocoII -1.055556e+00 3.464213e-01 -3.047028 3.433041e-03
## blocoIII -8.888889e-01 3.464213e-01 -2.565919 1.280581e-02
## blocoIV -1.055556e+00 3.464213e-01 -3.047028 3.433041e-03
## cultivarBR-300 -3.491071e+00 6.660330e-01 -5.241589 2.170142e-06
## cultivarPioneer-B815 1.339286e+00 6.660330e-01 2.010840 4.884237e-02
## cultivarAg-1002:dose 4.336310e-02 7.383254e-03 5.873169 1.999069e-07
## cultivarBR-300:dose 9.468750e-02 7.383254e-03 12.824631 7.687617e-19
## cultivarPioneer-B815:dose 5.559524e-02 7.383254e-03 7.529910 3.112663e-10
## cultivarAg-1002:I(dose^2) -5.208333e-05 2.362354e-05 -2.204722 3.131888e-02
## cultivarBR-300:I(dose^2) -1.922123e-04 2.362354e-05 -8.136474 2.867760e-11
## cultivarPioneer-B815:I(dose^2) -1.091270e-04 2.362354e-05 -4.619417 2.085883e-05
##-----------------------------------------------------------------------------
## Obter os valores preditos na média dos blocos.
pred <- with(da,
expand.grid(bloco=levels(bloco)[1],
cultivar=levels(cultivar),
dose=extendseq(dose)))
pred$ind <- as.integer(pred$cultivar=="Pioneer-B815")
str(pred)
## 'data.frame': 60 obs. of 4 variables:
## $ bloco : Factor w/ 1 level "I": 1 1 1 1 1 1 1 1 1 1 ...
## $ cultivar: Factor w/ 3 levels "Ag-1002","BR-300",..: 1 2 3 1 2 3 1 2 3 1 ...
## $ dose : num -30 -30 -30 -11.1 -11.1 ...
## $ ind : int 0 0 1 0 0 1 0 0 1 0 ...
## - attr(*, "out.attrs")=List of 2
## ..$ dim : Named int 1 3 20
## .. ..- attr(*, "names")= chr "bloco" "cultivar" "dose"
## ..$ dimnames:List of 3
## .. ..$ bloco : chr "bloco=I"
## .. ..$ cultivar: chr "cultivar=Ag-1002" "cultivar=BR-300" "cultivar=Pioneer-B815"
## .. ..$ dose : chr "dose=-30.000000" "dose=-11.052632" "dose= 7.894737" "dose= 26.842105" ...
pred <- equallevels(pred, da)
m2 <- m6
L <- model.matrix(formula(m2)[-2], data=pred)
head(L)
## (Intercept) blocoII blocoIII blocoIV cultivarBR-300 cultivarPioneer-B815 dose
## 1 1 0 0 0 0 0 -30.00000
## 2 1 0 0 0 1 0 -30.00000
## 3 1 0 0 0 0 1 -30.00000
## 4 1 0 0 0 0 0 -11.05263
## 5 1 0 0 0 1 0 -11.05263
## 6 1 0 0 0 0 1 -11.05263
## I(dose^2) cultivarBR-300:dose cultivarPioneer-B815:dose cultivarBR-300:I(dose^2)
## 1 900.0000 0.00000 0.00000 0.0000
## 2 900.0000 -30.00000 0.00000 900.0000
## 3 900.0000 0.00000 -30.00000 0.0000
## 4 122.1607 0.00000 0.00000 0.0000
## 5 122.1607 -11.05263 0.00000 122.1607
## 6 122.1607 0.00000 -11.05263 0.0000
## cultivarPioneer-B815:I(dose^2) ind:I(dose^3)
## 1 0.0000 0.000
## 2 0.0000 0.000
## 3 900.0000 -27000.000
## 4 0.0000 0.000
## 5 0.0000 0.000
## 6 122.1607 -1350.197
## Nas colunas de correspondem ao efeito dos blocos, colocar 0.25 (1/4).
m2$assign ## Coeficientes de bloco são indicados por 1.
## [1] 0 1 1 1 2 2 3 4 5 5 6 6 7
L[,m2$assign==1] <- L[,m2$assign==1]+0.25
head(L)
## (Intercept) blocoII blocoIII blocoIV cultivarBR-300 cultivarPioneer-B815 dose
## 1 1 0.25 0.25 0.25 0 0 -30.00000
## 2 1 0.25 0.25 0.25 1 0 -30.00000
## 3 1 0.25 0.25 0.25 0 1 -30.00000
## 4 1 0.25 0.25 0.25 0 0 -11.05263
## 5 1 0.25 0.25 0.25 1 0 -11.05263
## 6 1 0.25 0.25 0.25 0 1 -11.05263
## I(dose^2) cultivarBR-300:dose cultivarPioneer-B815:dose cultivarBR-300:I(dose^2)
## 1 900.0000 0.00000 0.00000 0.0000
## 2 900.0000 -30.00000 0.00000 900.0000
## 3 900.0000 0.00000 -30.00000 0.0000
## 4 122.1607 0.00000 0.00000 0.0000
## 5 122.1607 -11.05263 0.00000 122.1607
## 6 122.1607 0.00000 -11.05263 0.0000
## cultivarPioneer-B815:I(dose^2) ind:I(dose^3)
## 1 0.0000 0.000
## 2 0.0000 0.000
## 3 900.0000 -27000.000
## 4 0.0000 0.000
## 5 0.0000 0.000
## 6 122.1607 -1350.197
## Obter os ic com a glht.
ic <- confint(glht(m2, linfct=L), calpha=univariate_calpha())$confint
pred <- cbind(pred, ic)
p3 <- xyplot(Estimate~dose|cultivar, data=pred, type="l",
ly=pred$lwr, uy=pred$upr, cty="bands",
alpha=0.25, col=2, fill=2,
prepanel=prepanel.cbH,
panel=panel.cbH)
p1+as.layer(p2)+as.layer(p3)
## As bandas de confiança no efeito ponderado dos blocos são visualmente
## apelativas pois são mais precisas e passam entre os pontos.
##-----------------------------------------------------------------------------
## Dados de experimento com soja sob 3 níveis de umidade do solo (massa
## de água/massa de solo) e níveis de potássio fornecidos na adubação. A
## hipótese sob estudo é que presença de potássio dá suporte para a
## cultura superar a ocorrência de períodos sem chuva. Experimento
## conduzido em casa de vegetação com 5 blocos, 2 plantas por
## u.e. (vaso).
## Para acessar o artigo (pdf online).
## browseURL("http://www.scielo.br/pdf/rca/v43n2/a03v43n2.pdf")
da <- read.table("http://www.leg.ufpr.br/~walmes/data/soja.txt",
header=TRUE, sep="\t", dec=",")
names(da) <- substr(names(da), 1, 4)
str(da)
## 'data.frame': 75 obs. of 10 variables:
## $ pota: int 0 30 60 120 180 0 30 60 120 180 ...
## $ agua: num 37.5 37.5 37.5 37.5 37.5 50 50 50 50 50 ...
## $ bloc: Factor w/ 5 levels "I","II","III",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ reng: num 14.6 21.5 24.6 21.9 28.1 ...
## $ peso: num 10.7 13.5 15.8 12.8 14.8 ...
## $ kgra: num 15.1 17.1 19.1 18.1 19.1 ...
## $ pgra: num 1.18 0.99 0.82 0.85 0.88 1.05 1.08 0.74 1.01 1.01 ...
## $ ts : int 136 159 156 171 190 140 193 200 208 237 ...
## $ nvi : int 22 2 0 2 0 20 6 6 7 10 ...
## $ nv : int 56 62 66 68 82 63 86 94 86 97 ...
xyplot(reng~pota, groups=agua, data=da,
type=c("p","a"))
xyplot(reng~pota|agua, data=da,
type=c("p","a"))
##-----------------------------------------------------------------------------
## Ajuste do modelo.
da$A <- factor(da$agua)
da$K <- factor(da$pota)
## Ajuste.
m0 <- lm(reng~bloc+A*K, data=da)
par(mfrow=c(2,2)); plot(m0); layout(1)
## Remove obs 74 (uma planta que definou).
da <- da[-74,]
m0 <- update(m0, data=da)
par(mfrow=c(2,2)); plot(m0); layout(1)
## Quadro de anova.
anova(m0)
## Analysis of Variance Table
##
## Response: reng
## Df Sum Sq Mean Sq F value Pr(>F)
## bloc 4 100.39 25.10 4.8948 0.001896 **
## A 2 446.53 223.26 43.5456 4.617e-12 ***
## K 4 2592.13 648.03 126.3925 < 2.2e-16 ***
## A:K 8 286.00 35.75 6.9726 2.629e-06 ***
## Residuals 55 281.99 5.13
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Estimativas dos parâmentros (efeitos).
summary(m0)
##
## Call:
## lm(formula = reng ~ bloc + A * K, data = da)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.4674 -1.4230 0.3613 1.2828 5.3249
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 14.0727 1.1402 12.342 < 2e-16 ***
## blocII 1.0660 0.8268 1.289 0.202694
## blocIII -0.8607 0.8268 -1.041 0.302455
## blocIV -1.4433 0.8268 -1.746 0.086454 .
## blocV -1.5256 0.8451 -1.805 0.076508 .
## A50 2.1920 1.4321 1.531 0.131591
## A62.5 2.5700 1.4321 1.795 0.078215 .
## K30 6.8140 1.4321 4.758 1.46e-05 ***
## K60 10.4060 1.4321 7.266 1.38e-09 ***
## K120 11.7880 1.4321 8.231 3.67e-11 ***
## K180 11.8700 1.4321 8.289 2.96e-11 ***
## A50:K30 0.0440 2.0253 0.022 0.982746
## A62.5:K30 -1.9160 2.0253 -0.946 0.348263
## A50:K60 2.5740 2.0253 1.271 0.209099
## A62.5:K60 3.3320 2.0253 1.645 0.105630
## A50:K120 2.2860 2.0253 1.129 0.263907
## A62.5:K120 8.4613 2.0920 4.045 0.000165 ***
## A50:K180 1.1780 2.0253 0.582 0.563178
## A62.5:K180 9.1860 2.0253 4.536 3.15e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.264 on 55 degrees of freedom
## Multiple R-squared: 0.9239, Adjusted R-squared: 0.899
## F-statistic: 37.11 on 18 and 55 DF, p-value: < 2.2e-16
##-----------------------------------------------------------------------------
## Polinômio de segundo grau para o efeito de potássio.
## m1 <- lm(reng~bloc+A*(pota+I(pota^2)), data=da)
m1 <- update(m0, .~bloc+A*(pota+I(pota^2)))
par(mfrow=c(2,2)); plot(m1); layout(1)
## Testa o abandono dos termos (falta de ajuste).
anova(m0, m1)
## Analysis of Variance Table
##
## Model 1: reng ~ bloc + A * K
## Model 2: reng ~ bloc + A + pota + I(pota^2) + A:pota + A:I(pota^2)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 55 281.99
## 2 61 352.46 -6 -70.47 2.2907 0.04804 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(m1)
## Analysis of Variance Table
##
## Response: reng
## Df Sum Sq Mean Sq F value Pr(>F)
## bloc 4 100.39 25.10 4.3434 0.003718 **
## A 2 446.53 223.26 38.6399 1.443e-11 ***
## pota 1 1999.89 1999.89 346.1175 < 2.2e-16 ***
## I(pota^2) 1 555.07 555.07 96.0640 3.821e-14 ***
## A:pota 2 245.17 122.58 21.2152 1.013e-07 ***
## A:I(pota^2) 2 7.53 3.77 0.6516 0.524783
## Residuals 61 352.46 5.78
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Com b2 comum aos níveis de água.
## m2 <- lm(reng~bloc+A*pota+I(pota^2), data=da)
m2 <- update(m1, .~bloc+A*pota+I(pota^2))
anova(m2, m0)
## Analysis of Variance Table
##
## Model 1: reng ~ bloc + A + pota + I(pota^2) + A:pota
## Model 2: reng ~ bloc + A * K
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 63 359.99
## 2 55 281.99 8 78 1.9017 0.07823 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##-----------------------------------------------------------------------------
## Predição com bandas (considerando efeito de bloco I).
pred <- expand.grid(bloc="I",
A=levels(da$A),
pota=seq(0, 180, by=3))
aux <- predict(m2, newdata=pred, interval="confidence")
pred <- cbind(pred, aux)
str(pred)
## 'data.frame': 183 obs. of 6 variables:
## $ bloc: Factor w/ 1 level "I": 1 1 1 1 1 1 1 1 1 1 ...
## $ A : Factor w/ 3 levels "37.5","50","62.5": 1 2 3 1 2 3 1 2 3 1 ...
## $ pota: num 0 0 0 3 3 3 6 6 6 9 ...
## $ fit : num 14.4 17.2 15.9 15.1 17.9 ...
## $ lwr : num 12.4 15.2 13.9 13.1 15.9 ...
## $ upr : num 16.4 19.2 17.8 17 19.8 ...
## Melhorar a legenda.
tx <- paste("Umidade de ", levels(da$A), "%", sep="")
lgd <- simpleKey(columns=1, text=tx,
points=FALSE, lines=TRUE,
corner=c(0.03,0.97))
p1 <- xyplot(reng~pota, groups=A, data=da)
p2 <- xyplot(fit~pota, groups=A, data=pred,
type="l", key=lgd,
xlab=expression("Potássio no solo"~(mg~dm^{-3})),
ylab=expression("Rendimento de grãos"~(g~vaso^{-1})),
ly=pred$lwr, uy=pred$upr, cty="bands", alpha=0.1, fill=1,
prepanel=prepanel.cbH, panel.groups=panel.cbH,
panel=panel.superpose)
p1+as.layer(p2)
## Como calcular os pontos de máximo? São dados por x_max = -0.5*b1/b2.
##-----------------------------------------------------------------------------
## Testar se o rendimento sem potássio (0) é o mesmo para as águas.
X <- LSmatrix(m2, effect="A",
at=list("pota"=0, "I(pota^2)"=0))
rownames(X) <- levels(da$A)
X
## (Intercept) blocII blocIII blocIV blocV A50 A62.5 pota I(pota^2) A50:pota A62.5:pota
## 37.5 1 0.2 0.2 0.2 0.2 0 0 0 0 0 0
## 50 1 0.2 0.2 0.2 0.2 1 0 0 0 0 0
## 62.5 1 0.2 0.2 0.2 0.2 0 1 0 0 0 0
g <- glht(m2, linfct=X)
confint(g, calpha=univariate_calpha())
##
## Simultaneous Confidence Intervals
##
## Fit: lm(formula = reng ~ bloc + A + pota + I(pota^2) + A:pota, data = da)
##
## Quantile = 1.9983
## 95% confidence level
##
##
## Linear Hypotheses:
## Estimate lwr upr
## 37.5 == 0 13.8704 12.2268 15.5141
## 50 == 0 16.6523 15.0086 18.2959
## 62.5 == 0 15.3039 13.6621 16.9458
## Contrastes par a par.
Xc <- apc(X)
summary(glht(m2, linfct=Xc))
##
## Simultaneous Tests for General Linear Hypotheses
##
## Fit: lm(formula = reng ~ bloc + A + pota + I(pota^2) + A:pota, data = da)
##
## Linear Hypotheses:
## Estimate Std. Error t value Pr(>|t|)
## 37.5:0:0-50:0:0 == 0 -2.782 1.060 -2.625 0.0288 *
## 37.5:0:0-62.5:0:0 == 0 -1.433 1.060 -1.352 0.3721
## 50:0:0-62.5:0:0 == 0 1.348 1.060 1.272 0.4161
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- single-step method)
summary(glht(m2, linfct=Xc), test=Ftest())
##
## General Linear Hypotheses
##
## Linear Hypotheses:
## Estimate
## 37.5:0:0-50:0:0 == 0 -2.782
## 37.5:0:0-62.5:0:0 == 0 -1.433
## 50:0:0-62.5:0:0 == 0 1.348
##
## Global Test:
## F DF1 DF2 Pr(>F)
## 1 3.446 2 63 0.03799
## O teste simultâneo, intercepto comum.
formula(m1)
## reng ~ bloc + A + pota + I(pota^2) + A:pota + A:I(pota^2)
m3 <- update(m2, formula=.~.-A)
coef(m3)
## (Intercept) blocII blocIII blocIV blocV pota
## 15.8313206978 1.0660000000 -0.8606666667 -1.4433333333 -1.5406099373 0.2022515736
## I(pota^2) pota:A50 pota:A62.5
## -0.0008561129 0.0291812865 0.0742331466
anova(m3, m2)
## Analysis of Variance Table
##
## Model 1: reng ~ bloc + pota + I(pota^2) + A:pota
## Model 2: reng ~ bloc + A + pota + I(pota^2) + A:pota
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 65 399.38
## 2 63 359.99 2 39.384 3.4462 0.03799 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova(m2)
## Analysis of Variance Table
##
## Response: reng
## Df Sum Sq Mean Sq F value Pr(>F)
## bloc 4 100.39 25.10 4.392 0.003397 **
## A 2 446.53 223.26 39.072 9.223e-12 ***
## pota 1 1999.89 1999.89 349.988 < 2.2e-16 ***
## I(pota^2) 1 555.07 555.07 97.138 2.200e-14 ***
## A:pota 2 245.17 122.58 21.453 7.841e-08 ***
## Residuals 63 359.99 5.71
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##-----------------------------------------------------------------------------
## Coeficientes das equações. Mudar a formula do modelo para ter uma
## interpretação de parâmetros por estrato.
## Usar contraste tipo soma para blocos.
formula(m2)
## reng ~ bloc + A + pota + I(pota^2) + A:pota
m3 <- lm(reng~0+A/pota+I(pota^2)+bloc, data=da,
contrasts=list(bloc=contr.sum))
summary(m3)
##
## Call:
## lm(formula = reng ~ 0 + A/pota + I(pota^2) + bloc, data = da,
## contrasts = list(bloc = contr.sum))
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.7702 -1.4154 -0.0617 1.5246 5.1096
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## A37.5 1.387e+01 8.225e-01 16.864 < 2e-16 ***
## A50 1.665e+01 8.225e-01 20.246 < 2e-16 ***
## A62.5 1.530e+01 8.216e-01 18.627 < 2e-16 ***
## I(pota^2) -8.561e-04 8.602e-05 -9.952 1.51e-14 ***
## bloc1 5.557e-01 5.531e-01 1.005 0.31890
## bloc2 1.622e+00 5.531e-01 2.932 0.00469 **
## bloc3 -3.050e-01 5.531e-01 -0.551 0.58331
## bloc4 -8.876e-01 5.531e-01 -1.605 0.11353
## A37.5:pota 2.129e-01 1.732e-02 12.293 < 2e-16 ***
## A50:pota 2.210e-01 1.732e-02 12.757 < 2e-16 ***
## A62.5:pota 2.763e-01 1.748e-02 15.810 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.39 on 63 degrees of freedom
## Multiple R-squared: 0.9927, Adjusted R-squared: 0.9914
## F-statistic: 778.4 on 11 and 63 DF, p-value: < 2.2e-16
## Prova de que são o mesmo modelo.
deviance(m3); deviance(m2)
## [1] 359.9933
## [1] 359.9933
## O R² é o quadrado da correlação entre observado e predito.
cor(da$reng, fitted(m2))^2
## [1] 0.9028891
## R² separado por água.
ddply(data.frame(o=da$reng, f=fitted(m2)), .(da$A),
summarise, R2=cor(o, f)^2)
## da$A R2
## 1 37.5 0.7851939
## 2 50 0.8522193
## 3 62.5 0.9457677
##-----------------------------------------------------------------------------
## Os pontos de máximo.
## Buscas essas ocorrências de texto.
oc <- paste0("^A", levels(da$A), ":")
## Estimativas e suas posições de ordem de efeito.
c3 <- coef(m3)
a <- m3$assign
cbind(c3, a)
## c3 a
## A37.5 13.8704427563 1
## A50 16.6522875839 1
## A62.5 15.3039401494 1
## I(pota^2) -0.0008561256 2
## bloc1 0.5556840320 3
## bloc2 1.6216840320 3
## bloc3 -0.3049826347 3
## bloc4 -0.8876493013 3
## A37.5:pota 0.2129359777 4
## A50:pota 0.2209687363 4
## A62.5:pota 0.2762725227 4
## Estimativas do ponto de máximo.
ptmax <- -0.5*c3[a==4]/c3[a==2]
xyplot(fit~pota, groups=A, data=pred,
type="l", key=lgd,
xlab=expression("Potássio no solo"~(mg~dm^{-3})),
ylab=expression("Rendimento de grãos"~(g~vaso^{-1})),
ly=pred$lwr, uy=pred$upr, cty="bands", alpha=0.1, fill=1,
prepanel=prepanel.cbH,
panel.groups=panel.cbH,
panel=panel.superpose)+
layer(
panel.abline(v=ptmax, lty=2))
##-----------------------------------------------------------------------------
## E se ajustar um modelo linear-platô? E se for um quadrático-platô?
##-----------------------------------------------------------------------------
## Dados.
da <- read.table("http://www.leg.ufpr.br/~walmes/data/algodão.txt",
header=TRUE, sep="\t", encoding="latin1")
da$desf <- da$desf/100
levels(da$estag) <- c("Vegetativo", "Botão floral",
"Florescimento", "Maçã", "Capulho")
str(da)
## 'data.frame': 125 obs. of 8 variables:
## $ estag : Factor w/ 5 levels "Vegetativo","Botão floral",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ desf : num 0 0 0 0 0 0.25 0.25 0.25 0.25 0.25 ...
## $ rep : int 1 2 3 4 5 1 2 3 4 5 ...
## $ pcapu : num 33.2 28.7 31.5 28.9 36.4 ...
## $ nnos : int 32 29 29 27 28 30 33 23 29 26 ...
## $ alt : num 151 146 140 155 150 ...
## $ ncapu : int 10 9 8 8 10 11 9 10 10 10 ...
## $ nestru: int 10 9 8 9 10 11 9 11 10 10 ...
xyplot(pcapu~desf|estag, data=da, type=c("p","smooth"),
xlab="Nível de desfolha artificial",
ylab="Peso de capulhos produzidos (g)")
##-----------------------------------------------------------------------------
## Lendo arquivos de dados.
## Url de um arquivo com dados.
url <- "http://www.leg.ufpr.br/~walmes/data/ancova.txt"
## Importa os dados a partir do arquivo na web.
da <- read.table(file=url, header=TRUE, sep="\t")
## Trunca os nomes para 4 digitos.
names(da) <- substr(names(da), 1, 4)
## Mostra a estrutura do objeto.
str(da)
## 'data.frame': 72 obs. of 8 variables:
## $ ener: Factor w/ 3 levels "alto","baixo",..: 2 2 2 2 2 2 2 2 3 3 ...
## $ sexo: Factor w/ 3 levels "F","MC","MI": 2 2 2 2 2 2 2 2 2 2 ...
## $ rep : int 1 2 3 4 5 6 7 8 1 2 ...
## $ pi : num 93.3 94 91.6 89.3 91.5 93 88.8 93.7 93.9 88.5 ...
## $ id : int 134 137 133 133 144 147 138 142 134 137 ...
## $ pviv: num 127 125 126 119 122 ...
## $ rend: num 82.3 83.1 80.7 82.7 82.9 ...
## $ peso: num 127 125 126 119 122 ...
## Dados de experimento com nutrição de suínos. Animais foram pesados
## antes do experimento e tinham idade conhecida. Essas variáveis
## contínuas foram usadas para explicar/corrigir parte da variação
## presente e melhor comparar os níveis de energia na ração fornecidos.
\[ \begin{aligned} Y|\text{fontes de variação} &\,\sim \text{Normal}(\mu_{ij}, \sigma^2) \newline \mu_{ij} &= \mu+\alpha_i+\tau_j+\gamma_{ij} \end{aligned} \]
em que \(\alpha\) é o efeito dos níveis de sexo \(i\), \(\tau_j\) o efeito dos níveis de energia (Kcal) na dieta \(j\), \(gamma_{ij}\) representa a interação . \(\mu\) é a média de \(Y\) na ausência do efeito dos termos mencioandos. \(\mu_{ij}\) é a média para as observações na combinação \(ij\) e \(\sigma^2\) é a variância das observações ao redor desse valor médio. No modelo de análise de covariância, os valores de peso inicial e idade serão usados para explicar parte da variação ao final do experimento. Sendo assim, o modelo considerando o efeito dessas variáveis é representado por
\[ \begin{aligned} Y|\text{fontes de variação} &\,\sim \text{Normal}(\mu+\beta_1 x+\beta_2 z+\mu_{ij}, \sigma^2) \newline \mu_{ij} &= \alpha_i+\tau_j+\gamma_{ij} \end{aligned} \]
em que \(\beta_1\) representa o efeito da covariável peso (\(x\)) expresso por um coeficiente angular e \(\beta_2\) o mesmo para o efeito da covariável idade inicial (\(z\)).
##-----------------------------------------------------------------------------
## Especificação dos modelos.
## Só com as fontes de variação de interesse.
m0 <- lm(peso~sexo*ener, data=da)
anova(m0)
## Analysis of Variance Table
##
## Response: peso
## Df Sum Sq Mean Sq F value Pr(>F)
## sexo 2 199.81 99.903 3.6153 0.03263 *
## ener 2 55.84 27.921 1.0104 0.36990
## sexo:ener 4 35.38 8.846 0.3201 0.86348
## Residuals 63 1740.92 27.634
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Análise de variância (em experimentos não ortogonais a ordem dos
## termos é importante!).
m1 <- lm(peso~pi+id+sexo*ener, data=da)
anova(m1)
## Analysis of Variance Table
##
## Response: peso
## Df Sum Sq Mean Sq F value Pr(>F)
## pi 1 595.58 595.58 32.1128 4.209e-07 ***
## id 1 47.23 47.23 2.5464 0.11571
## sexo 2 156.97 78.48 4.2318 0.01901 *
## ener 2 66.46 33.23 1.7918 0.17531
## sexo:ener 4 34.38 8.59 0.4634 0.76228
## Residuals 61 1131.33 18.55
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Troca ordem de entrada apenas por curiosidade.
m1 <- lm(peso~id+pi+sexo*ener, data=da)
anova(m1)
## Analysis of Variance Table
##
## Response: peso
## Df Sum Sq Mean Sq F value Pr(>F)
## id 1 5.17 5.17 0.2789 0.59937
## pi 1 637.63 637.63 34.3803 1.98e-07 ***
## sexo 2 156.97 78.48 4.2318 0.01901 *
## ener 2 66.46 33.23 1.7918 0.17531
## sexo:ener 4 34.38 8.59 0.4634 0.76228
## Residuals 61 1131.33 18.55
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Testa o poder de explicação dos "blocos" contínuos, termos extras.
anova(m0, m1)
## Analysis of Variance Table
##
## Model 1: peso ~ sexo * ener
## Model 2: peso ~ id + pi + sexo * ener
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 63 1740.9
## 2 61 1131.3 2 609.59 16.434 1.953e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##-----------------------------------------------------------------------------
## Avaliação dos pressupostos.
par(mfrow=c(2,2)); plot(m1); layout(1)
## Medidas de influência para as observações.
im <- influence.measures(m1)
summary(im)
## Potentially influential observations of
## lm(formula = peso ~ id + pi + sexo * ener, data = da) :
##
## dfb.1_ dfb.id dfb.pi dfb.sxMC dfb.sxMI dfb.enrb dfb.enrm dfb.sxMC:nrb dfb.sxMI:nrb
## 25 -0.60 -0.42 0.95 -0.04 0.00 -0.02 0.02 0.05 0.68
## 37 -0.20 0.96 -0.43 0.07 0.00 0.01 -0.04 -0.04 0.09
## 46 0.40 -0.57 -0.05 -0.04 -0.82 0.00 0.02 0.01 0.53
## 48 0.28 0.30 -0.52 0.03 0.81 0.01 -0.01 -0.03 -0.54
## dfb.sxMC:nrm dfb.sxMI:nrm dffit cov.r cook.d hat
## 25 -0.01 -0.06 1.76_* 0.15_* 0.23 0.18
## 37 0.12 -0.43 -1.48_* 0.44_* 0.18 0.23
## 46 -0.09 0.51 -1.30_* 0.30_* 0.14 0.16
## 48 0.02 -0.53 1.27 0.31_* 0.13 0.15
r <- which(im$is.inf[,"dffit"])
m2 <- lm(peso~id+pi+sexo*ener, data=da[-r,])
anova(m2)
## Analysis of Variance Table
##
## Response: peso
## Df Sum Sq Mean Sq F value Pr(>F)
## id 1 0.40 0.40 0.0341 0.854171
## pi 1 459.25 459.25 39.3607 4.8e-08 ***
## sexo 2 177.89 88.94 7.6230 0.001150 **
## ener 2 144.97 72.49 6.2125 0.003592 **
## sexo:ener 4 66.83 16.71 1.4319 0.234964
## Residuals 58 676.73 11.67
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
par(mfrow=c(2,2)); plot(m2); layout(1)
##-----------------------------------------------------------------------------
## Comparações múltiplas para o desdobramento.
LSmeans(m2, effect=c("sexo","ener"))
## estimate se df t.stat p.value sexo ener id pi
## 1 126.9699 1.211308 58 104.82046 8.066598e-68 F alto 138.0145 92.0087
## 2 124.9146 1.209095 58 103.31250 1.861161e-67 MC alto 138.0145 92.0087
## 3 129.7600 1.291111 58 100.50258 9.132251e-67 MI alto 138.0145 92.0087
## 4 122.7648 1.211616 58 101.32318 5.713283e-67 F baixo 138.0145 92.0087
## 5 124.0100 1.208737 58 102.59473 2.782637e-67 MC baixo 138.0145 92.0087
## 6 124.5507 1.293884 58 96.26108 1.097349e-65 MI baixo 138.0145 92.0087
## 7 125.6840 1.219403 58 103.07010 2.131268e-67 F medio 138.0145 92.0087
## 8 123.9038 1.251383 58 99.01350 2.159913e-66 MC medio 138.0145 92.0087
## 9 130.0355 1.291530 58 100.68331 8.233295e-67 MI medio 138.0145 92.0087
LSmeans(m2, effect=c("sexo"))
## estimate se df t.stat p.value sexo id pi
## 1 125.1396 0.7071868 58 176.9540 5.740376e-81 F 138.0145 92.0087
## 2 124.2761 0.7048357 58 176.3193 7.067888e-81 MC 138.0145 92.0087
## 3 128.1154 0.7456101 58 171.8262 3.149698e-80 MI 138.0145 92.0087
LSmeans(m2, effect=c("ener"))
## estimate se df t.stat p.value ener id pi
## 1 127.2148 0.7141424 58 178.1365 3.903753e-81 alto 138.0145 92.0087
## 2 123.7752 0.7138463 58 173.3919 1.863060e-80 baixo 138.0145 92.0087
## 3 126.5411 0.7149777 58 176.9861 5.680494e-81 medio 138.0145 92.0087
Xc <- LSmatrix(m2, effect=c("sexo"))
rownames(X) <- levels(da$sexo)
ps <- apmc(X, model=m2, focus="sexo", test="fdr")
ps
## sexo estimate lwr upr cld
## 1 F 40.85947 4.41751429 77.30142 a
## 2 MC 36.65442 0.09577609 73.21306 a
## 3 MI 39.57363 2.99722792 76.15004 a
X <- LSmatrix(m2, effect=c("ener"))
rownames(X) <- levels(da$ener)
pe <- apmc(X, model=m2, focus="ener", test="fdr")
pe$ener <- factor(pe$ener, levels=c("alto","medio","baixo"),
labels=c("Alto","Médio","Baixo"))
pe <- arrange(pe, ener)
pe
## ener estimate lwr upr cld
## 1 Alto 127.2148 125.7853 128.6443 a
## 2 Médio 126.5411 125.1099 127.9723 a
## 3 Baixo 123.7752 122.3462 125.2041 b
## names(ps)[1] <- names(pe)[1] <- "nivel"
## p0 <- cbind(rbind(ps, pe), fator=rep(c("sexo","ener"), each=3))
## dput(levels(p0$nivel))
## str(p0)
##-----------------------------------------------------------------------------
## Representação gráfica dos resultados.
xlab <- expression("Peso aos 28 dias"~(kg))
sub <- list(
"Médias seguidas de mesma letra indicam diferença nula à 5%.",
font=1, cex=0.8)
p1 <-
segplot(sexo~lwr+upr, centers=estimate,
data=ps, draw=FALSE,
ylab="Nível de sexo", xlab=xlab, sub=sub,
letras=sprintf("%0.2f %s", ps$estimate, ps$cld),
panel=function(x, y, z, subscripts, centers, letras, ...){
panel.segplot(x=x, y=y, z=z, centers=centers,
subscripts=subscripts, ...)
panel.text(y=as.numeric(z)[subscripts],
x=centers[subscripts],
label=letras[subscripts], pos=3)
})
p2 <-
segplot(ener~lwr+upr, centers=estimate,
data=pe, draw=FALSE,
ylab="Nível de energia da dieta", xlab=xlab, sub=sub,
letras=sprintf("%0.2f %s", pe$estimate, pe$cld),
panel=function(x, y, z, subscripts, centers, letras, ...){
panel.segplot(x=x, y=y, z=z, centers=centers,
subscripts=subscripts, ...)
panel.text(y=as.numeric(z)[subscripts],
x=centers[subscripts],
label=letras[subscripts], pos=3)
})
## Gráfico final.
plot(p1, split=c(1,1,2,1), more=TRUE)
plot(p2, split=c(2,1,2,1), more=FALSE)
##-----------------------------------------------------------------------------
## Como fica o resultado sem usar as covariáveis?
mean(da$pi); mean(da$id)
## [1] 92.11667
## [1] 137.8889
X <- LSmatrix(m0, effect=c("sexo"), at=list(pi=92, id=138))
rownames(X) <- levels(da$sexo)
ps0 <- apmc(X, model=m0, focus="sexo", test="fdr")
ps0
## sexo estimate lwr upr cld
## 1 F 125.1167 122.9724 127.2610 ab
## 2 MC 124.3250 122.1807 126.4693 b
## 3 MI 128.1875 126.0432 130.3318 a
X <- LSmatrix(m1, effect=c("sexo"), at=list(pi=92, id=138))
rownames(X) <- levels(da$sexo)
ps1 <- apmc(X, model=m1, focus="sexo", test="fdr")
ps1
## sexo estimate lwr upr cld
## 1 F 125.1306 123.3506 126.9106 ab
## 2 MC 124.2653 122.4914 126.0392 b
## 3 MI 127.7405 125.9733 129.5076 a
X <- LSmatrix(m2, effect=c("sexo"), at=list(pi=92, id=138))
rownames(X) <- levels(da$sexo)
ps2 <- apmc(X, model=m2, focus="sexo", test="fdr")
ps2
## sexo estimate lwr upr cld
## 1 F 125.1316 123.7156 126.5476 b
## 2 MC 124.2682 122.8576 125.6787 b
## 3 MI 128.1074 126.6150 129.5999 a
ps0$model <- "0"; ps1$model <- "1"; ps2$model <- "2"
ps <- rbind(ps0, ps1, ps2)
ps$model <- factor(ps$model)
str(ps)
## 'data.frame': 9 obs. of 6 variables:
## $ sexo : Factor w/ 3 levels "F","MC","MI": 1 2 3 1 2 3 1 2 3
## $ estimate: num 125 124 128 125 124 ...
## $ lwr : num 123 122 126 123 122 ...
## $ upr : num 127 126 130 127 126 ...
## $ cld : chr "ab" "b" "a" "ab" ...
## $ model : Factor w/ 3 levels "0","1","2": 1 1 1 2 2 2 3 3 3
l <- c("Fatorial", "Ancova", "Limpo")
key <- list(title="Modelo", cex.title=1.1,
corner=c(0.05,0.95), type="o", divide=1,
text=list(l), lines=list(pch=1:length(l)))
segplot(sexo~lwr+upr, centers=estimate,
data=ps, groups=model, draw=FALSE,
ylab="Nível de sexo", xlab=xlab, sub=sub, key=key,
panel=panel.segplotBy, f=0.075, pch=as.integer(ps$model))
http://www.leg.ufpr.br/~walmes/analises/MESerafim/maracuja/
##-----------------------------------------------------------------------------
## Ler tabela de dados.
da <- read.table("http://www.leg.ufpr.br/~walmes/data/maracuja_planta.txt",
header=TRUE, sep="\t")
da$bloc <- factor(da$bloc)
str(da)
## 'data.frame': 168 obs. of 9 variables:
## $ agreg: Factor w/ 2 levels "[0,2]","[4,10]": 2 2 2 2 2 2 2 2 2 2 ...
## $ fam : Factor w/ 2 levels "F29","F48": 1 1 1 1 1 1 1 1 1 1 ...
## $ cinz : num 0 0 0 0 0 0 1.5 1.5 1.5 1.5 ...
## $ bloc : Factor w/ 3 levels "1","2","3": 1 1 2 2 3 3 1 1 2 2 ...
## $ rept : int 1 2 1 2 1 2 1 2 1 2 ...
## $ mfpa : num 43.5 43.7 31.8 23.4 36.4 ...
## $ mspa : num 11.1 11.13 8.24 5.39 9.04 ...
## $ ds : num 1.24 1.25 1.23 1.23 1.27 1.18 1.27 1.28 1.01 1.19 ...
## $ cav : num 6470 7260 9446 9046 8468 ...
u <- unique(da$cinz)
cbind(u, u/1.5, sqrt(u/1.5), log(u/1.5, base=2))
## u
## [1,] 0.0 0 0.000000 -Inf
## [2,] 1.5 1 1.000000 0
## [3,] 3.0 2 1.414214 1
## [4,] 6.0 4 2.000000 2
## [5,] 12.0 8 2.828427 3
## [6,] 24.0 16 4.000000 4
## [7,] 48.0 32 5.656854 5
## Doses de cinza em uma escala com distância mais regular entre níveis.
da$cin <- sqrt(da$cinz/1.5)
##-----------------------------------------------------------------------------
## Ver.
p1 <- xyplot(mfpa~cin|fam, groups=agreg, data=da, type=c("p","smooth"),
auto.key=list(columns=2))
p2 <- xyplot(mspa~cin|fam, groups=agreg, data=da, type=c("p","smooth"),
auto.key=list(columns=2))
p3 <- xyplot(ds~cin|fam, groups=agreg, data=da, type=c("p","smooth"),
auto.key=list(columns=2))
p4 <- xyplot(cav~cin|fam, groups=agreg, data=da, type=c("p","smooth"),
auto.key=list(columns=2))
grid.arrange(p1, p2, nrow=2)
grid.arrange(p3, p4, nrow=2)
##-----------------------------------------------------------------------------
## Especificação e ajuste dos modelos em batelada.
resp <- c("mfpa", "mspa", "ds", "cav")
form0 <- lapply(paste(resp, "~bloc+fam*agreg*(cinz+I(cinz^2))"),
as.formula)
names(form0) <- resp
## Ajustes.
m0 <- lapply(form0, lm, data=da)
##-----------------------------------------------------------------------------
## Quadros de anova.
lapply(m0, anova)
## $mfpa
## Analysis of Variance Table
##
## Response: mfpa
## Df Sum Sq Mean Sq F value Pr(>F)
## bloc 2 2103.5 1051.8 6.5549 0.001853 **
## fam 1 88.7 88.7 0.5525 0.458424
## agreg 1 4129.9 4129.9 25.7388 1.111e-06 ***
## cinz 1 1848.3 1848.3 11.5191 0.000876 ***
## I(cinz^2) 1 426.3 426.3 2.6569 0.105148
## fam:agreg 1 257.8 257.8 1.6065 0.206896
## fam:cinz 1 431.2 431.2 2.6872 0.103198
## fam:I(cinz^2) 1 559.1 559.1 3.4847 0.063841 .
## agreg:cinz 1 839.9 839.9 5.2348 0.023500 *
## agreg:I(cinz^2) 1 26.5 26.5 0.1654 0.684839
## fam:agreg:cinz 1 252.3 252.3 1.5726 0.211733
## fam:agreg:I(cinz^2) 1 122.8 122.8 0.7652 0.383074
## Residuals 154 24710.0 160.5
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## $mspa
## Analysis of Variance Table
##
## Response: mspa
## Df Sum Sq Mean Sq F value Pr(>F)
## bloc 2 86.24 43.121 5.2662 0.006134 **
## fam 1 0.32 0.315 0.0385 0.844648
## agreg 1 80.26 80.261 9.8020 0.002086 **
## cinz 1 61.76 61.758 7.5423 0.006745 **
## I(cinz^2) 1 4.97 4.970 0.6069 0.437143
## fam:agreg 1 1.24 1.245 0.1520 0.697172
## fam:cinz 1 20.51 20.512 2.5051 0.115529
## fam:I(cinz^2) 1 21.27 21.272 2.5979 0.109053
## agreg:cinz 1 63.03 63.027 7.6973 0.006215 **
## agreg:I(cinz^2) 1 13.61 13.609 1.6620 0.199267
## fam:agreg:cinz 1 11.24 11.240 1.3728 0.243147
## fam:agreg:I(cinz^2) 1 7.39 7.387 0.9021 0.343697
## Residuals 154 1260.98 8.188
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## $ds
## Analysis of Variance Table
##
## Response: ds
## Df Sum Sq Mean Sq F value Pr(>F)
## bloc 2 0.04405 0.02203 5.0632 0.0074192 **
## fam 1 0.05306 0.05306 12.1962 0.0006252 ***
## agreg 1 0.02394 0.02394 5.5037 0.0202505 *
## cinz 1 0.81520 0.81520 187.3804 < 2.2e-16 ***
## I(cinz^2) 1 0.08952 0.08952 20.5770 1.146e-05 ***
## fam:agreg 1 0.01259 0.01259 2.8940 0.0909284 .
## fam:cinz 1 0.03576 0.03576 8.2192 0.0047257 **
## fam:I(cinz^2) 1 0.03236 0.03236 7.4382 0.0071268 **
## agreg:cinz 1 0.02580 0.02580 5.9314 0.0160155 *
## agreg:I(cinz^2) 1 0.01699 0.01699 3.9060 0.0499013 *
## fam:agreg:cinz 1 0.00661 0.00661 1.5188 0.2196819
## fam:agreg:I(cinz^2) 1 0.00008 0.00008 0.0187 0.8914281
## Residuals 154 0.66998 0.00435
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## $cav
## Analysis of Variance Table
##
## Response: cav
## Df Sum Sq Mean Sq F value Pr(>F)
## bloc 2 4704295 2352148 1.5448 0.2166456
## fam 1 12968149 12968149 8.5169 0.0040462 **
## agreg 1 270606640 270606640 177.7222 < 2.2e-16 ***
## cinz 1 550533 550533 0.3616 0.5485225
## I(cinz^2) 1 2360352 2360352 1.5502 0.2150012
## fam:agreg 1 4240215 4240215 2.7848 0.0971955 .
## fam:cinz 1 581539 581539 0.3819 0.5374858
## fam:I(cinz^2) 1 14011881 14011881 9.2024 0.0028376 **
## agreg:cinz 1 2821636 2821636 1.8531 0.1754091
## agreg:I(cinz^2) 1 13641 13641 0.0090 0.9247148
## fam:agreg:cinz 1 19103685 19103685 12.5464 0.0005256 ***
## fam:agreg:I(cinz^2) 1 291877 291877 0.1917 0.6621261
## Residuals 154 234486288 1522638
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##-----------------------------------------------------------------------------
## Quadro de estimativas dos efeitos.
lapply(m0, summary)
## $mfpa
##
## Call:
## FUN(formula = X[[1L]], data = ..1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -33.074 -8.108 1.068 7.509 32.862
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 39.947583 3.468766 11.516 < 2e-16 ***
## bloc2 -2.623214 2.393848 -1.096 0.274871
## bloc3 -8.465893 2.393848 -3.537 0.000536 ***
## famF48 8.487977 4.499371 1.886 0.061113 .
## agreg[4,10] -0.716554 4.499371 -0.159 0.873676
## cinz 1.212067 0.464685 2.608 0.009993 **
## I(cinz^2) -0.018792 0.009479 -1.982 0.049212 *
## famF48:agreg[4,10] -12.400527 6.363071 -1.949 0.053133 .
## famF48:cinz -1.182186 0.657164 -1.799 0.073989 .
## famF48:I(cinz^2) 0.025987 0.013406 1.939 0.054389 .
## agreg[4,10]:cinz -0.642157 0.657164 -0.977 0.330020
## agreg[4,10]:I(cinz^2) 0.004437 0.013406 0.331 0.741092
## famF48:agreg[4,10]:cinz 1.090510 0.929370 1.173 0.242452
## famF48:agreg[4,10]:I(cinz^2) -0.016584 0.018958 -0.875 0.383074
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 12.67 on 154 degrees of freedom
## Multiple R-squared: 0.3097, Adjusted R-squared: 0.2514
## F-statistic: 5.315 on 13 and 154 DF, p-value: 7.802e-08
##
##
## $mspa
##
## Call:
## FUN(formula = X[[2L]], data = ..1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7.3162 -1.8967 0.2143 2.0662 6.9304
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.3129949 0.7835985 11.885 < 2e-16 ***
## bloc2 -0.2450000 0.5407732 -0.453 0.65115
## bloc3 -1.6275000 0.5407732 -3.010 0.00306 **
## famF48 1.0284923 1.0164134 1.012 0.31318
## agreg[4,10] 0.1132211 1.0164134 0.111 0.91145
## cinz 0.1743295 0.1049729 1.661 0.09881 .
## I(cinz^2) -0.0021965 0.0021414 -1.026 0.30662
## famF48:agreg[4,10] -2.0292102 1.4374256 -1.412 0.16006
## famF48:cinz -0.2481261 0.1484541 -1.671 0.09667 .
## famF48:I(cinz^2) 0.0054853 0.0030283 1.811 0.07204 .
## agreg[4,10]:cinz -0.0744156 0.1484541 -0.501 0.61690
## agreg[4,10]:I(cinz^2) -0.0007267 0.0030283 -0.240 0.81067
## famF48:agreg[4,10]:cinz 0.2570117 0.2099458 1.224 0.22275
## famF48:agreg[4,10]:I(cinz^2) -0.0040678 0.0042827 -0.950 0.34370
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.862 on 154 degrees of freedom
## Multiple R-squared: 0.2277, Adjusted R-squared: 0.1625
## F-statistic: 3.493 on 13 and 154 DF, p-value: 8.922e-05
##
##
## $ds
##
## Call:
## FUN(formula = X[[3L]], data = ..1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.271875 -0.030538 0.003811 0.033212 0.179064
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.264e+00 1.806e-02 69.958 < 2e-16 ***
## bloc2 -2.099e-02 1.246e-02 -1.684 0.09417 .
## bloc3 1.865e-02 1.246e-02 1.496 0.13666
## famF48 4.518e-02 2.343e-02 1.929 0.05562 .
## agreg[4,10] -3.503e-02 2.343e-02 -1.495 0.13695
## cinz -8.080e-03 2.420e-03 -3.339 0.00105 **
## I(cinz^2) 9.004e-05 4.936e-05 1.824 0.07005 .
## famF48:agreg[4,10] -5.847e-02 3.313e-02 -1.765 0.07960 .
## famF48:cinz -9.292e-03 3.422e-03 -2.715 0.00738 **
## famF48:I(cinz^2) 1.414e-04 6.980e-05 2.025 0.04458 *
## agreg[4,10]:cinz 5.060e-03 3.422e-03 1.479 0.14130
## agreg[4,10]:I(cinz^2) -9.080e-05 6.980e-05 -1.301 0.19527
## famF48:agreg[4,10]:cinz 2.205e-03 4.839e-03 0.456 0.64933
## famF48:agreg[4,10]:I(cinz^2) -1.350e-05 9.872e-05 -0.137 0.89143
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.06596 on 154 degrees of freedom
## Multiple R-squared: 0.6331, Adjusted R-squared: 0.6021
## F-statistic: 20.44 on 13 and 154 DF, p-value: < 2.2e-16
##
##
## $cav
##
## Call:
## FUN(formula = X[[4L]], data = ..1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2658.0 -767.1 -123.3 800.8 3245.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6018.4385 337.9074 17.811 < 2e-16 ***
## bloc2 -10.1964 233.1951 -0.044 0.96518
## bloc3 349.7679 233.1951 1.500 0.13569
## famF48 -1070.2391 438.3031 -2.442 0.01575 *
## agreg[4,10] 1370.2799 438.3031 3.126 0.00212 **
## cinz -130.1812 45.2670 -2.876 0.00460 **
## I(cinz^2) 2.1339 0.9234 2.311 0.02217 *
## famF48:agreg[4,10] 1934.0225 619.8542 3.120 0.00216 **
## famF48:cinz 201.0797 64.0171 3.141 0.00202 **
## famF48:I(cinz^2) -3.2055 1.3059 -2.455 0.01522 *
## agreg[4,10]:cinz 73.2835 64.0171 1.145 0.25409
## agreg[4,10]:I(cinz^2) -0.3169 1.3059 -0.243 0.80859
## famF48:agreg[4,10]:cinz -122.4676 90.5339 -1.353 0.17813
## famF48:agreg[4,10]:I(cinz^2) 0.8086 1.8468 0.438 0.66213
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1234 on 154 degrees of freedom
## Multiple R-squared: 0.5863, Adjusted R-squared: 0.5513
## F-statistic: 16.79 on 13 and 154 DF, p-value: < 2.2e-16
##-----------------------------------------------------------------------------
## Avaliação dos pressupostos.
par(mfrow=c(2,2)); plot(m0[["mfpa"]]); layout(1) ## ok!
par(mfrow=c(2,2)); plot(m0[["mspa"]]); layout(1) ## ok!
par(mfrow=c(2,2)); plot(m0[["ds"]]); layout(1) ## bom.
par(mfrow=c(2,2)); plot(m0[["cav"]]); layout(1) ## ok!
## par(mfrow=c(2,2))
## lapply(m0, plot, which=1)
## layout(1)
## par(mfrow=c(2,2))
## lapply(m0, plot, which=2)
## layout(1)
## par(mfrow=c(2,2))
## lapply(m0, plot, which=3)
## layout(1)
##-----------------------------------------------------------------------------
## Modelos após abandono de termos não significativos.
form1 <- list(mfpa=mfpa~bloc+agreg*cinz,
mspa=mspa~bloc+agreg*cinz,
ds=ds~bloc+(fam+agreg+cinz)^3+(fam+agreg)*I(cinz^2),
cav=cav~bloc+fam*agreg*(cinz+I(cinz^2)))
m1 <- lapply(form1, lm, data=da, contrast=list(bloc=contr.sum))
lapply(m1, anova)
## $mfpa
## Analysis of Variance Table
##
## Response: mfpa
## Df Sum Sq Mean Sq F value Pr(>F)
## bloc 2 2103.5 1051.8 6.3401 0.002234 **
## agreg 1 4129.9 4129.9 24.8950 1.548e-06 ***
## cinz 1 1848.3 1848.3 11.1414 0.001047 **
## agreg:cinz 1 839.9 839.9 5.0632 0.025786 *
## Residuals 162 26874.6 165.9
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## $mspa
## Analysis of Variance Table
##
## Response: mspa
## Df Sum Sq Mean Sq F value Pr(>F)
## bloc 2 86.24 43.121 5.2072 0.006431 **
## agreg 1 80.26 80.261 9.6921 0.002188 **
## cinz 1 61.76 61.758 7.4577 0.007016 **
## agreg:cinz 1 63.03 63.027 7.6110 0.006469 **
## Residuals 162 1341.53 8.281
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## $ds
## Analysis of Variance Table
##
## Response: ds
## Df Sum Sq Mean Sq F value Pr(>F)
## bloc 2 0.04405 0.02203 5.0955 0.0071909 **
## fam 1 0.05306 0.05306 12.2739 0.0006005 ***
## agreg 1 0.02394 0.02394 5.5388 0.0198546 *
## cinz 1 0.81520 0.81520 188.5742 < 2.2e-16 ***
## I(cinz^2) 1 0.08952 0.08952 20.7081 1.074e-05 ***
## fam:agreg 1 0.01259 0.01259 2.9124 0.0899018 .
## fam:cinz 1 0.03576 0.03576 8.2716 0.0045943 **
## agreg:cinz 1 0.02580 0.02580 5.9691 0.0156812 *
## fam:I(cinz^2) 1 0.03236 0.03236 7.4856 0.0069454 **
## agreg:I(cinz^2) 1 0.01699 0.01699 3.9308 0.0491754 *
## fam:agreg:cinz 1 0.00661 0.00661 1.5285 0.2182139
## Residuals 155 0.67006 0.00432
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## $cav
## Analysis of Variance Table
##
## Response: cav
## Df Sum Sq Mean Sq F value Pr(>F)
## bloc 2 4704295 2352148 1.5448 0.2166456
## fam 1 12968149 12968149 8.5169 0.0040462 **
## agreg 1 270606640 270606640 177.7222 < 2.2e-16 ***
## cinz 1 550533 550533 0.3616 0.5485225
## I(cinz^2) 1 2360352 2360352 1.5502 0.2150012
## fam:agreg 1 4240215 4240215 2.7848 0.0971955 .
## fam:cinz 1 581539 581539 0.3819 0.5374858
## fam:I(cinz^2) 1 14011881 14011881 9.2024 0.0028376 **
## agreg:cinz 1 2821636 2821636 1.8531 0.1754091
## agreg:I(cinz^2) 1 13641 13641 0.0090 0.9247148
## fam:agreg:cinz 1 19103685 19103685 12.5464 0.0005256 ***
## fam:agreg:I(cinz^2) 1 291877 291877 0.1917 0.6621261
## Residuals 154 234486288 1522638
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Anova entre modelos sequenciais.
sapply(names(m1), simplify=FALSE,
function(i){
anova(m0[[i]],m1[[i]])
})
## $mfpa
## Analysis of Variance Table
##
## Model 1: mfpa ~ bloc + fam * agreg * (cinz + I(cinz^2))
## Model 2: mfpa ~ bloc + agreg * cinz
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 154 24710
## 2 162 26875 -8 -2164.7 1.6864 0.1058
##
## $mspa
## Analysis of Variance Table
##
## Model 1: mspa ~ bloc + fam * agreg * (cinz + I(cinz^2))
## Model 2: mspa ~ bloc + agreg * cinz
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 154 1261.0
## 2 162 1341.5 -8 -80.55 1.2297 0.2852
##
## $ds
## Analysis of Variance Table
##
## Model 1: ds ~ bloc + fam * agreg * (cinz + I(cinz^2))
## Model 2: ds ~ bloc + (fam + agreg + cinz)^3 + (fam + agreg) * I(cinz^2)
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 154 0.66998
## 2 155 0.67006 -1 -8.1325e-05 0.0187 0.8914
##
## $cav
## Analysis of Variance Table
##
## Model 1: cav ~ bloc + fam * agreg * (cinz + I(cinz^2))
## Model 2: cav ~ bloc + fam * agreg * (cinz + I(cinz^2))
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 154 234486288
## 2 154 234486288 0 2.9802e-08
##-----------------------------------------------------------------------------
##
summary(m0[["mfpa"]])
##
## Call:
## FUN(formula = X[[1L]], data = ..1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -33.074 -8.108 1.068 7.509 32.862
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 39.947583 3.468766 11.516 < 2e-16 ***
## bloc2 -2.623214 2.393848 -1.096 0.274871
## bloc3 -8.465893 2.393848 -3.537 0.000536 ***
## famF48 8.487977 4.499371 1.886 0.061113 .
## agreg[4,10] -0.716554 4.499371 -0.159 0.873676
## cinz 1.212067 0.464685 2.608 0.009993 **
## I(cinz^2) -0.018792 0.009479 -1.982 0.049212 *
## famF48:agreg[4,10] -12.400527 6.363071 -1.949 0.053133 .
## famF48:cinz -1.182186 0.657164 -1.799 0.073989 .
## famF48:I(cinz^2) 0.025987 0.013406 1.939 0.054389 .
## agreg[4,10]:cinz -0.642157 0.657164 -0.977 0.330020
## agreg[4,10]:I(cinz^2) 0.004437 0.013406 0.331 0.741092
## famF48:agreg[4,10]:cinz 1.090510 0.929370 1.173 0.242452
## famF48:agreg[4,10]:I(cinz^2) -0.016584 0.018958 -0.875 0.383074
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 12.67 on 154 degrees of freedom
## Multiple R-squared: 0.3097, Adjusted R-squared: 0.2514
## F-statistic: 5.315 on 13 and 154 DF, p-value: 7.802e-08
##-----------------------------------------------------------------------------
## Valores preditos.
gridlist <- list(bloc="1",
fam=levels(da$fam),
agreg=levels(da$agreg),
cin=seq(0,6,l=100),
cinz=seq(0,50,l=100))
m1 <- lapply(m1,
function(i){
predvars <- attr(terms(i), "term.labels")
pred <- do.call(
expand.grid,
gridlist[predvars[!sapply(gridlist[predvars],
is.null)]])
i$newdata <- pred
i
})
mypredict <- function(m){
cbind(m$newdata,
predict(m, newdata=m$newdata,
interval="confidence")-
coef(m)["bloc1"])
}
all.pred <- lapply(m1, mypredict)
## str(all.pred)
## lapply(all.pred, names)
##-----------------------------------------------------------------------------
## Gráficos.
xlab <- expression(Cinza~(t~ha^{-1}))
ylab <- list(expression(Massa~fresca~de~parte~aérea~(g)),
expression(Massa~seca~de~parte~aérea~(g)),
expression(Densidade~do~solo~(Mg~t^{-1})),
expression(Água~consumida~no~ciclo~(mL)))
names(ylab) <- names(m1)
##-----------------------------------------------------------------------------
## Mfpa.
p1 <-
xyplot(mfpa~cinz, groups=agreg, data=da,
ylab=ylab[["mfpa"]], xlab=xlab,
strip=strip.custom(bg="gray90"),
auto.key=list(columns=2, points=FALSE, lines=TRUE,
title="Classe de agregado (mm)", cex.title=1.2))+
as.layer(with(all.pred[["mfpa"]],
xyplot(fit~cinz, groups=agreg, type="l",
ly=lwr, uy=upr, cty="bands", fill=1, alpha=0.2,
prepanel=prepanel.cbH,
panel=panel.superpose,
panel.groups=panel.cbH)))
##-----------------------------------------------------------------------------
## Mspa.
p2 <-
xyplot(mspa~cinz, groups=agreg, data=da,
ylab=ylab[["mspa"]], xlab=xlab,
strip=strip.custom(bg="gray90"),
auto.key=list(columns=2, points=FALSE, lines=TRUE,
title="Classe de agregado (mm)", cex.title=1.2))+
as.layer(with(all.pred[["mspa"]],
xyplot(fit~cinz, groups=agreg, type="l",
ly=lwr, uy=upr, cty="bands", fill=1, alpha=0.2,
prepanel=prepanel.cbH,
panel=panel.superpose,
panel.groups=panel.cbH)))
##-----------------------------------------------------------------------------
## Ds.
p3 <-
xyplot(ds~cinz|fam, groups=agreg, data=da, layout=c(NA,1),
ylab=ylab[["ds"]], xlab=xlab,
strip=strip.custom(bg="gray90"),
auto.key=list(columns=2, points=FALSE, lines=TRUE,
title="Classe de agregado (mm)", cex.title=1.2))+
as.layer(with(all.pred[["ds"]],
xyplot(fit~cinz|fam, groups=agreg, type="l",
ly=lwr, uy=upr, cty="bands", fill=1, alpha=0.2,
prepanel=prepanel.cbH,
panel=panel.superpose,
panel.groups=panel.cbH)))
##-----------------------------------------------------------------------------
## Cav.
p4 <-
xyplot(cav~cinz|fam, groups=agreg, data=da, layout=c(NA,1),
ylab=ylab[["cav"]], xlab=xlab,
strip=strip.custom(bg="gray90"),
auto.key=list(columns=2, points=FALSE, lines=TRUE,
title="Classe de agregado (mm)", cex.title=1.2))+
as.layer(with(all.pred[["cav"]],
xyplot(fit~cinz|fam, groups=agreg, type="l",
ly=lwr, uy=upr, cty="bands", fill=1, alpha=0.2,
prepanel=prepanel.cbH,
panel=panel.superpose,
panel.groups=panel.cbH)))
##-----------------------------------------------------------------------------
## Arranjo 1.
grid.arrange(p1, p2, ncol=2)
grid.text(label="A", x=0.025, y=0.975)
grid.text(label="B", x=0.5+0.025, y=0.975)
##-----------------------------------------------------------------------------
## Arranjo 2.
grid.arrange(p3, p4, ncol=2)
grid.text(label="A", x=0.025, y=0.975)
grid.text(label="B", x=0.5+0.025, y=0.975)
##-----------------------------------------------------------------------------
## Informações da sessão.
Sys.time()
## [1] "2015-04-15 17:30:14 BRT"
sessionInfo()
## R version 3.1.2 (2014-10-31)
## Platform: i686-pc-linux-gnu (32-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 grid stats graphics grDevices utils datasets
## [9] base
##
## other attached packages:
## [1] wzRfun_0.4 ellipse_0.3-8 multcomp_1.3-7 TH.data_1.0-5
## [5] mvtnorm_1.0-1 doBy_4.5-12 survival_2.37-7 reshape_0.8.5
## [9] plyr_1.8.1 alr3_2.0.5 car_2.0-22 gridExtra_0.9.1
## [13] latticeExtra_0.6-26 RColorBrewer_1.0-5 lattice_0.20-29 rmarkdown_0.3.3
## [17] knitr_1.8
##
## loaded via a namespace (and not attached):
## [1] digest_0.6.4 evaluate_0.5.5 formatR_1.0 htmltools_0.2.6 MASS_7.3-37
## [6] Matrix_1.1-5 nnet_7.3-8 Rcpp_0.11.3 sandwich_2.3-2 stringr_0.6.2
## [11] tools_3.1.2 yaml_2.1.13 zoo_1.7-11