Configuración del ambiente de trabajo.

Antes de comenzar a trabajar en R y R Studio, es recomendable configurar el ambiente de trabajo para, así, ajustarlo a nuestras necesidades.
La configuración que aquí se sugiere se centra en:

  1. cambiar el idioma,
  2. definir la ubicación del directorio de trabajo,
  3. activar las librerías a utilizar y
  4. cargar los datos a analizar y un vistazo

Idioma.

El idioma nativo de R y R Studio es el inglés, por lo que no podrá detectar caracteres particulares de otros idiomas (como los acentos o las tíldes de acentos o de la letra “ñ”). Por ello es importante cambiarlo si así se requiere.
En el caso de cambiar el idioma del inglés al español, se utiliza el comando Sys.setlocale("LC_ALL", "en_US.UTF-8"), de la siguiente manera:

Sys.setlocale("LC_ALL", "en_US.UTF-8")
## [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/C"

Una alternativa para cambiar el idioma es:

Sys.setenv(LANG = "spa")

Ubicación del directorio de trabajo.

También es importante establecer la ubicación de la carpeta en que se enraizará R y R Studio dentro de nuestro ordenador. Esto ayudará a los programas a indicarle el lugar del que deberá extraer información así como, también, la carpeta en la que guardará todos los objetos que se lleguen a crear y, además, se solicite que sean guardados.
Para establecer dicha ubicación se pueden usar los comandos getwd() para conocer la ubicación actual del directorio de trabajo, así como setwd() para cambiar dicha ubicación.

getwd() #se manda a llamar la ubicación actual del directorio de trabajo
## [1] "/Users/Gustavo 1/Dropbox/R/Rmarkdown"

En caso de desear el cambio de la carpeta del directorio de trabajo, se debe utilizar el comando setwd(), y dentro del paréntesis se escribe la ruta completa de acceso a la carpeta final en la que deseamos que R y R Studio se enraícen.
Por ejemplo, si el interés está en establecer al directorio de trabajo en la carpeta denominada “R”, y que se encuentra en la ruta “Users > Gustavo > Dropbox > R”, esto lo debo indicar utilizando el signo / (barras inclinadas)1 y entrecomillado, de la siguiente manera:

setwd("~/Dropbox/R")

En caso de que la ruta de acceso a la carpeta final sea muy largo, las carpetas iniciales se pueden abreviar mediante el uso del comando ~/.

Activar librerías.

Las librerías que se utilizarán en este ejercicio solo se limita a una denominada stargazer(), y que sirve paramejorar la presentación de los resultados de los modelos de regresión lineal.
Para ello primero será importante instalar dicha librería mediante el comando install.packages(), y el nombre de la paquetería entrecomillado.

install.packages("stargazer")

Posteriormente, la librería se activa con el comando library(), y el nombre de la paquetería no necesita estar entrecomillado.

library(stargazer)
## 
## Please cite as:
##  Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
##  R package version 5.2.3. https://CRAN.R-project.org/package=stargazer

Carga de los datos.

Finalmente es importante cargar los datos. Aquí se trabajará con los datos pre existentes en R sobre denominada mtcars, en la que se encuentran algunas características del desempeño de automóviles.
Para cargar dichos datos pre existentes se utiliza el comando data(), y el nombre del data frame se escribe entre comillas.

data("mtcars")

Vistazo a los datos.

También es importante darle un vistazo a la estructura de los datos, para identificar el tipo de variables que R reconoce, así como sus valores de codificación y etiquetas. Para ello es útil el comando str().

str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

Presentación.

La técnica de la regresión lineal múltiple bajo el método de mínimos cuadrados ordinarios (MOC) (o ordinal least squeares [OLS] en inglés) permite evaluar la magnitud del efecto de una variable explicativa (variable independiente) sobre una variable explicada (variable dependiente), a la vez que permite controlar el efecto de otras variables intervinientes. De acuerdo con Agresti y Finlay (2009), este es uno de los mejores aportes de dicha técnica para avanzar en validación de inferencias en la investigación científica.

En el presente documento, lejos de realizar una revisión de las características de la técnica de la regresión lineal múltiple, se presentarán algunas maneras de modificar y, así, complejizar los modelos diseñados para evaluar la relación entre la variable dependiente y las variables independientes e intervinientes.

Aquí se revisarán algunas adiciones a dichos modelos lineales múltiples, como lo son:

  1. Añadir términos cuadráticos.
  2. Incluir interacciones entre variables continuas y categóricas.
  3. Incluir una variable con unidades transformadas o re escaladas.
  4. Incluir variables “dummy”.
  5. Añadir un gran número de variables independientes.
  6. Descarte de variables para seleccionar el modelo con mejor ajuste.

Añadir términos cuadráticos.

Premisa: Partiendo de un modelo de regresión múltiple.
Añadir términos cuadráticos en la ecuación permite introducir una curvatura en el comportamiento del efecto de la variable independiente sobre la dependiente.

library(stargazer)
data("mtcars")
m1 <- lm(mpg ~ cyl + hp + qsec + wt, data = mtcars) ##modelo múltiple
m2 <- lm(mpg ~ cyl + I(hp^2) + qsec + wt, data = mtcars)
stargazer::stargazer(m1, m2, type = "text")
## 
## ==========================================================
##                                   Dependent variable:     
##                               ----------------------------
##                                           mpg             
##                                    (1)            (2)     
## ----------------------------------------------------------
## cyl                               -0.810        -0.911    
##                                  (0.627)        (0.622)   
##                                                           
## hp                                -0.014                  
##                                  (0.015)                  
##                                                           
## I(hp2)                                         -0.00001   
##                                                (0.00003)  
##                                                           
## qsec                              0.226          0.397    
##                                  (0.487)        (0.468)   
##                                                           
## wt                              -3.479***      -3.742***  
##                                  (1.008)        (0.979)   
##                                                           
## Constant                        34.281***      31.013***  
##                                  (9.792)        (9.288)   
##                                                           
## ----------------------------------------------------------
## Observations                        32            32      
## R2                                0.844          0.840    
## Adjusted R2                       0.821          0.817    
## Residual Std. Error (df = 27)     2.547          2.579    
## F Statistic (df = 4; 27)        36.629***      35.565***  
## ==========================================================
## Note:                          *p<0.1; **p<0.05; ***p<0.01

La función I() permite simular la presencia una variable nueva sin la necesidad de crearla previamente en el data frame, por ej.:

I(mtcars $ cyl > 6) ##permite crear una variable dummy para el siguiente argumento: si cyl es mayor, entonces valdrá 1, y si es lo opuesto entonces valdrá 0.
##  [1] FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE
## [13]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
## [25]  TRUE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE

Incluir interacciones de variables continuas y categóricas.

Hay dos posibilidades de especificar una interacción en el modelo de regresión.
Por un lado, la manera de incluir una interacción en donde, también, se evalúan a las variables de manera individual es mediante el comando var1*var2, de la siguiente manera:

m3 <- lm(mpg ~ cyl + hp * am + qsec + wt, data = mtcars) ## Se introduce una interacción entre v1 y v2 con un `*`.
stargazer::stargazer(m3, type = "text")
## 
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                                 mpg            
## -----------------------------------------------
## cyl                           -0.244           
##                               (0.724)          
##                                                
## hp                             0.006           
##                               (0.021)          
##                                                
## am                            5.754**          
##                               (2.604)          
##                                                
## qsec                           0.920           
##                               (0.572)          
##                                                
## wt                           -3.550***         
##                               (1.013)          
##                                                
## hp:am                         -0.022           
##                               (0.015)          
##                                                
## Constant                      14.587           
##                              (13.452)          
##                                                
## -----------------------------------------------
## Observations                    32             
## R2                             0.870           
## Adjusted R2                    0.839           
## Residual Std. Error       2.419 (df = 25)      
## F Statistic           27.910*** (df = 6; 25)   
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

