Licença

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

License: CC BY-SA 4.0

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Econometria: exemplo de seleção de modelos, Faraway (2014). Campo Grande-MS,Brasil: RStudio/Rpubs, 2019 (atualizado em 2020). Disponível em http://rpubs.com/amrofi/Faraway_backward_selection.

1 Introdução

cap 10 do livro de Faraway (2014), “Linear models with R”, 2nd edition http://www.maths.bath.ac.uk/~jjf23/LMR/scripts2/varsel.R

2 Dados

Dados de 50 estados dos 1970s coletados do U.S. Census Bureau. - ‘life expectancy’ (expectativa de vida) como variável de resposta e as demais como preditoras. Ou seja, um data.frame com 50 observations para 8 variáveis.

library(faraway)
library(knitr)
data(state)
statedata <- data.frame(state.x77, row.names = state.abb)
knitr::kable(statedata)
Population Income Illiteracy Life.Exp Murder HS.Grad Frost Area
AL 3615 3624 2.1 69.05 15.1 41.3 20 50708
AK 365 6315 1.5 69.31 11.3 66.7 152 566432
AZ 2212 4530 1.8 70.55 7.8 58.1 15 113417
AR 2110 3378 1.9 70.66 10.1 39.9 65 51945
CA 21198 5114 1.1 71.71 10.3 62.6 20 156361
CO 2541 4884 0.7 72.06 6.8 63.9 166 103766
CT 3100 5348 1.1 72.48 3.1 56.0 139 4862
DE 579 4809 0.9 70.06 6.2 54.6 103 1982
FL 8277 4815 1.3 70.66 10.7 52.6 11 54090
GA 4931 4091 2.0 68.54 13.9 40.6 60 58073
HI 868 4963 1.9 73.60 6.2 61.9 0 6425
ID 813 4119 0.6 71.87 5.3 59.5 126 82677
IL 11197 5107 0.9 70.14 10.3 52.6 127 55748
IN 5313 4458 0.7 70.88 7.1 52.9 122 36097
IA 2861 4628 0.5 72.56 2.3 59.0 140 55941
KS 2280 4669 0.6 72.58 4.5 59.9 114 81787
KY 3387 3712 1.6 70.10 10.6 38.5 95 39650
LA 3806 3545 2.8 68.76 13.2 42.2 12 44930
ME 1058 3694 0.7 70.39 2.7 54.7 161 30920
MD 4122 5299 0.9 70.22 8.5 52.3 101 9891
MA 5814 4755 1.1 71.83 3.3 58.5 103 7826
MI 9111 4751 0.9 70.63 11.1 52.8 125 56817
MN 3921 4675 0.6 72.96 2.3 57.6 160 79289
MS 2341 3098 2.4 68.09 12.5 41.0 50 47296
MO 4767 4254 0.8 70.69 9.3 48.8 108 68995
MT 746 4347 0.6 70.56 5.0 59.2 155 145587
NE 1544 4508 0.6 72.60 2.9 59.3 139 76483
NV 590 5149 0.5 69.03 11.5 65.2 188 109889
NH 812 4281 0.7 71.23 3.3 57.6 174 9027
NJ 7333 5237 1.1 70.93 5.2 52.5 115 7521
NM 1144 3601 2.2 70.32 9.7 55.2 120 121412
NY 18076 4903 1.4 70.55 10.9 52.7 82 47831
NC 5441 3875 1.8 69.21 11.1 38.5 80 48798
ND 637 5087 0.8 72.78 1.4 50.3 186 69273
OH 10735 4561 0.8 70.82 7.4 53.2 124 40975
OK 2715 3983 1.1 71.42 6.4 51.6 82 68782
OR 2284 4660 0.6 72.13 4.2 60.0 44 96184
PA 11860 4449 1.0 70.43 6.1 50.2 126 44966
RI 931 4558 1.3 71.90 2.4 46.4 127 1049
SC 2816 3635 2.3 67.96 11.6 37.8 65 30225
SD 681 4167 0.5 72.08 1.7 53.3 172 75955
TN 4173 3821 1.7 70.11 11.0 41.8 70 41328
TX 12237 4188 2.2 70.90 12.2 47.4 35 262134
UT 1203 4022 0.6 72.90 4.5 67.3 137 82096
VT 472 3907 0.6 71.64 5.5 57.1 168 9267
VA 4981 4701 1.4 70.08 9.5 47.8 85 39780
WA 3559 4864 0.6 71.72 4.3 63.5 32 66570
WV 1799 3617 1.4 69.48 6.7 41.6 100 24070
WI 4589 4468 0.7 72.48 3.0 54.5 149 54464
WY 376 4566 0.6 70.29 6.9 62.9 173 97203
names(statedata)
[1] "Population" "Income"     "Illiteracy" "Life.Exp"   "Murder"    
[6] "HS.Grad"    "Frost"      "Area"      
# [1] 'Population' 'Income' 'Illiteracy' 'Life.Exp' 'Murder' [6] 'HS.Grad'
# 'Frost' 'Area'

3 Backward Selection

Estima-se o modelo completo - com todas as variáveis do data.frame - e depois segue retirando e atualizando o modelo anterior (lmod) por meio da função update. O pesquisador deve tomar cuidado para observar que o lmod é “atualizado” e portanto, sobreposto com os resultados do update. Caso deseje guardar os resultados de cada etapa, deverá modificar o nome do objeto lmod a cada atualização.

Fiz uma adaptação do script de Faraway (2014) a fim de obter os critérios de informação AIC e resultados completos do summary.

# MODELO COMPLETO
lmod <- lm(Life.Exp ~ ., statedata)
summary(lmod)

Call:
lm(formula = Life.Exp ~ ., data = statedata)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.48895 -0.51232 -0.02747  0.57002  1.49447 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  7.094e+01  1.748e+00  40.586  < 2e-16 ***
Population   5.180e-05  2.919e-05   1.775   0.0832 .  
Income      -2.180e-05  2.444e-04  -0.089   0.9293    
Illiteracy   3.382e-02  3.663e-01   0.092   0.9269    
Murder      -3.011e-01  4.662e-02  -6.459 8.68e-08 ***
HS.Grad      4.893e-02  2.332e-02   2.098   0.0420 *  
Frost       -5.735e-03  3.143e-03  -1.825   0.0752 .  
Area        -7.383e-08  1.668e-06  -0.044   0.9649    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.7448 on 42 degrees of freedom
Multiple R-squared:  0.7362,    Adjusted R-squared:  0.6922 
F-statistic: 16.74 on 7 and 42 DF,  p-value: 2.534e-10
AIC(lmod)
[1] 121.7092

A partir desses resultados, inicia-se a retirada das variáveis não significativas uma a uma e observam-se os resultados do novo modelo “atualizado” de modo que se tenha menores AIC e maiores R quadrado ajustado. A sequência sugerida é retirar a variável de maior p-value a cada passo. Ou seja, a primeira a ser retirada é a variável ‘Area’, com p-value = 0.9649 na última regressão. Os valores para atentar são: Adjusted R-squared: 0.6922 e AIC = 121.7092.

3.1 Retirando Area

lmod <- update(lmod, . ~ . - Area)
summary(lmod)

