Capítulo 6 Revisão de modelos lineares

6.1 Estimação

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

library(lattice)

# tá faltando a cov.r e o VIF.

#-----------------------------------------------------------------------
# Importação dos dados.

url <- "http://www.leg.ufpr.br/~walmes/data/business_economics_dataset/EXAMPLES/REALESTA.DAT"
da <- read.table(url, header = FALSE)
names(da) <- c("number", "saleprice", "landvalue",
               "improvvalue", "area")
str(da)
## 'data.frame':    20 obs. of  5 variables:
##  $ number     : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ saleprice  : int  68900 48500 55500 62000 116500 45000 38000 83000 59000 47500 ...
##  $ landvalue  : int  5960 9000 9500 10000 18000 8500 8000 23000 8100 9000 ...
##  $ improvvalue: int  44967 27860 31439 39592 72827 27317 29856 47752 39117 29349 ...
##  $ area       : int  1873 928 1126 1265 2214 912 899 1803 1204 1725 ...
summary(da)
##      number        saleprice        landvalue      improvvalue   
##  Min.   : 1.00   Min.   : 22400   Min.   : 1500   Min.   : 5779  
##  1st Qu.: 5.75   1st Qu.: 40800   1st Qu.: 6965   1st Qu.:26351  
##  Median :10.50   Median : 49250   Median : 8050   Median :31559  
##  Mean   :10.50   Mean   : 56660   Mean   : 9213   Mean   :35311  
##  3rd Qu.:15.25   3rd Qu.: 63725   3rd Qu.: 9625   3rd Qu.:41366  
##  Max.   :20.00   Max.   :116500   Max.   :23000   Max.   :72827  
##       area     
##  Min.   : 899  
##  1st Qu.:1054  
##  Median :1188  
##  Mean   :1383  
##  3rd Qu.:1744  
##  Max.   :2455
# Divide valores por 1000
i <- 2:5
da[,i] <- sapply(i,
                 function(i){
                     da[,i]/1000
                 })
str(da)
## 'data.frame':    20 obs. of  5 variables:
##  $ number     : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ saleprice  : num  68.9 48.5 55.5 62 116.5 ...
##  $ landvalue  : num  5.96 9 9.5 10 18 8.5 8 23 8.1 9 ...
##  $ improvvalue: num  45 27.9 31.4 39.6 72.8 ...
##  $ area       : num  1.873 0.928 1.126 1.265 2.214 ...
#-----------------------------------------------------------------------
# Análise exploratória.

xyplot(saleprice ~ landvalue, data = da, type = c("p", "smooth"))

xyplot(saleprice ~ improvvalue, data = da, type = c("p", "smooth"))

xyplot(saleprice ~ area, data = da, type = c("p", "smooth"))

#-----------------------------------------------------------------------
# Ajuste com funções do R.

m0 <- lm(saleprice ~ landvalue + improvvalue + area,
         data = da)

par(mfrow = c(2, 2))
plot(m0)

layout(1)

par(mfrow = c(2, 3))
plot(m0, which = 1:6)

layout(1)

anova(m0)
## Analysis of Variance Table
## 
## Response: saleprice
##             Df Sum Sq Mean Sq F value    Pr(>F)    
## landvalue    1 6102.2  6102.2  97.296 3.323e-08 ***
## improvvalue  1 2412.8  2412.8  38.470 1.267e-05 ***
## area         1  264.7   264.7   4.220   0.05666 .  
## Residuals   16 1003.5    62.7                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#-----------------------------------------------------------------------
# Ajuste do modelo de forma matricial.

# Matriz do modelo e vetor de observações.
X <- with(da, cbind(b0 = 1,
                    b1 = landvalue,
                    b2 = improvvalue,
                    b3 = area))
y <- with(da, cbind(saleprice))

# Produto de matrizes e inversa.
XlX <- crossprod(X)      # X'X
Xly <- crossprod(X, y)   # X'y
iXlX <- solve(XlX)       # (X'X)^{-1}