Por otro lado, si solo se desea evaluar el término de la interacción pero no así sus variable individualmente, entonces se utiliza el comando v1:v2:

m4 <- lm(mpg ~ cyl + hp:am + qsec + wt, data = mtcars)
stargazer::stargazer(m4, type = "text")
## 
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                                 mpg            
## -----------------------------------------------
## cyl                           -1.006           
##                               (0.658)          
##                                                
## qsec                           0.380           
##                               (0.506)          
##                                                
## wt                           -3.867***         
##                               (0.929)          
##                                                
## hp:am                         -0.003           
##                               (0.008)          
##                                                
## Constant                     32.121***         
##                              (11.217)          
##                                                
## -----------------------------------------------
## Observations                    32             
## R2                             0.840           
## Adjusted R2                    0.817           
## Residual Std. Error       2.580 (df = 27)      
## F Statistic           35.535*** (df = 4; 27)   
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

Incluir una variable con trasformación / re escalamiento.

Se puede incluir a una variable transformada o re escalada en sus unidades de manera directa en el modelo, sin necesidad de crear la variable en el data frame primero. Por ejemplo, en caso de transformar una variable mediante su logaritmo natural.

m5 <- lm(log(mpg) ~ cyl + hp + qsec + wt, data = mtcars) ##la variable dependiente se reescaló con su logaritmo natural.
stargazer::stargazer(m5, type = "text")
## 
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                              log(mpg)          
## -----------------------------------------------
## cyl                           -0.026           
##                               (0.027)          
##                                                
## hp                            -0.001           
##                               (0.001)          
##                                                
## qsec                           0.014           
##                               (0.021)          
##                                                
## wt                           -0.194***         
##                               (0.044)          
##                                                
## Constant                     3.602***          
##                               (0.425)          
##                                                
## -----------------------------------------------
## Observations                    32             
## R2                             0.880           
## Adjusted R2                    0.862           
## Residual Std. Error       0.111 (df = 27)      
## F Statistic           49.490*** (df = 4; 27)   
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

Incluir variables “dummy”.

A partir de las variables “dummy” se pueden realizar diversas manipulaciones de las variables al incluirlas en un modelo de regresión:

  1. ya sea que se busque incluir una variable categórica por naturaleza,
  2. ya sea que se desea tratar a una variable continua como si fueran niveles o categorías.

Se utiliza el comando factor(variable)

m6 <- lm(mpg ~ factor(cyl) + hp + qsec + wt, data = mtcars) ##Aquí se factoriza a v2, que puede ser originalmente una variable continua, pero que R tratará en el modelo como categórica, y arrojará un coeficiente para cada "nivel" o "categoría" que supone en v2.
stargazer::stargazer(m6, type = "text")
## 
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                                 mpg            
## -----------------------------------------------
## factor(cyl)6                  -3.218*          
##                               (1.603)          
##                                                
## factor(cyl)8                  -2.982           
##                               (2.451)          
##                                                
## hp                            -0.021           
##                               (0.016)          
##                                                
## qsec                           0.093           
##                               (0.483)          
##                                                
## wt                           -3.310***         
##                               (0.990)          
##                                                
## Constant                     34.205***         
##                               (8.763)          
##                                                
## -----------------------------------------------
## Observations                    32             
## R2                             0.857           
## Adjusted R2                    0.830           
## Residual Std. Error       2.485 (df = 26)      
## F Statistic           31.272*** (df = 5; 26)   
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

Incluir un gran número de variables en el modelo.

Una manera de incluir a todas las variables existentes es mediante el comando .:

#submuestra <- subset(objeto, select = c("vd", "v1", "v2", "v7", "v9"))
m7 <- lm(mpg ~ . , data = mtcars) ##aquí se incluyen a todas las variables como independientes. Es importante considerar que las variables que se incluyan busquen reducir el sesgo de variables omitidas.
stargazer::stargazer(m7, type = "text")
## 
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                                 mpg            
## -----------------------------------------------
## cyl                           -0.111           
##                               (1.045)          
##                                                
## disp                           0.013           
##                               (0.018)          
##                                                
## hp                            -0.021           
##                               (0.022)          
##                                                
## drat                           0.787           
##                               (1.635)          
##                                                
## wt                            -3.715*          
##                               (1.894)          
##                                                
## qsec                           0.821           
##                               (0.731)          
##                                                
## vs                             0.318           
##                               (2.105)          
##                                                
## am                             2.520           
##                               (2.057)          
##                                                
## gear                           0.655           
##                               (1.493)          
##                                                
## carb                          -0.199           
##                               (0.829)          
##                                                
## Constant                      12.303           
##                              (18.718)          
##                                                
## -----------------------------------------------
## Observations                    32             
## R2                             0.869           
## Adjusted R2                    0.807           
## Residual Std. Error       2.650 (df = 21)      
## F Statistic           13.932*** (df = 10; 21)  
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

Incluir una interacción al modelo que contiene a todas las variables.

m8 <- lm(mpg ~ cyl*hp + . , data = mtcars)
stargazer::stargazer(m8, type = "text")
## 
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                                 mpg            
## -----------------------------------------------
## cyl                           -2.201           
##                               (1.367)          
##                                                
## hp                           -0.179**          
##                               (0.076)          
##                                                
## disp                           0.006           
##                               (0.017)          
##                                                
## drat                          -0.914           
##                               (1.703)          
##                                                
## wt                            -3.142*          
##                               (1.769)          
##                                                
## qsec                           0.390           
##                               (0.704)          
##                                                
## vs                             0.448           
##                               (1.943)          
##                                                
## am                             1.596           
##                               (1.946)          
##                                                
## gear                           1.346           
##                               (1.415)          
##                                                
## carb                          -0.080           
##                               (0.767)          
##                                                
## cyl:hp                        0.020**          
##                               (0.009)          
##                                                
## Constant                      39.535*          
##                              (21.401)          
##                                                
## -----------------------------------------------
## Observations                    32             
## R2                             0.894           
## Adjusted R2                    0.835           
## Residual Std. Error       2.446 (df = 20)      
## F Statistic           15.289*** (df = 11; 20)  
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

Actualizar modelos mediante la remoción de variables.

Una vez que se ha diseñado un modelo de regresión lineal múltiple se pueden identificar que no todas las variables incluidas son, necesariamente, estadísticamente significativas. Por ello es importante considerar que dichos modelos se pueden actualizar para, así, identificar cuáles son las variables que vale la pena mantener en el análisis de los datos.

Una manera para actualizar a dichos modelos es mediante la estrategia de remover variables. Para ello aquí se utiliza el script update(mode, ~.- variable), y el criterio para descartar a las variables será, paso a paso, quitar la variable con el p-value mayor. Así hasta contar con un modelo con variables estadísticamente significativas.

Para ejemplificar este método de actualización de modelos, se parte del último modelo construido previamente, el m8, que incluye a todas las variables disponibles en el dataframe mtcars. Inicialmente se debe revisar los p-values de las variables del modelo para, en principio, identificar la de mayor valor.