Call:
lm(formula = Life.Exp ~ Population + Income + Illiteracy + Murder + 
    HS.Grad + Frost, data = statedata)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.49047 -0.52533 -0.02546  0.57160  1.50374 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  7.099e+01  1.387e+00  51.165  < 2e-16 ***
Population   5.188e-05  2.879e-05   1.802   0.0785 .  
Income      -2.444e-05  2.343e-04  -0.104   0.9174    
Illiteracy   2.846e-02  3.416e-01   0.083   0.9340    
Murder      -3.018e-01  4.334e-02  -6.963 1.45e-08 ***
HS.Grad      4.847e-02  2.067e-02   2.345   0.0237 *  
Frost       -5.776e-03  2.970e-03  -1.945   0.0584 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.7361 on 43 degrees of freedom
Multiple R-squared:  0.7361,    Adjusted R-squared:  0.6993 
F-statistic: 19.99 on 6 and 43 DF,  p-value: 5.362e-11
AIC(lmod)
[1] 119.7116

Neste caso, observa-se a queda de AIC, passando agora para 119.7116, e melhora em Adjusted R-squared: 0.6993. Ou seja, o modelo melhorou retirando a variável.

3.2 Retirando Illiteracy

lmod <- update(lmod, . ~ . - Illiteracy)
summary(lmod)

Call:
lm(formula = Life.Exp ~ Population + Income + Murder + HS.Grad + 
    Frost, data = statedata)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.4892 -0.5122 -0.0329  0.5645  1.5166 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  7.107e+01  1.029e+00  69.067  < 2e-16 ***
Population   5.115e-05  2.709e-05   1.888   0.0657 .  
Income      -2.477e-05  2.316e-04  -0.107   0.9153    
Murder      -3.000e-01  3.704e-02  -8.099 2.91e-10 ***
HS.Grad      4.776e-02  1.859e-02   2.569   0.0137 *  
Frost       -5.910e-03  2.468e-03  -2.395   0.0210 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.7277 on 44 degrees of freedom
Multiple R-squared:  0.7361,    Adjusted R-squared:  0.7061 
F-statistic: 24.55 on 5 and 44 DF,  p-value: 1.019e-11
AIC(lmod)
[1] 117.7196

Neste caso, observa-se a queda de AIC, passando agora para 117.7196, e melhora em Adjusted R-squared: 0.7061. Ou seja, o modelo melhorou retirando a variável.

3.3 Retirando Income

lmod <- update(lmod, . ~ . - Income)
summary(lmod)

Call:
lm(formula = Life.Exp ~ Population + Murder + HS.Grad + Frost, 
    data = statedata)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.47095 -0.53464 -0.03701  0.57621  1.50683 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  7.103e+01  9.529e-01  74.542  < 2e-16 ***
Population   5.014e-05  2.512e-05   1.996  0.05201 .  
Murder      -3.001e-01  3.661e-02  -8.199 1.77e-10 ***
HS.Grad      4.658e-02  1.483e-02   3.142  0.00297 ** 
Frost       -5.943e-03  2.421e-03  -2.455  0.01802 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.7197 on 45 degrees of freedom
Multiple R-squared:  0.736, Adjusted R-squared:  0.7126 
F-statistic: 31.37 on 4 and 45 DF,  p-value: 1.696e-12
AIC(lmod)
[1] 115.7326

Neste caso, observa-se a queda de AIC, passando agora para 115.7326, e melhora em Adjusted R-squared: 0.7126. Ou seja, o modelo melhorou retirando a variável.

3.4 Retirando Population

lmod <- update(lmod, . ~ . - Population)
summary(lmod)

Call:
lm(formula = Life.Exp ~ Murder + HS.Grad + Frost, data = statedata)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.5015 -0.5391  0.1014  0.5921  1.2268 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 71.036379   0.983262  72.246  < 2e-16 ***
Murder      -0.283065   0.036731  -7.706 8.04e-10 ***
HS.Grad      0.049949   0.015201   3.286  0.00195 ** 
Frost       -0.006912   0.002447  -2.824  0.00699 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.7427 on 46 degrees of freedom
Multiple R-squared:  0.7127,    Adjusted R-squared:  0.6939 
F-statistic: 38.03 on 3 and 46 DF,  p-value: 1.634e-12
AIC(lmod)
[1] 117.9743

Neste caso, observa-se aumento de AIC, passando agora para 117.9743, e piora em Adjusted R-squared: 0.6939. Ou seja, o modelo piorou retirando a variável.

3.5 Cuidado!!!

Uma atenção deve ser dada ao fato de que as vezes a variável retirada seria significativa em outro modelo. Por exemplo, veja que “Illiteracy” agora é significativa, embora seja um modelo de AIC maior que os anteriores. Portanto, alguns autores sugerem a inclusão e eliminação de variáveis em diferentes combinações de entrada e saída do modelo. Como na próxima seção.

summary(lm(Life.Exp ~ Illiteracy + Murder + Frost, statedata))

Call:
lm(formula = Life.Exp ~ Illiteracy + Murder + Frost, data = statedata)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.59010 -0.46961  0.00394  0.57060  1.92292 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 74.556717   0.584251 127.611  < 2e-16 ***
Illiteracy  -0.601761   0.298927  -2.013  0.04998 *  
Murder      -0.280047   0.043394  -6.454 6.03e-08 ***
Frost       -0.008691   0.002959  -2.937  0.00517 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.7911 on 46 degrees of freedom
Multiple R-squared:  0.6739,    Adjusted R-squared:  0.6527 
F-statistic: 31.69 on 3 and 46 DF,  p-value: 2.915e-11
AIC(lm(Life.Exp ~ Illiteracy + Murder + Frost, statedata))
[1] 124.2947

4 Alternativa

Farei aqui com armazenamento dos objetos de regressão a cada update.

# alternativa de análise
library(faraway)
data(state)
statedata <- data.frame(state.x77, row.names = state.abb)
lmod1 <- lm(Life.Exp ~ ., statedata)
lmod2 <- update(lmod1, . ~ . - Area)
lmod3 <- update(lmod2, . ~ . - Illiteracy)
lmod4 <- update(lmod3, . ~ . - Income)
lmod5 <- update(lmod4, . ~ . - Population)
alternate <- lm(Life.Exp ~ Illiteracy + Murder + Frost, statedata)
lmod1$AIC <- AIC(lmod1)
lmod2$AIC <- AIC(lmod2)
lmod3$AIC <- AIC(lmod3)
lmod4$AIC <- AIC(lmod4)
lmod5$AIC <- AIC(lmod5)
alternate$AIC <- AIC(alternate)
lmod1$BIC <- BIC(lmod1)
lmod2$BIC <- BIC(lmod2)
lmod3$BIC <- BIC(lmod3)
lmod4$BIC <- BIC(lmod4)
lmod5$BIC <- BIC(lmod5)
alternate$BIC <- BIC(alternate)
library(stargazer)
stargazer(lmod1, lmod2, lmod3, lmod4, lmod5, alternate, title = "Título: Resultados da Seleção", 
    align = TRUE, type = "text", style = "all", keep.stat = c("aic", "bic", "rsq", 
        "adj.rsq", "n"))

Título: Resultados da Seleção
=======================================================================================
                                            Dependent variable:                        
                    -------------------------------------------------------------------
                                                 Life.Exp                              
                        (1)        (2)        (3)        (4)        (5)         (6)    