# Estimativas dos parâmetros.
b <- solve(XlX, Xly)
b
##     saleprice
## b0  1.4702759
## b1  0.8144901
## b2  0.8204447
## b3 13.5286499
# Matrizes de projeção.
I <- diag(nrow(y))           # I (n x n)
H <- X %*% solve(XlX, t(X))  # X (X'X)^{-1} X' (n x n)

# Função para criar matrizes de projeção.
proj <- function(X) {
    X %*% solve(crossprod(X), t(X))
}

# Função para calcular o traço de matrizes.
trace <- function(H){
    sum(diag(H))
}

# Traço das matrizes de projeção que são os graus de liberdade que é a
# dimensão do espaço em que é feita a projeção por ela.
n <- trace(I)
p <- trace(H)

# Matriz de projeção da média (modelo nulo).
H_b0 <- proj(X[, "b0"])

# Soma de quadrados da regressão (corrigida) pra média e dos resíduos.
SQReg <- t(y) %*% (H - H_b0) %*% y
SQRes <- t(y) %*% (I - H) %*% y

# Os graus de liberdade.
trace((H - H_b0))
## [1] 3
trace((I - H))
## [1] 16
# Quadrados médios
QMReg <- SQReg/(p - 1)
QMR <- SQRes/(n - p)
rQMR <- sqrt(QMR)

# Valor de F para ajuste do modelo.
F <- QMReg/QMR
pf(F, p - 1, n - p, lower = FALSE)
##              saleprice
## saleprice 3.899898e-08
# Valores preditos pelo modelo.
hy <- crossprod(H, y)

#-----------------------------------------------------------------------
# Pontos de alavancagem.

hii <- diag(H)

plot(hii)
abline(h = 2 * p/n, lty = 2, col = 2)

cbind(hatvalues(m0), hii)
##                      hii
## 1  0.29721478 0.29721478
## 2  0.14121680 0.14121680
## 3  0.08509103 0.08509103
## 4  0.08613511 0.08613511
## 5  0.36730340 0.36730340
## 6  0.13688377 0.13688377
## 7  0.14533094 0.14533094
## 8  0.52794088 0.52794088
## 9  0.10542731 0.10542731
## 10 0.20855291 0.20855291
## 11 0.17973851 0.17973851
## 12 0.09255776 0.09255776
## 13 0.38069000 0.38069000
## 14 0.09413692 0.09413692
## 15 0.12441213 0.12441213
## 16 0.22958162 0.22958162
## 17 0.18444624 0.18444624
## 18 0.09688042 0.09688042
## 19 0.21508782 0.21508782
## 20 0.30137165 0.30137165
#-----------------------------------------------------------------------
# Resíduos crus.

# e <- y - hy
# e <- y - crossprod(X, b)
e <- c(crossprod(I - H, y))
plot(e)

cbind(residuals(m0), e)
##                            e
## 1    0.34326507   0.34326507
## 2    4.28713670   4.28713670
## 3    5.26484739   5.26484739
## 4    2.78803439   2.78803439
## 5   10.66594524  10.66594524
## 6    1.85634162   1.85634162
## 7   -6.64364995  -6.64364995
## 8   -0.77357950  -0.77357950
## 9    2.55052449   2.55052449
## 10  -8.71683945  -8.71683945
## 11 -14.48097731 -14.48097731
## 12 -14.66237009 -14.66237009
## 13  -1.97713293  -1.97713293
## 14   2.69961720   2.69961720
## 15  -0.10013601  -0.10013601
## 16  -2.68694921  -2.68694921
## 17  15.97560222  15.97560222
## 18  -0.05204213  -0.05204213
## 19   1.71028447   1.71028447
## 20   1.95207778   1.95207778
#-----------------------------------------------------------------------
# Resíduos padronizados ou internamente studentizados.

r <- e/sqrt(c(QMR) * (1 - hii))
plot(r)