summary(m8)
## 
## Call:
## lm(formula = mpg ~ cyl * hp + ., data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.0958 -1.2458 -0.4677  1.2330  4.1608 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 39.534741  21.400872   1.847   0.0795 .
## cyl         -2.200817   1.367264  -1.610   0.1231  
## hp          -0.178865   0.075707  -2.363   0.0284 *
## disp         0.006160   0.016815   0.366   0.7180  
## drat        -0.913506   1.703116  -0.536   0.5976  
## wt          -3.142221   1.768661  -1.777   0.0908 .
## qsec         0.390029   0.703577   0.554   0.5855  
## vs           0.447727   1.943432   0.230   0.8201  
## am           1.595530   1.946164   0.820   0.4220  
## gear         1.346360   1.415066   0.951   0.3527  
## carb        -0.079639   0.766967  -0.104   0.9183  
## cyl:hp       0.019712   0.009142   2.156   0.0434 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.446 on 20 degrees of freedom
## Multiple R-squared:  0.8937, Adjusted R-squared:  0.8353 
## F-statistic: 15.29 on 11 and 20 DF,  p-value: 2.053e-07

La variable carb (número de carburadores) fue la que registró el p-value mayor, por lo que se decidió retirarla del modelo con el comando update().

m9 <- update(m8, ~.- carb)
summary(m9)
## 
## Call:
## lm(formula = mpg ~ cyl + hp + disp + drat + wt + qsec + vs + 
##     am + gear + cyl:hp, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.0362 -1.2075 -0.5291  1.2010  4.1937 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 39.839267  20.693652   1.925   0.0679 .
## cyl         -2.230897   1.304373  -1.710   0.1019  
## hp          -0.180510   0.072267  -2.498   0.0209 *
## disp         0.007286   0.012542   0.581   0.5675  
## drat        -0.951700   1.623283  -0.586   0.5639  
## wt          -3.266090   1.274673  -2.562   0.0182 *
## qsec         0.407294   0.667352   0.610   0.5482  
## vs           0.466828   1.888589   0.247   0.8072  
## am           1.604501   1.897900   0.845   0.4074  
## gear         1.288197   1.268507   1.016   0.3214  
## cyl:hp       0.019781   0.008901   2.222   0.0374 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.388 on 21 degrees of freedom
## Multiple R-squared:  0.8937, Adjusted R-squared:  0.843 
## F-statistic: 17.65 on 10 and 21 DF,  p-value: 4.7e-08

A partir del nuevo modelo m9 se identificó que la variable vs (forma del motor, ya sea recto o en “V”) fue la siguiente variable con mayor p-value, por lo que se remueve a continuación, y los datos se guardan como un modelo nuevo.

m10 <- update(m9, ~.- vs)
summary(m10)
## 
## Call:
## lm(formula = mpg ~ cyl + hp + disp + drat + wt + qsec + am + 
##     gear + cyl:hp, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.9603 -1.2184 -0.5169  1.2480  4.2016 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 39.424184  20.180489   1.954   0.0636 .
## cyl         -2.305215   1.241869  -1.856   0.0769 .
## hp          -0.178999   0.070454  -2.541   0.0186 *
## disp         0.007160   0.012262   0.584   0.5652  
## drat        -0.943331   1.587922  -0.594   0.5585  
## wt          -3.331373   1.220112  -2.730   0.0122 *
## qsec         0.472293   0.600129   0.787   0.4397  
## am           1.513253   1.821495   0.831   0.4150  
## gear         1.287484   1.241141   1.037   0.3108  
## cyl:hp       0.019727   0.008706   2.266   0.0336 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.336 on 22 degrees of freedom
## Multiple R-squared:  0.8934, Adjusted R-squared:  0.8497 
## F-statistic: 20.48 on 9 and 22 DF,  p-value: 1.021e-08

A continuación se identificó que la variable drat (torque) fue la de mayor p-value en el modelo m10, por lo que remueve también.

m11 <- update(m10, ~.- drat)
summary(m11)
## 
## Call:
## lm(formula = mpg ~ cyl + hp + disp + wt + qsec + am + gear + 
##     cyl:hp, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.8028 -1.3543 -0.6632  1.2964  4.0818 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)   
## (Intercept) 32.650230  16.414364   1.989  0.05871 . 
## cyl         -1.940086   1.063821  -1.824  0.08122 . 
## hp          -0.160514   0.062315  -2.576  0.01690 * 
## disp         0.008440   0.011900   0.709  0.48531   
## wt          -3.397757   1.197771  -2.837  0.00935 **
## qsec         0.556414   0.574922   0.968  0.34321   
## am           1.491062   1.795311   0.831  0.41478   
## gear         1.077752   1.173012   0.919  0.36774   
## cyl:hp       0.017352   0.007624   2.276  0.03249 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.303 on 23 degrees of freedom
## Multiple R-squared:  0.8916, Adjusted R-squared:  0.854 
## F-statistic: 23.66 on 8 and 23 DF,  p-value: 2.369e-09

A partir del modelo m11 se identificó que la variable disp (desplazamiento) tuvo el p-value mayor, por lo que se removió en el nuevo modelo m12.

m12 <- update(m11, ~.- disp)
summary(m12)
## 
## Call:
## lm(formula = mpg ~ cyl + hp + wt + qsec + am + gear + cyl:hp, 
##     data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.7819 -1.3460 -0.6863  1.0689  4.3069 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)   
## (Intercept) 35.442805  15.769239   2.248  0.03406 * 
## cyl         -1.967734   1.052041  -1.870  0.07367 . 
## hp          -0.169533   0.060369  -2.808  0.00974 **
## wt          -2.869627   0.928392  -3.091  0.00499 **
## qsec         0.459071   0.552487   0.831  0.41421   
## am           1.426377   1.774331   0.804  0.42935   
## gear         0.863367   1.121598   0.770  0.44895   
## cyl:hp       0.018847   0.007251   2.599  0.01574 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.279 on 24 degrees of freedom
## Multiple R-squared:  0.8893, Adjusted R-squared:  0.857 
## F-statistic: 27.54 on 7 and 24 DF,  p-value: 5.457e-10

A partir del modelo m12 se identificó que la variable gear (número de velocidades) tuvo el p-value mayor, por lo que se removió en el nuevo modelo m13.

m13 <- update(m12, ~.- gear)
summary(m13)
## 
## Call:
## lm(formula = mpg ~ cyl + hp + wt + qsec + am + cyl:hp, data = mtcars)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -3.189 -1.497 -0.587  1.177  4.413 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)   
## (Intercept) 39.650825  14.670344   2.703  0.01218 * 
## cyl         -2.098581   1.029722  -2.038  0.05226 . 
## hp          -0.153436   0.056168  -2.732  0.01139 * 
## wt          -2.907691   0.919488  -3.162  0.00408 **
## qsec         0.391651   0.541037   0.724  0.47585   
## am           1.996389   1.599229   1.248  0.22347   
## cyl:hp       0.017374   0.006937   2.505  0.01915 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.261 on 25 degrees of freedom
## Multiple R-squared:  0.8865, Adjusted R-squared:  0.8593 
## F-statistic: 32.56 on 6 and 25 DF,  p-value: 1.202e-10

A partir del modelo m13 se identificó que la variable qsec (aceleración en el primer cuarto de milla) tuvo el p-value mayor, por lo que se removió en el nuevo modelo m14.

m14 <- update(m13, ~.- qsec)
summary(m14)
## 
## Call:
## lm(formula = mpg ~ cyl + hp + wt + am + cyl:hp, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.1350 -1.4041 -0.7171  1.1726  4.2087 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 49.481410   5.498419   8.999 1.82e-09 ***
## cyl         -2.538431   0.823695  -3.082  0.00482 ** 
## hp          -0.167512   0.052210  -3.208  0.00353 ** 
## wt          -2.619333   0.821100  -3.190  0.00369 ** 
## am           1.321732   1.287637   1.026  0.31412    
## cyl:hp       0.018659   0.006645   2.808  0.00933 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.24 on 26 degrees of freedom
## Multiple R-squared:  0.8842, Adjusted R-squared:  0.8619 
## F-statistic: 39.69 on 5 and 26 DF,  p-value: 2.306e-11