---------------------------------------------------------------------------------------
Population            0.0001*    0.0001*    0.0001*    0.0001*                         
                     (0.00003)  (0.00003)  (0.00003)  (0.00003)                        
                     t = 1.775  t = 1.802  t = 1.888  t = 1.996                        
                     p = 0.084  p = 0.079  p = 0.066  p = 0.053                        
Income               -0.00002    -0.00002   -0.00002                                   
                     (0.0002)    (0.0002)   (0.0002)                                   
                    t = -0.089  t = -0.104 t = -0.107                                  
                     p = 0.930  p = 0.918  p = 0.916                                   
Illiteracy             0.034      0.028                                      -0.602**  
                      (0.366)    (0.342)                                      (0.299)  
                     t = 0.092  t = 0.083                                   t = -2.013 
                     p = 0.927  p = 0.934                                    p = 0.050 
Murder               -0.301***  -0.302***  -0.300***  -0.300***  -0.283***   -0.280*** 
                      (0.047)    (0.043)    (0.037)    (0.037)    (0.037)     (0.043)  
                    t = -6.459  t = -6.963 t = -8.099 t = -8.199 t = -7.706 t = -6.454 
                    p = 0.00000 p = 0.000  p = 0.000  p = 0.000  p = 0.000  p = 0.00000
HS.Grad               0.049**    0.048**    0.048**    0.047***   0.050***             
                      (0.023)    (0.021)    (0.019)    (0.015)    (0.015)              
                     t = 2.098  t = 2.345  t = 2.569  t = 3.142  t = 3.286             
                     p = 0.042  p = 0.024  p = 0.014  p = 0.003  p = 0.002             
Frost                 -0.006*    -0.006*    -0.006**   -0.006**  -0.007***   -0.009*** 
                      (0.003)    (0.003)    (0.002)    (0.002)    (0.002)     (0.003)  
                    t = -1.825  t = -1.945 t = -2.395 t = -2.455 t = -2.824 t = -2.937 
                     p = 0.076  p = 0.059  p = 0.021  p = 0.019  p = 0.007   p = 0.006 
Area                 -0.00000                                                          
                     (0.00000)                                                         
                    t = -0.044                                                         
                     p = 0.965                                                         
Constant             70.943***  70.989***  71.066***  71.027***  71.036***   74.557*** 
                      (1.748)    (1.387)    (1.029)    (0.953)    (0.983)     (0.584)  
                    t = 40.586  t = 51.165 t = 69.067 t = 74.542 t = 72.246 t = 127.611
                     p = 0.000  p = 0.000  p = 0.000  p = 0.000  p = 0.000   p = 0.000 
---------------------------------------------------------------------------------------
Observations            50          50         50         50         50         50     
R2                     0.736      0.736      0.736      0.736      0.713       0.674   
Adjusted R2            0.692      0.699      0.706      0.713      0.694       0.653   
Akaike Inf. Crit.     121.709    119.712    117.720    115.733    117.974     124.295  
Bayesian Inf. Crit.   138.917    135.008    131.104    127.205    127.534     133.855  
=======================================================================================
Note:                                                       *p<0.1; **p<0.05; ***p<0.01

Nesta tabela, percebe-se que o melhor modelo foi o (4), ou seja, o mesmo que obtivemos na rotina anterior, contendo os regressores: Population, Murder, HS.Grad e Frost. Foram os menores Akaike e Bayesian e o melhor \(R^2\) Ajustado.

5 Escolha de Modelos baseados em critérios

A função leaps::regsubsets faz a seleção dos modelos por busca exaustiva para frente e para trás, stepwise, ou reposição sequencial. Observe que nos plots de AIC para cada modelo, deseja-se um modelo de menor AIC. O slot com as informações de quais variáveis estão em cada modelo tem nome which dentro do summary do objeto de regsubsets, neste caso chamado de “b” (o objeto resultante do summary foi chamado de rs e dentro dele estará também o resultado do BIC de cada modelo).

require(leaps)
b <- regsubsets(Life.Exp ~ ., data = statedata)
rs <- summary(b)
rs$which
  (Intercept) Population Income Illiteracy Murder HS.Grad Frost  Area
1        TRUE      FALSE  FALSE      FALSE   TRUE   FALSE FALSE FALSE
2        TRUE      FALSE  FALSE      FALSE   TRUE    TRUE FALSE FALSE
3        TRUE      FALSE  FALSE      FALSE   TRUE    TRUE  TRUE FALSE
4        TRUE       TRUE  FALSE      FALSE   TRUE    TRUE  TRUE FALSE
5        TRUE       TRUE   TRUE      FALSE   TRUE    TRUE  TRUE FALSE
6        TRUE       TRUE   TRUE       TRUE   TRUE    TRUE  TRUE FALSE
7        TRUE       TRUE   TRUE       TRUE   TRUE    TRUE  TRUE  TRUE
AIC <- 50 * log(rs$rss/50) + (2:8) * 2
plot(AIC ~ I(1:7), ylab = "AIC", xlab = "Number of Predictors")

rs$bic
[1] -39.22051 -42.62472 -46.70678 -47.03640 -43.13738 -39.23342 -35.32373
# plot do BIC
plot(rs$bic ~ I(1:7), ylab = "BIC", xlab = "Número de Preditores")

plot(2:8, rs$adjr2, xlab = "No. of Parameters", ylab = "Adjusted R-square")

which.max(rs$adjr2)
[1] 4
plot(2:8, rs$cp, xlab = "No. of Parameters", ylab = "Cp Statistic")
abline(0, 1)

Em todos os casos, o melhor modelo foi o (4), com os preditores Population, Murder, HS.Grad e Frost.

6 Stepwise

O Stepwise Regression é uma combinação de eliminação backward (para trás) e seleção forward (para frente - inclusão). É a situação em que variáveis são adicionadas e removidas no processo e a cada estágio existem variações diversas de como proceder. O usual é minimizar AIC ou BIC. A função será step de um modelo de regressão, dentro do pacote stats que já vem no R básico. A função step retornará os vários modelos estimados e respectivos AIC até otimizar.

lmod <- lm(Life.Exp ~ ., data = statedata)
step(lmod)
Start:  AIC=-22.18
Life.Exp ~ Population + Income + Illiteracy + Murder + HS.Grad + 
    Frost + Area

             Df Sum of Sq    RSS     AIC
- Area        1    0.0011 23.298 -24.182
- Income      1    0.0044 23.302 -24.175
- Illiteracy  1    0.0047 23.302 -24.174
<none>                    23.297 -22.185
- Population  1    1.7472 25.044 -20.569
- Frost       1    1.8466 25.144 -20.371
- HS.Grad     1    2.4413 25.738 -19.202
- Murder      1   23.1411 46.438  10.305

Step:  AIC=-24.18
Life.Exp ~ Population + Income + Illiteracy + Murder + HS.Grad + 
    Frost

             Df Sum of Sq    RSS     AIC
- Illiteracy  1    0.0038 23.302 -26.174
- Income      1    0.0059 23.304 -26.170
<none>                    23.298 -24.182
- Population  1    1.7599 25.058 -22.541
- Frost       1    2.0488 25.347 -21.968
- HS.Grad     1    2.9804 26.279 -20.163
- Murder      1   26.2721 49.570  11.569