cbind(rstandard(m0), r)
##                            r
## 1   0.051703685  0.051703685
## 2   0.584155884  0.584155884
## 3   0.695024379  0.695024379
## 4   0.368264897  0.368264897
## 5   1.693186488  1.693186488
## 6   0.252305347  0.252305347
## 7  -0.907425428 -0.907425428
## 8  -0.142170649 -0.142170649
## 9   0.340506082  0.340506082
## 10 -1.237232437 -1.237232437
## 11 -2.018946947 -2.018946947
## 12 -1.943559660 -1.943559660
## 13 -0.317237864 -0.317237864
## 14  0.358157543  0.358157543
## 15 -0.013512746 -0.013512746
## 16 -0.386544354 -0.386544354
## 17  2.233747784  2.233747784
## 18 -0.006914895 -0.006914895
## 19  0.243759198  0.243759198
## 20  0.294901656  0.294901656
#-----------------------------------------------------------------------
# Estimativas leave one out.

# Estimativas dos parâmetros sem a i-ésima observação.
bi <- 0 * t(X)
for (i in 1:n) {
    bi[, i] <- b - e[i] * crossprod(iXlX, X[i, ])/(1 - hii[i])
}

t(bi)
##              b0        b1        b2        b3
##  [1,] 1.5495414 0.8280208 0.8190054 13.400322
##  [2,] 0.3553034 0.7589914 0.8170813 14.609679
##  [3,] 0.6038282 0.7699289 0.8185515 14.292098
##  [4,] 1.1775069 0.8085580 0.8082694 13.980312
##  [5,] 5.2862179 0.8539770 0.6561456 14.091765
##  [6,] 0.9837925 0.7937361 0.8186134 13.987550
##  [7,] 3.2226525 0.8605318 0.8451833 11.604738
##  [8,] 1.4400526 0.8843033 0.8099139 13.413586
##  [9,] 1.1692898 0.8280933 0.8039131 13.974565
## [10,] 0.6624660 0.7969022 0.7273459 17.004255
## [11,] 4.0310386 0.6898487 0.9741052  9.223385
## [12,] 1.3149387 0.7403023 0.7627215 16.192478
## [13,] 0.5443722 0.8553346 0.8046348 14.444900
## [14,] 1.0614468 0.7940970 0.8341251 13.503081
## [15,] 1.4852686 0.8154461 0.8196796 13.535108
## [16,] 0.8715999 0.7514001 0.8434409 13.920655
## [17,] 0.6960190 1.0269219 0.9385098  8.951832
## [18,] 1.4802808 0.8142129 0.8204106 13.526217
## [19,] 1.2034635 0.8586896 0.8017954 13.824444
## [20,] 0.9792723 0.8281335 0.8485870 12.973374
# Valores preditos sem a i-ésima observação.
hyi <- diag(X %*% bi)
hyi
##  [1]  68.41156  43.50789  49.74550  58.94918  99.64209  42.84926
##  [7]  45.77336  84.63873  56.14889  58.51380  58.15410  56.15791
## [13] 100.19248  42.51984  41.01436  83.48765  36.41134  37.05762
## [19]  47.82105  19.60584
plot(hyi ~ hy)

# Quadrado médio sem a i-ésima observação.
QMRi <- ((n - p) * QMR - (e^2/(1 - hii)))/(n - 1 - p)
QMRi
##  [1] 66.88824 65.47263 64.87964 66.33237 54.91238 66.63325 63.45652
##  [8] 66.81490 66.41463 60.49905 49.85618 51.10520 66.47862 66.36306
## [15] 66.89865 66.27467 46.03671 66.89922 66.65098 66.53579
#-----------------------------------------------------------------------
# Resíduos studentizados ou externamente studentizados.

s <- e/sqrt(QMRi * (1 - hii))
plot(s)