A partir del modelo m14 se identificó que la variable am (tipo de transmisión: automática o manual) tuvo el p-value mayor, por lo que se removió en el nuevo modelo m15.

m15 <- update(m14, ~.- am)
summary(m15)
## 
## Call:
## lm(formula = mpg ~ cyl + hp + wt + cyl:hp, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.3440 -1.4144 -0.6166  1.2160  4.2815 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 52.017520   4.916935  10.579 4.18e-11 ***
## cyl         -2.742125   0.800228  -3.427  0.00197 ** 
## hp          -0.163594   0.052122  -3.139  0.00408 ** 
## wt          -3.119815   0.661322  -4.718 6.51e-05 ***
## cyl:hp       0.018954   0.006645   2.852  0.00823 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.242 on 27 degrees of freedom
## Multiple R-squared:  0.8795, Adjusted R-squared:  0.8616 
## F-statistic: 49.25 on 4 and 27 DF,  p-value: 5.065e-12

Finalmente se construyó el modelo m15 en el que se encontró que todas sus variables son estadísticamente significativas, y donde el tamaño del coeficiente de determinación del modelo (r-cuadrado) es aceptable y permite explicar casi el 88% del comportamiento de la variable explicada (mpg). De manera que se puede tomar la decisión de finalizar el proceso de actualización del modelo hasta este momento.

Bibliografía.

Agresti, A., & Finaly, B. (2009). Statistical methods for the social sciences. Pearson International.

  1. Debe tomarse en cuenta que el uso de este tipo de barras, ya sea “/” o “" varía según si el sistema operativo es MacOS o Windows.↩︎