Step:  AIC=-26.17
Life.Exp ~ Population + Income + Murder + HS.Grad + Frost

             Df Sum of Sq    RSS     AIC
- Income      1     0.006 23.308 -28.161
<none>                    23.302 -26.174
- Population  1     1.887 25.189 -24.280
- Frost       1     3.037 26.339 -22.048
- HS.Grad     1     3.495 26.797 -21.187
- Murder      1    34.739 58.041  17.456

Step:  AIC=-28.16
Life.Exp ~ Population + Murder + HS.Grad + Frost

             Df Sum of Sq    RSS     AIC
<none>                    23.308 -28.161
- Population  1     2.064 25.372 -25.920
- Frost       1     3.122 26.430 -23.877
- HS.Grad     1     5.112 28.420 -20.246
- Murder      1    34.816 58.124  15.528

Call:
lm(formula = Life.Exp ~ Population + Murder + HS.Grad + Frost, 
    data = statedata)

Coefficients:
(Intercept)   Population       Murder      HS.Grad        Frost  
  7.103e+01    5.014e-05   -3.001e-01    4.658e-02   -5.943e-03  

O melhor modelo foi também o de Population, Frost, HS.Grad e Murder.

A partir da função lm.influence pode-se encontrar as observações mais influentes no modelo.

h <- lm.influence(lmod)$hat
names(h) <- state.abb
rev(sort(h))
        AK         CA         HI         NV         NM         TX         NY 
0.80952226 0.40885689 0.37876168 0.36524576 0.32472157 0.28416353 0.25694978 
        WA         OR         ND         LA         CT         UT         RI 
0.22268196 0.22183076 0.21968606 0.19494860 0.19362508 0.19097575 0.17082010 
        MD         AL         AZ         MS         FL         IL         PA 
0.16407127 0.16110483 0.15890792 0.15571602 0.14856937 0.13743337 0.13209846 
        NJ         SD         ME         SC         MI         WY         VT 
0.12993167 0.12528365 0.12181903 0.11757971 0.11725238 0.11638093 0.11504122 
        MA         GA         MO         KY         AR         CO         WV 
0.11274391 0.11028889 0.11026698 0.10909216 0.10447656 0.10250875 0.09964990 
        NC         DE         NH         ID         OH         MT         MN 
0.09361765 0.09322149 0.08980829 0.08755753 0.08751277 0.08638978 0.07617370 
        TN         WI         VA         OK         IA         NE         KS 
0.07006383 0.06835416 0.06393987 0.06349971 0.06200255 0.05749338 0.05537644 
        IN 
0.05198210 

Neste caso, fazendo uso do resultado da observação influente, percebe-se que a combinação ótima de variáveis é diferente daquela obtida com backward selection padrão. Aqui, o melhor modelo foi olhando a observação AK = Alaska. O resultado indicou a presença dos regressores Population, Murder, HS.Grad, Frost e Area. Observar que o Alaska é um grande (extenso) estado - o dobro do tamanho do Texas (segundo em area).

b <- regsubsets(Life.Exp ~ ., data = statedata, subset = (state.abb != "AK"))
rs <- summary(b)
rs$which[which.max(rs$adjr), ]
(Intercept)  Population      Income  Illiteracy      Murder     HS.Grad 
       TRUE        TRUE       FALSE       FALSE        TRUE        TRUE 
      Frost        Area 
       TRUE        TRUE 

O stripchart é uma forma de avaliar as estimativas, embora a nuvem de pontos possa gerar alguma confusão na interpretação.

stripchart(data.frame(scale(statedata)), method = "jitter", las = 2, vertical = TRUE)

Agora usaremos uma selação para trás com algumas variáveis em logs.

b <- regsubsets(Life.Exp ~ log(Population) + Income + Illiteracy + Murder + HS.Grad + 
    Frost + log(Area), statedata)
rs <- summary(b)
rs$which[which.max(rs$adjr), ]
    (Intercept) log(Population)          Income      Illiteracy          Murder 
           TRUE            TRUE           FALSE           FALSE            TRUE 
        HS.Grad           Frost       log(Area) 
           TRUE            TRUE           FALSE 
rs$bic
[1] -39.22051 -42.62472 -47.17452 -47.87315 -44.43397 -40.64452 -36.73638
rs$adjr2
[1] 0.6015893 0.6484991 0.6967729 0.7173392 0.7136360 0.7076938 0.7007574

Neste caso, a melhor estimação foi com Population, Murder, HS.Grad e Frost. O BIC para este modelo foi de -47.87315, contra -47.03640 no modelo sem logs.

7 Considerações finais

A análise considera a estimação e os valores de critérios. Ou seja, não foram checados os pressupostos clássicos de regressão, o que implica em observação de outras características residuais e eventuais outliers.

Referências

FARAWAY, Julian J. Linear Models with R. London: CRC Press/Taylor and Francis Group. 2014. Second Edition. Code available at: https://people.bath.ac.uk/jjf23/LMR/