cbind(rstudent(m0), s)
##                            s
## 1   0.050066061  0.050066061
## 2   0.571736179  0.571736179
## 3   0.683349077  0.683349077
## 4   0.358091810  0.358091810
## 5   1.809532865  1.809532865
## 6   0.244781033  0.244781033
## 7  -0.902131048 -0.902131048
## 8  -0.137743171 -0.137743171
## 9   0.330894694  0.330894694
## 10 -1.259719431 -1.259719431
## 11 -2.264447340 -2.264447340
## 12 -2.153089760 -2.153089760
## 13 -0.308134853 -0.308134853
## 14  0.348183103  0.348183103
## 15 -0.013083735 -0.013083735
## 16 -0.376029863 -0.376029863
## 17  2.607226676  2.607226676
## 18 -0.006695329 -0.006695329
## 19  0.236458300  0.236458300
## 20  0.286316488  0.286316488
pvals <- pt(abs(s), df = n - 1 - p, lower.tail = FALSE)
p.adjust(pvals, method = "bonferroni")
##  [1] 1.0000000 1.0000000 1.0000000 1.0000000 0.9044904 1.0000000
##  [7] 1.0000000 1.0000000 1.0000000 1.0000000 0.3879525 0.4799291
## [13] 1.0000000 1.0000000 1.0000000 1.0000000 0.1981185 1.0000000
## [19] 1.0000000 1.0000000
#-----------------------------------------------------------------------
# Distância de Cook.

D <- hii * (e^2)/(p * c(QMR) * (1 - hii)^2)
plot(D)

cbind(cooks.distance(m0), D)
##                            D
## 1  2.826382e-04 2.826382e-04
## 2  1.402815e-02 1.402815e-02
## 3  1.123171e-02 1.123171e-02
## 4  3.195647e-03 3.195647e-03
## 5  4.160821e-01 4.160821e-01
## 6  2.523920e-03 2.523920e-03
## 7  3.500435e-02 3.500435e-02
## 8  5.651306e-03 5.651306e-03
## 9  3.416074e-03 3.416074e-03
## 10 1.008410e-01 1.008410e-01
## 11 2.232948e-01 2.232948e-01
## 12 9.632292e-02 9.632292e-02
## 13 1.546584e-02 1.546584e-02
## 14 3.332619e-03 3.332619e-03
## 15 6.486198e-06 6.486198e-06
## 16 1.113138e-02 1.113138e-02
## 17 2.821145e-01 2.821145e-01
## 18 1.282336e-06 1.282336e-06
## 19 4.070585e-03 4.070585e-03
## 20 9.378872e-03 9.378872e-03
#-----------------------------------------------------------------------
# DFfits.

# dffits <- (c(hy) - c(hyi))/sqrt(QMRi * hii)
dffits <- s * sqrt((hii/(1 - hii)))
plot(dffits)

cbind(dffits(m0), dffits)
##                       dffits
## 1   0.032558720  0.032558720
## 2   0.231844656  0.231844656
## 3   0.208398965  0.208398965
## 4   0.109936900  0.109936900
## 5   1.378736269  1.378736269
## 6   0.097480803  0.097480803
## 7  -0.372005775 -0.372005775
## 8  -0.145668122 -0.145668122
## 9   0.113594823  0.113594823
## 10 -0.646652572 -0.646652572
## 11 -1.060001884 -1.060001884
## 12 -0.687636725 -0.687636725
## 13 -0.241586417 -0.241586417
## 14  0.112242260  0.112242260
## 15 -0.004931888 -0.004931888
## 16 -0.205270991 -0.205270991
## 17  1.239902094  1.239902094
## 18 -0.002192892 -0.002192892
## 19  0.123780417  0.123780417
## 20  0.188050485  0.188050485
#-----------------------------------------------------------------------
# DFbetas.

# dfbetas <- 0 * t(X)
# for (i in 1:n) {
#     num <- e[i] * c(crossprod(iXlX, X[i, ]))/(1 - hii[i])
#     den <- sqrt(QMRi[i] * diag(iXlX))
#     dfbetas[, i] <- num/den
# }

num <- t(sweep(iXlX %*% t(X), 2, e/(1 - hii), "*"))
den <- outer(sqrt(QMRi), sqrt(diag(iXlX)), "*")