LS0tCmF1dGhvcjogR3VzdGF2byBNYXJ0w61uZXotVmFsZGVzCmRhdGU6ICdgciBmb3JtYXQoU3lzLkRhdGUoKSlgJwp0aXRsZTogUmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIHkgYWRpY2lvbmVzCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKICAgIHRoZW1lOiBjb3NtbwogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDUuMAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQpiaWJsaWdyYXBoeTogbWV0b2RvbG9naWEuYmliCmNzbDogYXBhLmNzbApiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMjIENvbmZpZ3VyYWNpw7NuIGRlbCBhbWJpZW50ZSBkZSB0cmFiYWpvLgpBbnRlcyBkZSBjb21lbnphciBhIHRyYWJhamFyIGVuIFIgeSBSIFN0dWRpbywgZXMgcmVjb21lbmRhYmxlIGNvbmZpZ3VyYXIgZWwgYW1iaWVudGUgZGUgdHJhYmFqbyBwYXJhLCBhc8OtLCBhanVzdGFybG8gYSBudWVzdHJhcyBuZWNlc2lkYWRlcy5cCkxhIGNvbmZpZ3VyYWNpw7NuIHF1ZSBhcXXDrSBzZSBzdWdpZXJlIHNlIGNlbnRyYSBlbjogCgppLiBjYW1iaWFyIGVsIGlkaW9tYSwgCmlpLiBkZWZpbmlyIGxhIHViaWNhY2nDs24gZGVsIGRpcmVjdG9yaW8gZGUgdHJhYmFqbywgCmlpaS4gYWN0aXZhciBsYXMgbGlicmVyw61hcyBhIHV0aWxpemFyIHkgCml2LiBjYXJnYXIgbG9zIGRhdG9zIGEgYW5hbGl6YXIgeSB1biB2aXN0YXpvCgojIyMgSWRpb21hLgpFbCBpZGlvbWEgbmF0aXZvIGRlIFIgeSBSIFN0dWRpbyBlcyBlbCAqaW5nbMOpcyosIHBvciBsbyBxdWUgbm8gcG9kcsOhIGRldGVjdGFyIGNhcmFjdGVyZXMgcGFydGljdWxhcmVzIGRlIG90cm9zIGlkaW9tYXMgKGNvbW8gbG9zIGFjZW50b3MgbyBsYXMgdMOtbGRlcyBkZSBhY2VudG9zIG8gZGUgbGEgbGV0cmEgIsOxIikuIFBvciBlbGxvIGVzIGltcG9ydGFudGUgY2FtYmlhcmxvIHNpIGFzw60gc2UgcmVxdWllcmUuXApFbiBlbCBjYXNvIGRlIGNhbWJpYXIgZWwgaWRpb21hIGRlbCAqaW5nbMOpcyogYWwgKmVzcGHDsW9sKiwgc2UgdXRpbGl6YSBlbCBjb21hbmRvIGBTeXMuc2V0bG9jYWxlKCJMQ19BTEwiLCAiZW5fVVMuVVRGLTgiKWAsIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6CgpgYGB7ciBpZGlvbWExfQpTeXMuc2V0bG9jYWxlKCJMQ19BTEwiLCAiZW5fVVMuVVRGLTgiKQpgYGAKClVuYSBhbHRlcm5hdGl2YSBwYXJhIGNhbWJpYXIgZWwgaWRpb21hIGVzOgoKYGBge3IgaWRpb21hMn0KU3lzLnNldGVudihMQU5HID0gInNwYSIpCmBgYAoKIyMjIFViaWNhY2nDs24gZGVsIGRpcmVjdG9yaW8gZGUgdHJhYmFqby4KVGFtYmnDqW4gZXMgaW1wb3J0YW50ZSBlc3RhYmxlY2VyIGxhIHViaWNhY2nDs24gZGUgbGEgY2FycGV0YSBlbiBxdWUgc2UgZW5yYWl6YXLDoSBSIHkgUiBTdHVkaW8gZGVudHJvIGRlIG51ZXN0cm8gb3JkZW5hZG9yLiBFc3RvIGF5dWRhcsOhIGEgbG9zIHByb2dyYW1hcyBhIGluZGljYXJsZSBlbCBsdWdhciBkZWwgcXVlIGRlYmVyw6EgZXh0cmFlciBpbmZvcm1hY2nDs24gYXPDrSBjb21vLCB0YW1iacOpbiwgbGEgY2FycGV0YSBlbiBsYSBxdWUgZ3VhcmRhcsOhIHRvZG9zIGxvcyBvYmpldG9zIHF1ZSBzZSBsbGVndWVuIGEgY3JlYXIgeSwgYWRlbcOhcywgc2Ugc29saWNpdGUgcXVlIHNlYW4gZ3VhcmRhZG9zLlwKUGFyYSBlc3RhYmxlY2VyIGRpY2hhIHViaWNhY2nDs24gc2UgcHVlZGVuIHVzYXIgbG9zIGNvbWFuZG9zIGBnZXR3ZCgpYCBwYXJhIGNvbm9jZXIgbGEgdWJpY2FjacOzbiBhY3R1YWwgZGVsIGRpcmVjdG9yaW8gZGUgdHJhYmFqbywgYXPDrSBjb21vIGBzZXR3ZCgpYCBwYXJhIGNhbWJpYXIgZGljaGEgdWJpY2FjacOzbi4KCmBgYHtyIHViaWNhY2nDs25fYWN0dWFsfQpnZXR3ZCgpICNzZSBtYW5kYSBhIGxsYW1hciBsYSB1YmljYWNpw7NuIGFjdHVhbCBkZWwgZGlyZWN0b3JpbyBkZSB0cmFiYWpvCmBgYAoKRW4gY2FzbyBkZSBkZXNlYXIgZWwgY2FtYmlvIGRlIGxhIGNhcnBldGEgZGVsIGRpcmVjdG9yaW8gZGUgdHJhYmFqbywgc2UgZGViZSB1dGlsaXphciBlbCBjb21hbmRvIGBzZXR3ZCgpYCwgeSBkZW50cm8gZGVsIHBhcsOpbnRlc2lzIHNlIGVzY3JpYmUgbGEgcnV0YSBjb21wbGV0YSBkZSBhY2Nlc28gYSBsYSBjYXJwZXRhIGZpbmFsIGVuIGxhIHF1ZSBkZXNlYW1vcyBxdWUgUiB5IFIgU3R1ZGlvIHNlIGVucmHDrWNlbi5cClBvciBlamVtcGxvLCBzaSBlbCBpbnRlcsOpcyBlc3TDoSBlbiBlc3RhYmxlY2VyIGFsIGRpcmVjdG9yaW8gZGUgdHJhYmFqbyBlbiBsYSBjYXJwZXRhIGRlbm9taW5hZGEgIlIiLCB5IHF1ZSBzZSBlbmN1ZW50cmEgZW4gbGEgcnV0YSAiVXNlcnMgPiBHdXN0YXZvID4gRHJvcGJveCA+IFIiLCBlc3RvIGxvIGRlYm8gaW5kaWNhciB1dGlsaXphbmRvIGVsIHNpZ25vIGAvYCAoYmFycmFzIGluY2xpbmFkYXMpW14xXSB5IGVudHJlY29taWxsYWRvLCBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOgpgYGB7ciBjYW1iaW9fZGlyZWN0b3Jpb30Kc2V0d2QoIn4vRHJvcGJveC9SIikKYGBgCgpFbiBjYXNvIGRlIHF1ZSBsYSBydXRhIGRlIGFjY2VzbyBhIGxhIGNhcnBldGEgZmluYWwgc2VhIG11eSBsYXJnbywgbGFzIGNhcnBldGFzIGluaWNpYWxlcyBzZSBwdWVkZW4gYWJyZXZpYXIgbWVkaWFudGUgZWwgdXNvIGRlbCBjb21hbmRvIGB+L2AuXAoKW14xXTogRGViZSB0b21hcnNlIGVuIGN1ZW50YSBxdWUgZWwgdXNvIGRlIGVzdGUgdGlwbyBkZSBiYXJyYXMsIHlhIHNlYSAiLyIgbyAiXCIgdmFyw61hIHNlZ8O6biBzaSBlbCBzaXN0ZW1hIG9wZXJhdGl2byBlcyBNYWNPUyBvIFdpbmRvd3MuCgojIyMgQWN0aXZhciBsaWJyZXLDrWFzLgpMYXMgbGlicmVyw61hcyBxdWUgc2UgdXRpbGl6YXLDoW4gZW4gZXN0ZSBlamVyY2ljaW8gc29sbyBzZSBsaW1pdGEgIGEgdW5hIGRlbm9taW5hZGEgYHN0YXJnYXplcigpYCwgeSBxdWUgc2lydmUgcGFyYW1lam9yYXIgbGEgcHJlc2VudGFjacOzbiBkZSBsb3MgcmVzdWx0YWRvcyBkZSBsb3MgbW9kZWxvcyBkZSByZWdyZXNpw7NuIGxpbmVhbC5cClBhcmEgZWxsbyBwcmltZXJvIHNlcsOhIGltcG9ydGFudGUgaW5zdGFsYXIgZGljaGEgbGlicmVyw61hIG1lZGlhbnRlIGVsIGNvbWFuZG8gYGluc3RhbGwucGFja2FnZXMoKWAsIHkgZWwgbm9tYnJlIGRlIGxhIHBhcXVldGVyw61hIGVudHJlY29taWxsYWRvLlwKCmBgYAppbnN0YWxsLnBhY2thZ2VzKCJzdGFyZ2F6ZXIiKQpgYGAKClBvc3Rlcmlvcm1lbnRlLCBsYSBsaWJyZXLDrWEgc2UgYWN0aXZhIGNvbiBlbCBjb21hbmRvIGBsaWJyYXJ5KClgLCB5IGVsIG5vbWJyZSBkZSBsYSBwYXF1ZXRlcsOtYSBubyBuZWNlc2l0YSBlc3RhciBlbnRyZWNvbWlsbGFkby5cCgpgYGB7ciBhY3RpdmFyX2xpYnJlcsOtYX0KbGlicmFyeShzdGFyZ2F6ZXIpCmBgYAoKIyMjIENhcmdhIGRlIGxvcyBkYXRvcy4KRmluYWxtZW50ZSBlcyBpbXBvcnRhbnRlIGNhcmdhciBsb3MgZGF0b3MuIEFxdcOtIHNlIHRyYWJhamFyw6EgY29uIGxvcyBkYXRvcyBwcmUgZXhpc3RlbnRlcyBlbiBSIHNvYnJlIGRlbm9taW5hZGEgW210Y2Fyc10oaHR0cHM6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vNjE4MDBfZmFlYTkzNTQ4YzZiNDljYzkxY2QwYzVlZjUwNTk4OTQuaHRtbCksIGVuIGxhIHF1ZSBzZSBlbmN1ZW50cmFuIGFsZ3VuYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZWwgZGVzZW1wZcOxbyBkZSBhdXRvbcOzdmlsZXMuXApQYXJhIGNhcmdhciBkaWNob3MgZGF0b3MgcHJlIGV4aXN0ZW50ZXMgc2UgdXRpbGl6YSBlbCBjb21hbmRvIGBkYXRhKClgLCB5IGVsIG5vbWJyZSBkZWwgZGF0YSBmcmFtZSBzZSBlc2NyaWJlIGVudHJlIGNvbWlsbGFzLgoKYGBge3IgZGF0b3N9CmRhdGEoIm10Y2FycyIpCmBgYAoKIyMjIFZpc3Rhem8gYSBsb3MgZGF0b3MuClRhbWJpw6luIGVzIGltcG9ydGFudGUgZGFybGUgdW4gdmlzdGF6byBhIGxhIGVzdHJ1Y3R1cmEgZGUgbG9zIGRhdG9zLCBwYXJhIGlkZW50aWZpY2FyIGVsIHRpcG8gZGUgdmFyaWFibGVzIHF1ZSBSIHJlY29ub2NlLCBhc8OtIGNvbW8gc3VzIHZhbG9yZXMgZGUgY29kaWZpY2FjacOzbiB5IGV0aXF1ZXRhcy4gUGFyYSBlbGxvIGVzIMO6dGlsIGVsIGNvbWFuZG8gYHN0cigpYC4KCmBgYHtyfQpzdHIobXRjYXJzKQpgYGAKCgojIyBQcmVzZW50YWNpw7NuLgoKTGEgdMOpY25pY2EgZGUgbGEgKipyZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGUqKiBiYWpvIGVsIG3DqXRvZG8gZGUgKiptw61uaW1vcyBjdWFkcmFkb3Mgb3JkaW5hcmlvcyoqIChNT0MpIChvICpvcmRpbmFsIGxlYXN0IHNxdWVhcmVzKiBbT0xTXSBlbiBpbmdsw6lzKSBwZXJtaXRlIGV2YWx1YXIgbGEgbWFnbml0dWQgZGVsIGVmZWN0byBkZSB1bmEgdmFyaWFibGUgZXhwbGljYXRpdmEgKCp2YXJpYWJsZSBpbmRlcGVuZGllbnRlKikgc29icmUgdW5hIHZhcmlhYmxlIGV4cGxpY2FkYSAoKnZhcmlhYmxlIGRlcGVuZGllbnRlKiksIGEgbGEgdmV6IHF1ZSBwZXJtaXRlICpjb250cm9sYXIqIGVsIGVmZWN0byBkZSBvdHJhcyB2YXJpYWJsZXMgKmludGVydmluaWVudGVzKi4gRGUgYWN1ZXJkbyBjb24gQWdyZXN0aSB5IEZpbmxheSBbLUBhZ3Jlc3RpMjAwOV0sIGVzdGUgZXMgdW5vIGRlIGxvcyBtZWpvcmVzIGFwb3J0ZXMgZGUgZGljaGEgdMOpY25pY2EgcGFyYSBhdmFuemFyIGVuIHZhbGlkYWNpw7NuIGRlIGluZmVyZW5jaWFzIGVuIGxhIGludmVzdGlnYWNpw7NuIGNpZW50w61maWNhLlwKCkVuIGVsIHByZXNlbnRlIGRvY3VtZW50bywgbGVqb3MgZGUgcmVhbGl6YXIgdW5hIHJldmlzacOzbiBkZSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBsYSB0w6ljbmljYSBkZSBsYSAqKnJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSoqLCBzZSBwcmVzZW50YXLDoW4gYWxndW5hcyBtYW5lcmFzIGRlIG1vZGlmaWNhciB5LCBhc8OtLCBjb21wbGVqaXphciBsb3MgbW9kZWxvcyBkaXNlw7FhZG9zIHBhcmEgZXZhbHVhciBsYSByZWxhY2nDs24gZW50cmUgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgeSBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGUgaW50ZXJ2aW5pZW50ZXMuXAoKQXF1w60gc2UgcmV2aXNhcsOhbiBhbGd1bmFzIGFkaWNpb25lcyBhIGRpY2hvcyBtb2RlbG9zIGxpbmVhbGVzIG3Dumx0aXBsZXMsIGNvbW8gbG8gc29uOgoKMS4gQcOxYWRpciB0w6lybWlub3MgY3VhZHLDoXRpY29zLgoyLiBJbmNsdWlyIGludGVyYWNjaW9uZXMgZW50cmUgdmFyaWFibGVzIGNvbnRpbnVhcyB5IGNhdGVnw7NyaWNhcy4KMy4gSW5jbHVpciB1bmEgdmFyaWFibGUgY29uIHVuaWRhZGVzIHRyYW5zZm9ybWFkYXMgbyByZSBlc2NhbGFkYXMuCjQuIEluY2x1aXIgdmFyaWFibGVzICJkdW1teSIuCjUuIEHDsWFkaXIgdW4gZ3JhbiBuw7ptZXJvIGRlIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcy4KNi4gRGVzY2FydGUgZGUgdmFyaWFibGVzIHBhcmEgc2VsZWNjaW9uYXIgZWwgbW9kZWxvIGNvbiBtZWpvciBhanVzdGUuCgoKIyMjIEHDsWFkaXIgdMOpcm1pbm9zIGN1YWRyw6F0aWNvcy4KClByZW1pc2E6IFBhcnRpZW5kbyBkZSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBtw7psdGlwbGUuXApBw7FhZGlyIHTDqXJtaW5vcyBjdWFkcsOhdGljb3MgZW4gbGEgZWN1YWNpw7NuIHBlcm1pdGUgaW50cm9kdWNpciB1bmEgY3VydmF0dXJhIGVuIGVsIGNvbXBvcnRhbWllbnRvIGRlbCBlZmVjdG8gZGUgbGEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSBzb2JyZSBsYSBkZXBlbmRpZW50ZS4KCmBgYHtyIHRlcm1pbm9fY3VhZHJhdGljb30KbGlicmFyeShzdGFyZ2F6ZXIpCmRhdGEoIm10Y2FycyIpCm0xIDwtIGxtKG1wZyB+IGN5bCArIGhwICsgcXNlYyArIHd0LCBkYXRhID0gbXRjYXJzKSAjI21vZGVsbyBtw7psdGlwbGUKbTIgPC0gbG0obXBnIH4gY3lsICsgSShocF4yKSArIHFzZWMgKyB3dCwgZGF0YSA9IG10Y2FycykKc3RhcmdhemVyOjpzdGFyZ2F6ZXIobTEsIG0yLCB0eXBlID0gInRleHQiKQpgYGAKCkxhIGZ1bmNpw7NuIGBJKClgIHBlcm1pdGUgc2ltdWxhciBsYSBwcmVzZW5jaWEgdW5hIHZhcmlhYmxlIG51ZXZhIHNpbiBsYSBuZWNlc2lkYWQgZGUgY3JlYXJsYSBwcmV2aWFtZW50ZSBlbiBlbCBkYXRhIGZyYW1lLCBwb3IgZWouOgoKYGBge3IgZnVuY2lvbl9JfQpJKG10Y2FycyAkIGN5bCA+IDYpICMjcGVybWl0ZSBjcmVhciB1bmEgdmFyaWFibGUgZHVtbXkgcGFyYSBlbCBzaWd1aWVudGUgYXJndW1lbnRvOiBzaSBjeWwgZXMgbWF5b3IsIGVudG9uY2VzIHZhbGRyw6EgMSwgeSBzaSBlcyBsbyBvcHVlc3RvIGVudG9uY2VzIHZhbGRyw6EgMC4KYGBgCgoKIyMjIEluY2x1aXIgaW50ZXJhY2Npb25lcyBkZSB2YXJpYWJsZXMgY29udGludWFzIHkgY2F0ZWfDs3JpY2FzLgoKSGF5IGRvcyBwb3NpYmlsaWRhZGVzIGRlIGVzcGVjaWZpY2FyIHVuYSBpbnRlcmFjY2nDs24gZW4gZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24uXApQb3IgdW4gbGFkbywgbGEgbWFuZXJhIGRlIGluY2x1aXIgdW5hIGludGVyYWNjacOzbiBlbiBkb25kZSwgdGFtYmnDqW4sIHNlIGV2YWzDumFuIGEgbGFzIHZhcmlhYmxlcyBkZSBtYW5lcmEgaW5kaXZpZHVhbCBlcyBtZWRpYW50ZSBlbCBjb21hbmRvIGB2YXIxKnZhcjJgLCBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOgpgYGB7cn0KbTMgPC0gbG0obXBnIH4gY3lsICsgaHAgKiBhbSArIHFzZWMgKyB3dCwgZGF0YSA9IG10Y2FycykgIyMgU2UgaW50cm9kdWNlIHVuYSBpbnRlcmFjY2nDs24gZW50cmUgdjEgeSB2MiBjb24gdW4gYCpgLgpzdGFyZ2F6ZXI6OnN0YXJnYXplcihtMywgdHlwZSA9ICJ0ZXh0IikKYGBgCgpQb3Igb3RybyBsYWRvLCBzaSBzb2xvIHNlIGRlc2VhIGV2YWx1YXIgZWwgdMOpcm1pbm8gZGUgbGEgaW50ZXJhY2Npw7NuIHBlcm8gbm8gYXPDrSBzdXMgdmFyaWFibGUgaW5kaXZpZHVhbG1lbnRlLCBlbnRvbmNlcyBzZSB1dGlsaXphIGVsIGNvbWFuZG8gYHYxOnYyYDoKCmBgYHtyfQptNCA8LSBsbShtcGcgfiBjeWwgKyBocDphbSArIHFzZWMgKyB3dCwgZGF0YSA9IG10Y2FycykKc3RhcmdhemVyOjpzdGFyZ2F6ZXIobTQsIHR5cGUgPSAidGV4dCIpCmBgYAoKCiMjIyBJbmNsdWlyIHVuYSB2YXJpYWJsZSBjb24gdHJhc2Zvcm1hY2nDs24gLyByZSBlc2NhbGFtaWVudG8uCgpTZSBwdWVkZSBpbmNsdWlyIGEgdW5hIHZhcmlhYmxlIHRyYW5zZm9ybWFkYSBvIHJlIGVzY2FsYWRhIGVuIHN1cyB1bmlkYWRlcyBkZSBtYW5lcmEgZGlyZWN0YSBlbiBlbCBtb2RlbG8sIHNpbiBuZWNlc2lkYWQgZGUgY3JlYXIgbGEgdmFyaWFibGUgZW4gZWwgZGF0YSBmcmFtZSBwcmltZXJvLiBQb3IgZWplbXBsbywgZW4gY2FzbyBkZSB0cmFuc2Zvcm1hciB1bmEgdmFyaWFibGUgbWVkaWFudGUgc3UgbG9nYXJpdG1vIG5hdHVyYWwuCgpgYGB7cn0KbTUgPC0gbG0obG9nKG1wZykgfiBjeWwgKyBocCArIHFzZWMgKyB3dCwgZGF0YSA9IG10Y2FycykgIyNsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBzZSByZWVzY2Fsw7MgY29uIHN1IGxvZ2FyaXRtbyBuYXR1cmFsLgpzdGFyZ2F6ZXI6OnN0YXJnYXplcihtNSwgdHlwZSA9ICJ0ZXh0IikKYGBgCgoKIyMjIEluY2x1aXIgdmFyaWFibGVzICJkdW1teSIuCgpBIHBhcnRpciBkZSBsYXMgdmFyaWFibGVzICJkdW1teSIgc2UgcHVlZGVuIHJlYWxpemFyIGRpdmVyc2FzIG1hbmlwdWxhY2lvbmVzIGRlIGxhcyB2YXJpYWJsZXMgYWwgaW5jbHVpcmxhcyBlbiB1biBtb2RlbG8gZGUgcmVncmVzacOzbjoKCjEuIHlhIHNlYSBxdWUgc2UgYnVzcXVlIGluY2x1aXIgdW5hIHZhcmlhYmxlIGNhdGVnw7NyaWNhIHBvciBuYXR1cmFsZXphLAoyLiB5YSBzZWEgcXVlIHNlIGRlc2VhIHRyYXRhciBhIHVuYSB2YXJpYWJsZSBjb250aW51YSBjb21vIHNpIGZ1ZXJhbiBuaXZlbGVzIG8gY2F0ZWdvcsOtYXMuCgpTZSB1dGlsaXphIGVsIGNvbWFuZG8gYGZhY3Rvcih2YXJpYWJsZSlgCgpgYGB7cn0KbTYgPC0gbG0obXBnIH4gZmFjdG9yKGN5bCkgKyBocCArIHFzZWMgKyB3dCwgZGF0YSA9IG10Y2FycykgIyNBcXXDrSBzZSBmYWN0b3JpemEgYSB2MiwgcXVlIHB1ZWRlIHNlciBvcmlnaW5hbG1lbnRlIHVuYSB2YXJpYWJsZSBjb250aW51YSwgcGVybyBxdWUgUiB0cmF0YXLDoSBlbiBlbCBtb2RlbG8gY29tbyBjYXRlZ8OzcmljYSwgeSBhcnJvamFyw6EgdW4gY29lZmljaWVudGUgcGFyYSBjYWRhICJuaXZlbCIgbyAiY2F0ZWdvcsOtYSIgcXVlIHN1cG9uZSBlbiB2Mi4Kc3RhcmdhemVyOjpzdGFyZ2F6ZXIobTYsIHR5cGUgPSAidGV4dCIpCmBgYAoKCiMjIyBJbmNsdWlyIHVuIGdyYW4gbsO6bWVybyBkZSB2YXJpYWJsZXMgZW4gZWwgbW9kZWxvLgoKVW5hIG1hbmVyYSBkZSBpbmNsdWlyIGEgdG9kYXMgbGFzIHZhcmlhYmxlcyBleGlzdGVudGVzIGVzIG1lZGlhbnRlIGVsIGNvbWFuZG8gYC5gOgoKYGBge3J9CiNzdWJtdWVzdHJhIDwtIHN1YnNldChvYmpldG8sIHNlbGVjdCA9IGMoInZkIiwgInYxIiwgInYyIiwgInY3IiwgInY5IikpCm03IDwtIGxtKG1wZyB+IC4gLCBkYXRhID0gbXRjYXJzKSAjI2FxdcOtIHNlIGluY2x1eWVuIGEgdG9kYXMgbGFzIHZhcmlhYmxlcyBjb21vIGluZGVwZW5kaWVudGVzLiBFcyBpbXBvcnRhbnRlIGNvbnNpZGVyYXIgcXVlIGxhcyB2YXJpYWJsZXMgcXVlIHNlIGluY2x1eWFuIGJ1c3F1ZW4gcmVkdWNpciBlbCBzZXNnbyBkZSB2YXJpYWJsZXMgb21pdGlkYXMuCnN0YXJnYXplcjo6c3RhcmdhemVyKG03LCB0eXBlID0gInRleHQiKQpgYGAKCkluY2x1aXIgdW5hIGludGVyYWNjacOzbiBhbCBtb2RlbG8gcXVlIGNvbnRpZW5lIGEgdG9kYXMgbGFzIHZhcmlhYmxlcy4KCmBgYHtyfQptOCA8LSBsbShtcGcgfiBjeWwqaHAgKyAuICwgZGF0YSA9IG10Y2FycykKc3RhcmdhemVyOjpzdGFyZ2F6ZXIobTgsIHR5cGUgPSAidGV4dCIpCmBgYAoKIyMgQWN0dWFsaXphciBtb2RlbG9zIG1lZGlhbnRlIGxhIHJlbW9jacOzbiBkZSB2YXJpYWJsZXMuClVuYSB2ZXogcXVlIHNlIGhhIGRpc2XDsWFkbyB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIHNlIHB1ZWRlbiBpZGVudGlmaWNhciBxdWUgbm8gdG9kYXMgbGFzIHZhcmlhYmxlcyBpbmNsdWlkYXMgc29uLCBuZWNlc2FyaWFtZW50ZSwgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMuIFBvciBlbGxvIGVzIGltcG9ydGFudGUgY29uc2lkZXJhciBxdWUgZGljaG9zIG1vZGVsb3Mgc2UgcHVlZGVuICphY3R1YWxpemFyKiBwYXJhLCBhc8OtLCBpZGVudGlmaWNhciBjdcOhbGVzIHNvbiBsYXMgdmFyaWFibGVzIHF1ZSB2YWxlIGxhIHBlbmEgbWFudGVuZXIgZW4gZWwgYW7DoWxpc2lzIGRlIGxvcyBkYXRvcy5cCgpVbmEgbWFuZXJhIHBhcmEgYWN0dWFsaXphciBhIGRpY2hvcyBtb2RlbG9zIGVzIG1lZGlhbnRlIGxhIGVzdHJhdGVnaWEgZGUgcmVtb3ZlciB2YXJpYWJsZXMuIFBhcmEgZWxsbyBhcXXDrSBzZSB1dGlsaXphIGVsIHNjcmlwdCBgdXBkYXRlKG1vZGUsIH4uLSB2YXJpYWJsZSlgLCB5IGVsIGNyaXRlcmlvIHBhcmEgZGVzY2FydGFyIGEgbGFzIHZhcmlhYmxlcyBzZXLDoSwgcGFzbyBhIHBhc28sIHF1aXRhciBsYSB2YXJpYWJsZSBjb24gZWwgKnAtdmFsdWUqIG1heW9yLiBBc8OtIGhhc3RhIGNvbnRhciBjb24gdW4gbW9kZWxvIGNvbiB2YXJpYWJsZXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMuXAoKUGFyYSBlamVtcGxpZmljYXIgZXN0ZSBtw6l0b2RvIGRlIGFjdHVhbGl6YWNpw7NuIGRlIG1vZGVsb3MsIHNlIHBhcnRlIGRlbCDDumx0aW1vIG1vZGVsbyBjb25zdHJ1aWRvIHByZXZpYW1lbnRlLCBlbCBgbThgLCBxdWUgaW5jbHV5ZSBhIHRvZGFzIGxhcyB2YXJpYWJsZXMgZGlzcG9uaWJsZXMgZW4gZWwgZGF0YWZyYW1lICoqbXRjYXJzKiouIEluaWNpYWxtZW50ZSBzZSBkZWJlIHJldmlzYXIgbG9zICpwLXZhbHVlcyogZGUgbGFzIHZhcmlhYmxlcyBkZWwgbW9kZWxvIHBhcmEsIGVuIHByaW5jaXBpbywgaWRlbnRpZmljYXIgbGEgZGUgbWF5b3IgdmFsb3IuCgpgYGB7cn0Kc3VtbWFyeShtOCkKYGBgCgpMYSB2YXJpYWJsZSBgY2FyYmAgKG7Dum1lcm8gZGUgY2FyYnVyYWRvcmVzKSBmdWUgbGEgcXVlIHJlZ2lzdHLDsyBlbCAqcC12YWx1ZSogbWF5b3IsIHBvciBsbyBxdWUgc2UgZGVjaWRpw7MgcmV0aXJhcmxhIGRlbCBtb2RlbG8gY29uIGVsIGNvbWFuZG8gYHVwZGF0ZSgpYC4KCmBgYHtyfQptOSA8LSB1cGRhdGUobTgsIH4uLSBjYXJiKQpzdW1tYXJ5KG05KQpgYGAKCkEgcGFydGlyIGRlbCBudWV2byBtb2RlbG8gYG05YCBzZSBpZGVudGlmaWPDsyBxdWUgbGEgdmFyaWFibGUgYHZzYCAoZm9ybWEgZGVsIG1vdG9yLCB5YSBzZWEgcmVjdG8gbyBlbiAiViIpIGZ1ZSBsYSBzaWd1aWVudGUgdmFyaWFibGUgY29uIG1heW9yICpwLXZhbHVlKiwgcG9yIGxvIHF1ZSBzZSByZW11ZXZlIGEgY29udGludWFjacOzbiwgeSBsb3MgZGF0b3Mgc2UgZ3VhcmRhbiBjb21vIHVuIG1vZGVsbyBudWV2by4KCmBgYHtyfQptMTAgPC0gdXBkYXRlKG05LCB+Li0gdnMpCnN1bW1hcnkobTEwKQpgYGAKCkEgY29udGludWFjacOzbiBzZSBpZGVudGlmaWPDsyBxdWUgbGEgdmFyaWFibGUgYGRyYXRgICh0b3JxdWUpIGZ1ZSBsYSBkZSBtYXlvciAqcC12YWx1ZSogZW4gZWwgbW9kZWxvIGBtMTBgLCBwb3IgbG8gcXVlIHJlbXVldmUgdGFtYmnDqW4uCgpgYGB7cn0KbTExIDwtIHVwZGF0ZShtMTAsIH4uLSBkcmF0KQpzdW1tYXJ5KG0xMSkKYGBgCgpBIHBhcnRpciBkZWwgbW9kZWxvIGBtMTFgIHNlIGlkZW50aWZpY8OzIHF1ZSBsYSB2YXJpYWJsZSBgZGlzcGAgKGRlc3BsYXphbWllbnRvKSB0dXZvIGVsICpwLXZhbHVlKiBtYXlvciwgcG9yIGxvIHF1ZSBzZSByZW1vdmnDsyBlbiBlbCBudWV2byBtb2RlbG8gYG0xMmAuCgpgYGB7cn0KbTEyIDwtIHVwZGF0ZShtMTEsIH4uLSBkaXNwKQpzdW1tYXJ5KG0xMikKYGBgCgpBIHBhcnRpciBkZWwgbW9kZWxvIGBtMTJgIHNlIGlkZW50aWZpY8OzIHF1ZSBsYSB2YXJpYWJsZSBgZ2VhcmAgKG7Dum1lcm8gZGUgdmVsb2NpZGFkZXMpIHR1dm8gZWwgKnAtdmFsdWUqIG1heW9yLCBwb3IgbG8gcXVlIHNlIHJlbW92acOzIGVuIGVsIG51ZXZvIG1vZGVsbyBgbTEzYC4KCmBgYHtyfQptMTMgPC0gdXBkYXRlKG0xMiwgfi4tIGdlYXIpCnN1bW1hcnkobTEzKQpgYGAKCkEgcGFydGlyIGRlbCBtb2RlbG8gYG0xM2Agc2UgaWRlbnRpZmljw7MgcXVlIGxhIHZhcmlhYmxlIGBxc2VjYCAoYWNlbGVyYWNpw7NuIGVuIGVsIHByaW1lciBjdWFydG8gZGUgbWlsbGEpIHR1dm8gZWwgKnAtdmFsdWUqIG1heW9yLCBwb3IgbG8gcXVlIHNlIHJlbW92acOzIGVuIGVsIG51ZXZvIG1vZGVsbyBgbTE0YC4KCmBgYHtyfQptMTQgPC0gdXBkYXRlKG0xMywgfi4tIHFzZWMpCnN1bW1hcnkobTE0KQpgYGAKCkEgcGFydGlyIGRlbCBtb2RlbG8gYG0xNGAgc2UgaWRlbnRpZmljw7MgcXVlIGxhIHZhcmlhYmxlIGBhbWAgKHRpcG8gZGUgdHJhbnNtaXNpw7NuOiBhdXRvbcOhdGljYSBvIG1hbnVhbCkgdHV2byBlbCAqcC12YWx1ZSogbWF5b3IsIHBvciBsbyBxdWUgc2UgcmVtb3Zpw7MgZW4gZWwgbnVldm8gbW9kZWxvIGBtMTVgLgoKYGBge3J9Cm0xNSA8LSB1cGRhdGUobTE0LCB+Li0gYW0pCnN1bW1hcnkobTE1KQpgYGAKCkZpbmFsbWVudGUgc2UgY29uc3RydXnDsyBlbCBtb2RlbG8gYG0xNWAgZW4gZWwgcXVlIHNlIGVuY29udHLDsyBxdWUgdG9kYXMgc3VzIHZhcmlhYmxlcyBzb24gZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMsIHkgZG9uZGUgZWwgdGFtYcOxbyBkZWwgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24gZGVsIG1vZGVsbyAoKnItY3VhZHJhZG8qKSBlcyBhY2VwdGFibGUgeSBwZXJtaXRlIGV4cGxpY2FyIGNhc2kgZWwgODglIGRlbCBjb21wb3J0YW1pZW50byBkZSBsYSB2YXJpYWJsZSBleHBsaWNhZGEgKGBtcGdgKS4gRGUgbWFuZXJhIHF1ZSBzZSBwdWVkZSB0b21hciBsYSBkZWNpc2nDs24gZGUgZmluYWxpemFyIGVsIHByb2Nlc28gZGUgYWN0dWFsaXphY2nDs24gZGVsIG1vZGVsbyBoYXN0YSBlc3RlIG1vbWVudG8uCgoKIyMgQmlibGlvZ3JhZsOtYS4K