LS0tDQp0aXRsZTogIkVjb25vbWV0cmlhOiBleGVtcGxvIGRlIHNlbGXDp8OjbyBkZSBtb2RlbG9zLCBGYXJhd2F5ICgyMDE0KSINCmF1dGhvcjogIkFkcmlhbm8gTWFyY29zIFJvZHJpZ3VlcyBGaWd1ZWlyZWRvIg0KZS1tYWlsOiAiYWRyaWFuby5maWd1ZWlyZWRvQHVmbXMuYnIiDQphYnN0cmFjdDogIkV4ZXJjw61jaW8gZG8gY2FwIDEwIGRvIGxpdnJvIGRvIEZhcmF3YXkgKDIwMTQpLCBMaW5lYXIgbW9kZWxzIHdpdGggUiwgMm5kIGVkaXRpb24gZGUgaHR0cDovL3d3dy5tYXRocy5iYXRoLmFjLnVrL35qamYyMy9MTVIvc2NyaXB0czIvdmFyc2VsLlIgLiAiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclZCAlQiAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IGRlZmF1bHQNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2NhcHRpb246IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Iga25pdHJfaW5pdCwgZWNobz1GQUxTRSwgY2FjaGU9RkFMU0V9DQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KHJtZGZvcm1hdHMpDQoNCiMjIEdsb2JhbCBvcHRpb25zDQpvcHRpb25zKG1heC5wcmludD0iMTAwIikNCm9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSwNCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwNCiAgICAgICAgICAgICAgIHByb21wdD1GQUxTRSwNCiAgICAgICAgICAgICAgIHRpZHk9VFJVRSwNCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsDQogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLA0KICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSwNCiAgICAgICAgICAgICAgIG91dC53aWR0aD03NTAsIA0KICAgICAgICAgICAgICAgZmlnLmhlaWdodD04LCANCiAgICAgICAgICAgICAgIGZpZy53aWR0aD04KQ0Kb3B0c19rbml0JHNldCh3aWR0aD0xMDApDQpgYGANCg0KIyBMaWNlbsOnYSB7I0xpY2Vuw6dhIC51bm51bWJlcmVkfQ0KDQpUaGlzIHdvcmsgaXMgbGljZW5zZWQgdW5kZXIgdGhlIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiBUbyB2aWV3IGEgY29weSBvZiB0aGlzIGxpY2Vuc2UsIHZpc2l0IDxodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvPiBvciBzZW5kIGEgbGV0dGVyIHRvIENyZWF0aXZlIENvbW1vbnMsIFBPIEJveCAxODY2LCBNb3VudGFpbiBWaWV3LCBDQSA5NDA0MiwgVVNBLg0KDQohW0xpY2Vuc2U6IENDIEJZLVNBIDQuMF0oaHR0cHM6Ly9taXJyb3JzLmNyZWF0aXZlY29tbW9ucy5vcmcvcHJlc3NraXQvYnV0dG9ucy84OHgzMS9wbmcvYnktc2EucG5nKXt3aWR0aD0iMjUlIn0NCg0KIyBDaXRhw6fDo28geyNDaXRhw6fDo28gLnVubnVtYmVyZWR9DQoNClN1Z2VzdMOjbyBkZSBjaXRhw6fDo286IEZJR1VFSVJFRE8sIEFkcmlhbm8gTWFyY29zIFJvZHJpZ3Vlcy4gRWNvbm9tZXRyaWE6IGV4ZW1wbG8gZGUgc2VsZcOnw6NvIGRlIG1vZGVsb3MsIEZhcmF3YXkgKDIwMTQpLiBDYW1wbyBHcmFuZGUtTVMsQnJhc2lsOiBSU3R1ZGlvL1JwdWJzLCAyMDE5IChhdHVhbGl6YWRvIGVtIDIwMjApLiBEaXNwb27DrXZlbCBlbSA8aHR0cDovL3JwdWJzLmNvbS9hbXJvZmkvRmFyYXdheV9iYWNrd2FyZF9zZWxlY3Rpb24+Lg0KDQojIEludHJvZHXDp8Ojbw0KDQo+IGNhcCAxMCBkbyBsaXZybyBkZSBGYXJhd2F5ICgyMDE0KSwgIkxpbmVhciBtb2RlbHMgd2l0aCBSIiwgMm5kIGVkaXRpb24gPGh0dHA6Ly93d3cubWF0aHMuYmF0aC5hYy51ay9+ampmMjMvTE1SL3NjcmlwdHMyL3ZhcnNlbC5SPg0KDQojIERhZG9zDQoNCkRhZG9zIGRlIDUwIGVzdGFkb3MgZG9zIDE5NzBzIGNvbGV0YWRvcyBkbyBVLlMuIENlbnN1cyBCdXJlYXUuIC0gJ2xpZmUgZXhwZWN0YW5jeScgKGV4cGVjdGF0aXZhIGRlIHZpZGEpIGNvbW8gdmFyacOhdmVsIGRlIHJlc3Bvc3RhIGUgYXMgZGVtYWlzIGNvbW8gcHJlZGl0b3Jhcy4gT3Ugc2VqYSwgdW0gZGF0YS5mcmFtZSBjb20gNTAgb2JzZXJ2YXRpb25zIHBhcmEgOCB2YXJpw6F2ZWlzLg0KDQpgYGB7cn0NCmxpYnJhcnkoZmFyYXdheSk7IGxpYnJhcnkoa25pdHIpDQpkYXRhKHN0YXRlKQ0Kc3RhdGVkYXRhIDwtIGRhdGEuZnJhbWUoc3RhdGUueDc3LHJvdy5uYW1lcz1zdGF0ZS5hYmIpDQprbml0cjo6a2FibGUoc3RhdGVkYXRhKQ0KbmFtZXMoc3RhdGVkYXRhKQ0KIyBbMV0gIlBvcHVsYXRpb24iICJJbmNvbWUiICAgICAiSWxsaXRlcmFjeSIgIkxpZmUuRXhwIiAgICJNdXJkZXIiICAgIA0KIyBbNl0gIkhTLkdyYWQiICAgICJGcm9zdCIgICAgICAiQXJlYSIgDQpgYGANCg0KIyBCYWNrd2FyZCBTZWxlY3Rpb24NCg0KRXN0aW1hLXNlIG8gbW9kZWxvIGNvbXBsZXRvIC0gY29tIHRvZGFzIGFzIHZhcmnDoXZlaXMgZG8gZGF0YS5mcmFtZSAtIGUgZGVwb2lzIHNlZ3VlIHJldGlyYW5kbyBlIGF0dWFsaXphbmRvIG8gbW9kZWxvIGFudGVyaW9yIChsbW9kKSBwb3IgbWVpbyBkYSBmdW7Dp8OjbyBgdXBkYXRlYC4gTyBwZXNxdWlzYWRvciBkZXZlIHRvbWFyIGN1aWRhZG8gcGFyYSBvYnNlcnZhciBxdWUgbyBsbW9kIMOpICJhdHVhbGl6YWRvIiBlIHBvcnRhbnRvLCBzb2JyZXBvc3RvIGNvbSBvcyByZXN1bHRhZG9zIGRvIGB1cGRhdGVgLiBDYXNvIGRlc2VqZSBndWFyZGFyIG9zIHJlc3VsdGFkb3MgZGUgY2FkYSBldGFwYSwgZGV2ZXLDoSBtb2RpZmljYXIgbyBub21lIGRvIG9iamV0byBsbW9kIGEgY2FkYSBhdHVhbGl6YcOnw6NvLg0KDQpGaXogdW1hIGFkYXB0YcOnw6NvIGRvIHNjcmlwdCBkZSBGYXJhd2F5ICgyMDE0KSBhIGZpbSBkZSBvYnRlciBvcyBjcml0w6lyaW9zIGRlIGluZm9ybWHDp8OjbyBBSUMgZSByZXN1bHRhZG9zIGNvbXBsZXRvcyBkbyBgc3VtbWFyeWAuDQoNCmBgYHtyLCBldmFsPVRSVUUsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQ0KDQojIE1PREVMTyBDT01QTEVUTw0KbG1vZCA8LSBsbShMaWZlLkV4cCB+IC4sIHN0YXRlZGF0YSkNCnN1bW1hcnkobG1vZCkNCkFJQyhsbW9kKQ0KYGBgDQoNCkEgcGFydGlyIGRlc3NlcyByZXN1bHRhZG9zLCBpbmljaWEtc2UgYSByZXRpcmFkYSBkYXMgdmFyacOhdmVpcyBuw6NvIHNpZ25pZmljYXRpdmFzIHVtYSBhIHVtYSBlIG9ic2VydmFtLXNlIG9zIHJlc3VsdGFkb3MgZG8gbm92byBtb2RlbG8gImF0dWFsaXphZG8iIGRlIG1vZG8gcXVlIHNlIHRlbmhhIG1lbm9yZXMgQUlDIGUgbWFpb3JlcyBSIHF1YWRyYWRvIGFqdXN0YWRvLiBBIHNlcXXDqm5jaWEgc3VnZXJpZGEgw6kgcmV0aXJhciBhIHZhcmnDoXZlbCBkZSBtYWlvciBwLXZhbHVlIGEgY2FkYSBwYXNzby4gT3Ugc2VqYSwgYSBwcmltZWlyYSBhIHNlciByZXRpcmFkYSDDqSBhIHZhcmnDoXZlbCAnQXJlYScsIGNvbSBwLXZhbHVlID0gMC45NjQ5IG5hIMO6bHRpbWEgcmVncmVzc8Ojby4gT3MgdmFsb3JlcyBwYXJhIGF0ZW50YXIgc8OjbzogQWRqdXN0ZWQgUi1zcXVhcmVkOiAwLjY5MjIgZSBBSUMgPSAxMjEuNzA5Mi4NCg0KIyMgUmV0aXJhbmRvIEFyZWENCg0KYGBge3IsIGV2YWw9VFJVRSwgbWVzc2FnZT1GLCB3YXJuaW5nPUZ9DQpsbW9kIDwtIHVwZGF0ZShsbW9kLCAuIH4gLiAtIEFyZWEpDQpzdW1tYXJ5KGxtb2QpDQpBSUMobG1vZCkNCmBgYA0KDQpOZXN0ZSBjYXNvLCBvYnNlcnZhLXNlIGEgcXVlZGEgZGUgQUlDLCBwYXNzYW5kbyBhZ29yYSBwYXJhIDExOS43MTE2LCBlIG1lbGhvcmEgZW0gQWRqdXN0ZWQgUi1zcXVhcmVkOiAwLjY5OTMuIE91IHNlamEsIG8gbW9kZWxvIG1lbGhvcm91IHJldGlyYW5kbyBhIHZhcmnDoXZlbC4NCg0KIyMgUmV0aXJhbmRvIElsbGl0ZXJhY3kNCg0KYGBge3IsIGV2YWw9VFJVRSwgbWVzc2FnZT1GLCB3YXJuaW5nPUZ9DQpsbW9kIDwtIHVwZGF0ZShsbW9kLCAuIH4gLiAtIElsbGl0ZXJhY3kpDQpzdW1tYXJ5KGxtb2QpDQpBSUMobG1vZCkNCmBgYA0KDQpOZXN0ZSBjYXNvLCBvYnNlcnZhLXNlIGEgcXVlZGEgZGUgQUlDLCBwYXNzYW5kbyBhZ29yYSBwYXJhIDExNy43MTk2LCBlIG1lbGhvcmEgZW0gQWRqdXN0ZWQgUi1zcXVhcmVkOiAwLjcwNjEuIE91IHNlamEsIG8gbW9kZWxvIG1lbGhvcm91IHJldGlyYW5kbyBhIHZhcmnDoXZlbC4NCg0KIyMgUmV0aXJhbmRvIEluY29tZQ0KDQpgYGB7ciwgZXZhbD1UUlVFLCBtZXNzYWdlPUYsIHdhcm5pbmc9Rn0NCmxtb2QgPC0gdXBkYXRlKGxtb2QsIC4gfiAuIC0gSW5jb21lKQ0Kc3VtbWFyeShsbW9kKQ0KQUlDKGxtb2QpDQpgYGANCg0KTmVzdGUgY2Fzbywgb2JzZXJ2YS1zZSBhIHF1ZWRhIGRlIEFJQywgcGFzc2FuZG8gYWdvcmEgcGFyYSAxMTUuNzMyNiwgZSBtZWxob3JhIGVtIEFkanVzdGVkIFItc3F1YXJlZDogMC43MTI2LiBPdSBzZWphLCBvIG1vZGVsbyBtZWxob3JvdSByZXRpcmFuZG8gYSB2YXJpw6F2ZWwuDQoNCiMjIFJldGlyYW5kbyBQb3B1bGF0aW9uDQoNCmBgYHtyLCBldmFsPVRSVUUsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQ0KbG1vZCA8LSB1cGRhdGUobG1vZCwgLiB+IC4gLSBQb3B1bGF0aW9uKQ0Kc3VtbWFyeShsbW9kKQ0KQUlDKGxtb2QpDQpgYGANCg0KTmVzdGUgY2Fzbywgb2JzZXJ2YS1zZSAqKmF1bWVudG8qKiBkZSBBSUMsIHBhc3NhbmRvIGFnb3JhIHBhcmEgMTE3Ljk3NDMsIGUgKipwaW9yYSoqIGVtIEFkanVzdGVkIFItc3F1YXJlZDogMC42OTM5LiBPdSBzZWphLCBvIG1vZGVsbyBwaW9yb3UgcmV0aXJhbmRvIGEgdmFyacOhdmVsLg0KDQojIyBDdWlkYWRvISEhDQoNClVtYSBhdGVuw6fDo28gZGV2ZSBzZXIgZGFkYSBhbyBmYXRvIGRlIHF1ZSBhcyB2ZXplcyBhIHZhcmnDoXZlbCByZXRpcmFkYSBzZXJpYSBzaWduaWZpY2F0aXZhIGVtIG91dHJvIG1vZGVsby4gUG9yIGV4ZW1wbG8sIHZlamEgcXVlICJJbGxpdGVyYWN5IiBhZ29yYSDDqSBzaWduaWZpY2F0aXZhLCBlbWJvcmEgc2VqYSB1bSBtb2RlbG8gZGUgQUlDIG1haW9yIHF1ZSBvcyBhbnRlcmlvcmVzLiBQb3J0YW50bywgYWxndW5zIGF1dG9yZXMgc3VnZXJlbSBhIGluY2x1c8OjbyBlIGVsaW1pbmHDp8OjbyBkZSB2YXJpw6F2ZWlzIGVtIGRpZmVyZW50ZXMgY29tYmluYcOnw7VlcyBkZSBlbnRyYWRhIGUgc2HDrWRhIGRvIG1vZGVsby4gQ29tbyBuYSBwcsOzeGltYSBzZcOnw6NvLg0KDQpgYGB7cn0NCnN1bW1hcnkobG0oTGlmZS5FeHAgfiBJbGxpdGVyYWN5K011cmRlcitGcm9zdCwgc3RhdGVkYXRhKSkNCkFJQyhsbShMaWZlLkV4cCB+IElsbGl0ZXJhY3krTXVyZGVyK0Zyb3N0LCBzdGF0ZWRhdGEpKQ0KYGBgDQoNCiMgQWx0ZXJuYXRpdmENCg0KRmFyZWkgYXF1aSBjb20gYXJtYXplbmFtZW50byBkb3Mgb2JqZXRvcyBkZSByZWdyZXNzw6NvIGEgY2FkYSB1cGRhdGUuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIGFsdGVybmF0aXZhIGRlIGFuw6FsaXNlDQpsaWJyYXJ5KGZhcmF3YXkpDQpkYXRhKHN0YXRlKQ0Kc3RhdGVkYXRhIDwtIGRhdGEuZnJhbWUoc3RhdGUueDc3LHJvdy5uYW1lcz1zdGF0ZS5hYmIpDQpsbW9kMSA8LSBsbShMaWZlLkV4cCB+IC4sIHN0YXRlZGF0YSkNCmxtb2QyIDwtIHVwZGF0ZShsbW9kMSwgLiB+IC4gLSBBcmVhKQ0KbG1vZDMgPC0gdXBkYXRlKGxtb2QyLCAuIH4gLiAtIElsbGl0ZXJhY3kpDQpsbW9kNCA8LSB1cGRhdGUobG1vZDMsIC4gfiAuIC0gSW5jb21lKQ0KbG1vZDUgPC0gdXBkYXRlKGxtb2Q0LCAuIH4gLiAtIFBvcHVsYXRpb24pDQphbHRlcm5hdGU8LWxtKExpZmUuRXhwIH4gSWxsaXRlcmFjeStNdXJkZXIrRnJvc3QsIHN0YXRlZGF0YSkNCmxtb2QxJEFJQyA8LSBBSUMobG1vZDEpDQpsbW9kMiRBSUMgPC0gQUlDKGxtb2QyKQ0KbG1vZDMkQUlDIDwtIEFJQyhsbW9kMykNCmxtb2Q0JEFJQyA8LSBBSUMobG1vZDQpDQpsbW9kNSRBSUMgPC0gQUlDKGxtb2Q1KQ0KYWx0ZXJuYXRlJEFJQzwtQUlDKGFsdGVybmF0ZSkNCmxtb2QxJEJJQyA8LSBCSUMobG1vZDEpDQpsbW9kMiRCSUMgPC0gQklDKGxtb2QyKQ0KbG1vZDMkQklDIDwtIEJJQyhsbW9kMykNCmxtb2Q0JEJJQyA8LSBCSUMobG1vZDQpDQpsbW9kNSRCSUMgPC0gQklDKGxtb2Q1KQ0KYWx0ZXJuYXRlJEJJQzwtQklDKGFsdGVybmF0ZSkNCmxpYnJhcnkoc3RhcmdhemVyKQ0Kc3RhcmdhemVyKGxtb2QxLGxtb2QyLGxtb2QzLGxtb2Q0LGxtb2Q1LGFsdGVybmF0ZSwgDQogICAgICAgICAgdGl0bGUgPSAiVMOtdHVsbzogUmVzdWx0YWRvcyBkYSBTZWxlw6fDo28iLCANCiAgICAgICAgICBhbGlnbiA9IFRSVUUsIHR5cGUgPSAidGV4dCIsIA0KICAgICAgICAgIHN0eWxlID0gImFsbCIsIA0KICAgICAgICAgIGtlZXAuc3RhdCA9IGMoImFpYyIsICJiaWMiLCAicnNxIiwgImFkai5yc3EiLCAibiIpKQ0KYGBgDQoNCk5lc3RhIHRhYmVsYSwgcGVyY2ViZS1zZSBxdWUgbyBtZWxob3IgbW9kZWxvIGZvaSBvICg0KSwgb3Ugc2VqYSwgbyBtZXNtbyBxdWUgb2J0aXZlbW9zIG5hIHJvdGluYSBhbnRlcmlvciwgY29udGVuZG8gb3MgcmVncmVzc29yZXM6IFBvcHVsYXRpb24sIE11cmRlciwgSFMuR3JhZCBlIEZyb3N0LiBGb3JhbSBvcyBtZW5vcmVzIEFrYWlrZSBlIEJheWVzaWFuIGUgbyBtZWxob3IgJFJeMiQgQWp1c3RhZG8uDQoNCiMgRXNjb2xoYSBkZSBNb2RlbG9zIGJhc2VhZG9zIGVtIGNyaXTDqXJpb3MNCg0KQSBmdW7Dp8OjbyBgbGVhcHM6OnJlZ3N1YnNldHNgIGZheiBhIHNlbGXDp8OjbyBkb3MgbW9kZWxvcyBwb3IgYnVzY2EgZXhhdXN0aXZhIHBhcmEgZnJlbnRlIGUgcGFyYSB0csOhcywgKnN0ZXB3aXNlKiwgb3UgcmVwb3Npw6fDo28gc2VxdWVuY2lhbC4gT2JzZXJ2ZSBxdWUgbm9zIHBsb3RzIGRlIEFJQyBwYXJhIGNhZGEgbW9kZWxvLCBkZXNlamEtc2UgdW0gbW9kZWxvIGRlIG1lbm9yIEFJQy4gTyBzbG90IGNvbSBhcyBpbmZvcm1hw6fDtWVzIGRlIHF1YWlzIHZhcmnDoXZlaXMgZXN0w6NvIGVtIGNhZGEgbW9kZWxvIHRlbSBub21lIGB3aGljaGAgZGVudHJvIGRvIGBzdW1tYXJ5YCBkbyBvYmpldG8gZGUgYHJlZ3N1YnNldHNgLCBuZXN0ZSBjYXNvIGNoYW1hZG8gZGUgImIiIChvIG9iamV0byByZXN1bHRhbnRlIGRvIGBzdW1tYXJ5YCBmb2kgY2hhbWFkbyBkZSBgcnNgIGUgZGVudHJvIGRlbGUgZXN0YXLDoSB0YW1iw6ltIG8gcmVzdWx0YWRvIGRvIEJJQyBkZSBjYWRhIG1vZGVsbykuDQoNCmBgYHtyfQ0KcmVxdWlyZShsZWFwcykNCmIgPC0gcmVnc3Vic2V0cyhMaWZlLkV4cH4uLGRhdGE9c3RhdGVkYXRhKQ0KcnMgPC0gc3VtbWFyeShiKQ0KcnMkd2hpY2gNCkFJQyA8LSA1MCpsb2cocnMkcnNzLzUwKSArICgyOjgpKjINCnBsb3QoQUlDIH4gSSgxOjcpLCB5bGFiPSJBSUMiLCB4bGFiPSJOdW1iZXIgb2YgUHJlZGljdG9ycyIpDQoNCnJzJGJpYw0KIyBwbG90IGRvIEJJQw0KcGxvdChycyRiaWN+SSgxOjcpLCB5bGFiPSJCSUMiLCB4bGFiPSJOw7ptZXJvIGRlIFByZWRpdG9yZXMiKQ0KDQpwbG90KDI6OCxycyRhZGpyMix4bGFiPSJOby4gb2YgUGFyYW1ldGVycyIseWxhYj0iQWRqdXN0ZWQgUi1zcXVhcmUiKQ0Kd2hpY2gubWF4KHJzJGFkanIyKQ0KcGxvdCgyOjgscnMkY3AseGxhYj0iTm8uIG9mIFBhcmFtZXRlcnMiLHlsYWI9IkNwIFN0YXRpc3RpYyIpDQphYmxpbmUoMCwxKQ0KDQpgYGANCg0KRW0gdG9kb3Mgb3MgY2Fzb3MsIG8gbWVsaG9yIG1vZGVsbyBmb2kgbyAoNCksIGNvbSBvcyBwcmVkaXRvcmVzIFBvcHVsYXRpb24sIE11cmRlciwgSFMuR3JhZCBlIEZyb3N0Lg0KDQojIFN0ZXB3aXNlDQoNCk8gU3RlcHdpc2UgUmVncmVzc2lvbiDDqSB1bWEgY29tYmluYcOnw6NvIGRlIGVsaW1pbmHDp8OjbyBiYWNrd2FyZCAocGFyYSB0csOhcykgZSBzZWxlw6fDo28gZm9yd2FyZCAocGFyYSBmcmVudGUgLSBpbmNsdXPDo28pLiDDiSBhIHNpdHVhw6fDo28gZW0gcXVlIHZhcmnDoXZlaXMgc8OjbyBhZGljaW9uYWRhcyBlIHJlbW92aWRhcyBubyBwcm9jZXNzbyBlIGEgY2FkYSBlc3TDoWdpbyBleGlzdGVtIHZhcmlhw6fDtWVzIGRpdmVyc2FzIGRlIGNvbW8gcHJvY2VkZXIuIE8gdXN1YWwgw6kgbWluaW1pemFyIEFJQyBvdSBCSUMuIEEgZnVuw6fDo28gc2Vyw6EgYHN0ZXBgIGRlIHVtIG1vZGVsbyBkZSByZWdyZXNzw6NvLCBkZW50cm8gZG8gcGFjb3RlIGBzdGF0c2AgcXVlIGrDoSB2ZW0gbm8gUiBiw6FzaWNvLiBBIGZ1bsOnw6NvIHN0ZXAgcmV0b3JuYXLDoSBvcyB2w6FyaW9zIG1vZGVsb3MgZXN0aW1hZG9zIGUgcmVzcGVjdGl2b3MgQUlDIGF0w6kgb3RpbWl6YXIuDQoNCmBgYHtyfQ0KbG1vZCA8LSBsbShMaWZlLkV4cCB+IC4sIGRhdGE9c3RhdGVkYXRhKQ0Kc3RlcChsbW9kKQ0KYGBgDQoNCk8gbWVsaG9yIG1vZGVsbyBmb2kgdGFtYsOpbSBvIGRlIFBvcHVsYXRpb24sIEZyb3N0LCBIUy5HcmFkIGUgTXVyZGVyLiAgICANCg0KDQpBIHBhcnRpciBkYSBmdW7Dp8OjbyBsbS5pbmZsdWVuY2UgcG9kZS1zZSBlbmNvbnRyYXIgYXMgb2JzZXJ2YcOnw7VlcyBtYWlzIGluZmx1ZW50ZXMgbm8gbW9kZWxvLg0KDQpgYGB7cn0NCmggPC0gbG0uaW5mbHVlbmNlKGxtb2QpJGhhdA0KbmFtZXMoaCkgPC0gc3RhdGUuYWJiDQpyZXYoc29ydChoKSkNCmBgYA0KDQpOZXN0ZSBjYXNvLCBmYXplbmRvIHVzbyBkbyByZXN1bHRhZG8gZGEgb2JzZXJ2YcOnw6NvIGluZmx1ZW50ZSwgcGVyY2ViZS1zZSBxdWUgYSBjb21iaW5hw6fDo28gw7N0aW1hIGRlIHZhcmnDoXZlaXMgw6kgZGlmZXJlbnRlIGRhcXVlbGEgb2J0aWRhIGNvbSBiYWNrd2FyZCBzZWxlY3Rpb24gcGFkcsOjby4gQXF1aSwgbyBtZWxob3IgbW9kZWxvIGZvaSBvbGhhbmRvIGEgb2JzZXJ2YcOnw6NvIEFLID0gQWxhc2thLiBPIHJlc3VsdGFkbyBpbmRpY291IGEgcHJlc2Vuw6dhIGRvcyByZWdyZXNzb3JlcyBQb3B1bGF0aW9uLCBNdXJkZXIsIEhTLkdyYWQsIEZyb3N0IGUgQXJlYS4gT2JzZXJ2YXIgcXVlIG8gQWxhc2thIMOpIHVtIGdyYW5kZSAoZXh0ZW5zbykgZXN0YWRvIC0gbyBkb2JybyBkbyB0YW1hbmhvIGRvIFRleGFzIChzZWd1bmRvIGVtIGFyZWEpLiANCg0KYGBge3J9DQpiPC1yZWdzdWJzZXRzKExpZmUuRXhwfi4sZGF0YT1zdGF0ZWRhdGEsICBzdWJzZXQ9KHN0YXRlLmFiYiE9IkFLIikpDQpycyA8LSBzdW1tYXJ5KGIpDQpycyR3aGljaFt3aGljaC5tYXgocnMkYWRqciksXQ0KYGBgDQoNCk8gc3RyaXBjaGFydCDDqSB1bWEgZm9ybWEgZGUgYXZhbGlhciBhcyBlc3RpbWF0aXZhcywgZW1ib3JhIGEgbnV2ZW0gZGUgcG9udG9zIHBvc3NhIGdlcmFyIGFsZ3VtYSBjb25mdXPDo28gbmEgaW50ZXJwcmV0YcOnw6NvLg0KDQpgYGB7cn0NCnN0cmlwY2hhcnQoZGF0YS5mcmFtZShzY2FsZShzdGF0ZWRhdGEpKSwgbWV0aG9kID0iaml0dGVyIiwgbGFzPTIsICB2ZXJ0aWNhbD1UUlVFKQ0KYGBgDQoNCkFnb3JhIHVzYXJlbW9zIHVtYSBzZWxhw6fDo28gcGFyYSB0csOhcyBjb20gYWxndW1hcyB2YXJpw6F2ZWlzIGVtIGxvZ3MuDQoNCmBgYHtyfQ0KYjwtcmVnc3Vic2V0cyhMaWZlLkV4cCB+IGxvZyhQb3B1bGF0aW9uKStJbmNvbWUrSWxsaXRlcmFjeSsgTXVyZGVyK0hTLkdyYWQrRnJvc3QrbG9nKEFyZWEpLHN0YXRlZGF0YSkNCnJzIDwtIHN1bW1hcnkoYikNCnJzJHdoaWNoW3doaWNoLm1heChycyRhZGpyKSxdDQpycyRiaWMNCnJzJGFkanIyDQpgYGANCk5lc3RlIGNhc28sIGEgbWVsaG9yIGVzdGltYcOnw6NvIGZvaSBjb20gUG9wdWxhdGlvbiwgTXVyZGVyLCBIUy5HcmFkIGUgRnJvc3QuIE8gQklDIHBhcmEgZXN0ZSBtb2RlbG8gZm9pIGRlIC00Ny44NzMxNSwgY29udHJhIC00Ny4wMzY0MCBubyBtb2RlbG8gc2VtIGxvZ3MuIA0KDQojIENvbnNpZGVyYcOnw7VlcyBmaW5haXMNCg0KQSBhbsOhbGlzZSBjb25zaWRlcmEgYSBlc3RpbWHDp8OjbyBlIG9zIHZhbG9yZXMgZGUgY3JpdMOpcmlvcy4gT3Ugc2VqYSwgbsOjbyBmb3JhbSBjaGVjYWRvcyBvcyBwcmVzc3Vwb3N0b3MgY2zDoXNzaWNvcyBkZSByZWdyZXNzw6NvLCBvIHF1ZSBpbXBsaWNhIGVtIG9ic2VydmHDp8OjbyBkZSBvdXRyYXMgY2FyYWN0ZXLDrXN0aWNhcyByZXNpZHVhaXMgZSBldmVudHVhaXMgb3V0bGllcnMuDQoNCiMgUmVmZXLDqm5jaWFzIHsjUmVmZXLDqm5jaWFzIC51bm51bWJlcmVkfQ0KDQpGQVJBV0FZLCBKdWxpYW4gSi4gTGluZWFyIE1vZGVscyB3aXRoIFIuIExvbmRvbjogQ1JDIFByZXNzL1RheWxvciBhbmQgRnJhbmNpcyBHcm91cC4gMjAxNC4gU2Vjb25kIEVkaXRpb24uIENvZGUgYXZhaWxhYmxlIGF0OiA8aHR0cHM6Ly9wZW9wbGUuYmF0aC5hYy51ay9qamYyMy9MTVIvPg0K