dfbetas <- num/den; dfbetas
##                 b0            b1            b2            b3
##  [1,] -0.013357206 -0.0255791757  0.0065994417  0.0188687060
##  [2,]  0.189906987  0.1060459514  0.0155876421 -0.1606585314
##  [3,]  0.148250023  0.0855351239  0.0088139472 -0.1139780947
##  [4,]  0.049541486  0.0112613722  0.0560596793 -0.0666878921
##  [5,] -0.709697529 -0.0823869963  0.8314457891 -0.0913814452
##  [6,]  0.082135170  0.0393095493  0.0084129640 -0.0676033687
##  [7,] -0.303176808 -0.0893623801 -0.1164585556  0.2904312440
##  [8,]  0.005095804 -0.1320512114  0.0483122339  0.0169277796
##  [9,]  0.050900401 -0.0258076893  0.0760704753 -0.0657985087
## [10,]  0.143133594  0.0349608993  0.4488526692 -0.5373439259
## [11,] -0.499823291  0.2729255496 -0.8160871901  0.7332237670
## [12,]  0.029946754  0.1604506692  0.3027971856 -0.4480947782
## [13,]  0.156506181 -0.0774521758  0.0727144700 -0.1351353794
## [14,]  0.069164813  0.0387045021 -0.0629752868  0.0037743780
## [15,] -0.002526252 -0.0018071770  0.0035078271 -0.0009495220
## [16,]  0.101350226  0.1198196523 -0.1059293160 -0.0579048016
## [17,]  0.157267714 -0.4840706407 -0.6525340542  0.8111621803
## [18,] -0.001685814  0.0005240004  0.0001563683  0.0003576845
## [19,]  0.045041147 -0.0837058087  0.0856631047 -0.0435694922
## [20,]  0.082959029 -0.0258604588 -0.1293794865  0.0818610922
dfbetas(m0)
##     (Intercept)     landvalue   improvvalue          area
## 1  -0.013357206 -0.0255791757  0.0065994417  0.0188687060
## 2   0.189906987  0.1060459514  0.0155876421 -0.1606585314
## 3   0.148250023  0.0855351239  0.0088139472 -0.1139780947
## 4   0.049541486  0.0112613722  0.0560596793 -0.0666878921
## 5  -0.709697529 -0.0823869963  0.8314457891 -0.0913814452
## 6   0.082135170  0.0393095493  0.0084129640 -0.0676033687
## 7  -0.303176808 -0.0893623801 -0.1164585556  0.2904312440
## 8   0.005095804 -0.1320512114  0.0483122339  0.0169277796
## 9   0.050900401 -0.0258076893  0.0760704753 -0.0657985087
## 10  0.143133594  0.0349608993  0.4488526692 -0.5373439259
## 11 -0.499823291  0.2729255496 -0.8160871901  0.7332237670
## 12  0.029946754  0.1604506692  0.3027971856 -0.4480947782
## 13  0.156506181 -0.0774521758  0.0727144700 -0.1351353794
## 14  0.069164813  0.0387045021 -0.0629752868  0.0037743780
## 15 -0.002526252 -0.0018071770  0.0035078271 -0.0009495220
## 16  0.101350226  0.1198196523 -0.1059293160 -0.0579048016
## 17  0.157267714 -0.4840706407 -0.6525340542  0.8111621803
## 18 -0.001685814  0.0005240004  0.0001563683  0.0003576845
## 19  0.045041147 -0.0837058087  0.0856631047 -0.0435694922
## 20  0.082959029 -0.0258604588 -0.1293794865  0.0818610922
#-----------------------------------------------------------------------
# Medidas de influência.

class(m0)
## [1] "lm"
methods(class = "lm")
##  [1] add1                addterm             alias              
##  [4] anova               Anova               attrassign         
##  [7] avPlot              bootCase            Boot               
## [10] boxcox              boxCox              brief              
## [13] case.names          ceresPlot           coerce             
## [16] concordance         confidenceEllipse   confint            
## [19] Confint             cooks.distance      crPlot             
## [22] deltaMethod         deviance            dfbeta             
## [25] dfbetaPlots         dfbetas             dfbetasPlots       
## [28] drop1               dropterm            dummy.coef         
## [31] durbinWatsonTest    effects             emm_basis          
## [34] extractAIC          family              formula            
## [37] fortify             hatvalues           hccm               
## [40] infIndexPlot        influence           influencePlot      
## [43] initialize          inverseResponsePlot kappa              
## [46] labels              leveneTest          leveragePlot       
## [49] linearHypothesis    logLik              logtrans           
## [52] mcPlot              mmp                 model.frame        
## [55] model.matrix        ncvTest             nextBoot           
## [58] nobs                outlierTest         plot               
## [61] powerTransform      predict             Predict            
## [64] print               proj                qqnorm             
## [67] qqPlot              qr                  recover_data       
## [70] residualPlot        residualPlots       residuals          
## [73] rstandard           rstudent            show               
## [76] sigmaHat            simulate            S                  
## [79] slotsFromS3         spreadLevelPlot     summary            
## [82] variable.names      vcov               
## see '?methods' for accessing help and source code
im <- influence.measures(m0)
summary(im)
## Potentially influential observations of
##   lm(formula = saleprice ~ landvalue + improvvalue + area, data = da) :
## 
##    dfb.1_ dfb.lndv dfb.impr dfb.area dffit cov.r   cook.d hat  
## 1  -0.01  -0.03     0.01     0.02     0.03  1.84_*  0.00   0.30
## 8   0.01  -0.13     0.05     0.02    -0.15  2.73_*  0.01   0.53
## 13  0.16  -0.08     0.07    -0.14    -0.24  2.04_*  0.02   0.38
## 20  0.08  -0.03    -0.13     0.08     0.19  1.81_*  0.01   0.30
#-----------------------------------------------------------------------

6.2 Decomposições matriciais

https://stackoverflow.com/questions/39568978/how-to-calculate-variance-of-least-squares-estimator-using-qr-decomposition-in-r

#-----------------------------------------------------------------------
# Ajuste pela expressão matricial (X'X)^{-1} (X'y).

plot(demand ~ Time, BOD)

y <- cbind(BOD$demand)
X <- cbind(b0 = 1, b1 = BOD$Time)

# Expressão literal.
betas <- solve(t(X) %*% X) %*% (t(X) %*% y)
betas
##        [,1]
## b0 8.521429
## b1 1.721429
# Código mais apropriado.
betas <- solve(crossprod(X), crossprod(X, y))
betas
##        [,1]
## b0 8.521429
## b1 1.721429
#-----------------------------------------------------------------------
# Usando decomposição QR de X.

QR <- qr(X, LAPACK = TRUE)
str(QR)
## List of 4
##  $ qr   : num [1:6, 1:2] -10.198 0.179 0.268 0.357 0.447 ...
##   ..- attr(*, "dimnames")=List of 2
##   .. ..$ : NULL
##   .. ..$ : chr [1:2] "b1" "b0"
##  $ rank : int 2
##  $ qraux: num [1:2] 1.1 1.38
##  $ pivot: int [1:2] 2 1
##  - attr(*, "useLAPACK")= logi TRUE
##  - attr(*, "class")= chr "qr"
# Matriz Q (n x n).
Q <- qr.Q(QR, complete = TRUE)
Q
##             [,1]        [,2]       [,3]        [,4]        [,5]
## [1,] -0.09805807 -0.67956838 -0.3408594 -0.35352904 -0.36619871
## [2,] -0.19611614 -0.49724516 -0.1937412  0.04700555  0.28775231
## [3,] -0.29417420 -0.31492193  0.8958523 -0.08407540 -0.06400314
## [4,] -0.39223227 -0.13259871 -0.1111203  0.86489961 -0.15908043
## [5,] -0.49029034  0.04972452 -0.1180930 -0.18612537  0.74584228
## [6,] -0.68640647  0.41437097 -0.1320384 -0.28817535 -0.44431231
##             [,6]
## [1,] -0.39153805
## [2,]  0.76924583
## [3,] -0.02385861
## [4,] -0.20704051
## [5,] -0.39022242
## [6,]  0.24341377
# Q'Q = I.
round(t(Q) %*% Q, 3)
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    0    0    0    0    0
## [2,]    0    1    0    0    0    0
## [3,]    0    0    1    0    0    0
## [4,]    0    0    0    1    0    0
## [5,]    0    0    0    0    1    0
## [6,]    0    0    0    0    0    1
# Matriz R (n x p).
R <- qr.R(QR, complete = TRUE)
R
##             b1        b0
## [1,] -10.19804 -2.157277
## [2,]   0.00000 -1.160239
## [3,]   0.00000  0.000000
## [4,]   0.00000  0.000000
## [5,]   0.00000  0.000000
## [6,]   0.00000  0.000000
z <- t(Q) %*% y
betas <- backsolve(R, z)
betas
##          [,1]
## [1,] 1.721429
## [2,] 8.521429
#-----------------------------------------------------------------------
# Usando decomposição de Cholesky de X'X.

# XlX <- t(X) %*% X
XlX <- crossprod(X)
XlX
##    b0  b1
## b0  6  22
## b1 22 104
L <- chol(XlX) # Triangular superior p x p.
Lt <- t(L)     # Triangular inferior p x p.
L
##         b0       b1
## b0 2.44949 8.981462
## b1 0.00000 4.830459
# L'L = X'X.
Lt %*% L
##    b0  b1
## b0  6  22
## b1 22 104
d <- t(X) %*% y
z <- forwardsolve(Lt, d)
z
##          [,1]
## [1,] 36.33410
## [2,]  8.31529
betas <- backsolve(L, z)
betas
##          [,1]
## [1,] 8.521429
## [2,] 1.721429
#-----------------------------------------------------------------------

6.3 Quadro de análise de variância

6.4 Teste de Wald

TODO ver a nlme::anova().

6.5 Efeito do promalin

# https://github.com/pet-estatistica/labestData/blob/devel/data-raw/BanzattoQd4.5.2.txt
da <- labestData::BanzattoQd4.5.2
summary(da)
##        promalin bloco        peso      
##  12.5      :4   I  :5   Min.   :130.6  
##  25.0      :4   II :5   1st Qu.:136.8  
##  50.0      :4   III:5   Median :141.6  
##  12.5+12.5 :4   IV :5   Mean   :143.0  
##  Testemunha:4           3rd Qu.:146.4  
##                         Max.   :165.0
# Passa testemunha para primeiro nível para ordem mais lógica.
da <- da %>%
    mutate(promalin = fct_relevel(promalin, "Testemunha", after = 0))

# Tabela de frequência.
xtabs(~promalin + bloco, data = da)
##             bloco
## promalin     I II III IV
##   Testemunha 1  1   1  1
##   12.5       1  1   1  1
##   25.0       1  1   1  1
##   50.0       1  1   1  1
##   12.5+12.5  1  1   1  1
# reshape2::dcast(da, promalin ~ bloco)
da$peso[2] <- 139.3 # Corrige valor registrado errado no pacote.

ggplot(data = da,
       mapping = aes(x = promalin,
                     y = peso,
                     color = bloco,
                     group = bloco)) +
    geom_point() +
    geom_line() +
    stat_summary(mapping = aes(group = 1),
                 geom = "line",
                 fun.y = "mean")

6.6 Castração

PimentelEx6.6.3
##    leitegada coluna castracao  peso
## 1          1      1        56  93.0
## 2          2      1      Test 115.4
## 3          3      1         7 102.1
## 4          4      1        21 117.6
## 5          1      2      Test 108.6
## 6          2      2        21  96.5
## 7          3      2        56  94.9
## 8          4      2         7 114.1
## 9          1      3         7 108.9
## 10         2      3        56  77.9
## 11         3      3        21 116.9
## 12         4      3      Test 118.7
## 13         1      4        21 102.0
## 14         2      4         7 100.2
## 15         3      4      Test  96.0
## 16         4      4        56  97.6

Manual de Planejamento e Análise de Experimentos com R
Walmes Marques Zeviani