1. Librerías

La función library() se utiliza para cargar bibliotecas, o grupos de funciones y conjuntos de datos que no están incluidos en la distribución de la base R. Funciones básicas que realizan una regresión lineal de mínimos cuadrados y otros análisis simples vienen estándar con la distribución de la base, pero las funciones más exóticas requieren bibliotecas adicionales. Aquí cargamos el paquete MASS, que es una gran la recopilación de conjuntos de datos y funciones. También cargamos el paquete ISLR, que incluye los conjuntos de datos asociados a este libro.

library (MASS)
library (ISLR)

Si recibe un mensaje de error al cargar cualquiera de estas bibliotecas, probablemente indica que la biblioteca correspondiente no ha sido instalada todavía en tu sistema. Algunas bibliotecas, como MASS, vienen con R y no necesitan se instalen por separado en su ordenador. Sin embargo, otros paquetes, como ISLR, deben ser descargados la primera vez que se usen. Esto puede hacerse directamente desde dentro de R. Por ejemplo, en un sistema Windows, seleccione la opción Install.packages en la pestaña Packages. Después de seleccionar cualquier sitio espejo, un aparecerá una lista de los paquetes disponibles. Simplemente seleccione el paquete que desea instalar y R descargará automáticamente el paquete. Alternativamente, este puede hacerse en la línea de comandos R mediante install.packages(“ISLR”). Esta instalación sólo tiene que hacerse la primera vez que se usa un paquete. Sin embargo, la función library() debe ser llamada cada vez que se desee utilizar un determinado paquete.

2. Escribir Funciones

Como hemos visto, R viene con muchas funciones útiles, y aún más funciones están disponibles a través de las bibliotecas R. Sin embargo, a menudo estaremos interesados en la realización de una operación para la que no se dispone de ninguna función. En este …es posible que queramos escribir nuestra propia función. Por ejemplo, debajo de nosotros proporcionan una simple función que se lee en las bibliotecas de ISLR y MASS, llamada LoadLibraries(). Antes de que hayamos creado la función, R devuelve un error si tratamos de llamarlo.

LoadLibraries
LoadLibraries()

Ahora creamos la función. Observe que los símbolos + son impresos por R y no debe ser escrito a máquina. El símbolo { informa a R que los múltiples comandos están a punto de ser introducidos. Al pulsar Enter después de escribir { hará que R imprima el símbolo +. Podemos entonces introducir tantos comandos como queramos, pulsando Enter después de cada uno. Finalmente el símbolo } informa a R que no hay más órdenes será ingresado.

LoadLibraries<-function (){ 
  library(ISLR) ;
  library(MASS) ;
  print("Se han cargado las librerías")}

Ahora, si tecleamos LoadLibraries, R nos dirá qué hay en la función.

LoadLibraries
## function () 
## {
##     library(ISLR)
##     library(MASS)
##     print("Se han cargado las librerías")
## }

Si llamamos a la función, las bibliotecas se cargan y la declaración de impresión es la salida.

LoadLibraries()

3. Regresión Lineal Simple

La biblioteca del MASS contiene el conjunto de datos de Boston, que registra la medv(media valor de la casa) para 506 vecindarios alrededor de Boston. Buscaremos predecir medv utilizando 13 predictores como rm (número medio de habitaciones por casa), age (edad media de las casas), y lstat (porcentaje de hogares con baja situación socioeconómica).

head(Boston )
##      crim zn indus chas   nox    rm  age    dis rad tax ptratio  black lstat
## 1 0.00632 18  2.31    0 0.538 6.575 65.2 4.0900   1 296    15.3 396.90  4.98
## 2 0.02731  0  7.07    0 0.469 6.421 78.9 4.9671   2 242    17.8 396.90  9.14
## 3 0.02729  0  7.07    0 0.469 7.185 61.1 4.9671   2 242    17.8 392.83  4.03
## 4 0.03237  0  2.18    0 0.458 6.998 45.8 6.0622   3 222    18.7 394.63  2.94
## 5 0.06905  0  2.18    0 0.458 7.147 54.2 6.0622   3 222    18.7 396.90  5.33
## 6 0.02985  0  2.18    0 0.458 6.430 58.7 6.0622   3 222    18.7 394.12  5.21
##   medv
## 1 24.0
## 2 21.6
## 3 34.7
## 4 33.4
## 5 36.2
## 6 28.7
names(Boston )
##  [1] "crim"    "zn"      "indus"   "chas"    "nox"     "rm"      "age"    
##  [8] "dis"     "rad"     "tax"     "ptratio" "black"   "lstat"   "medv"

Para saber más sobre el conjunto de datos, podemos escribir ?Boston.

Empezaremos usando la función lm() para ajustar una simple regresión lineal con el medv como respuesta y el lstat como predictor. El modelo básico La sintaxis es lm(y~x,data), donde y es la respuesta, x es el predictor, y es el conjunto de datos en el que se mantienen estas dos variables.

#lm.fit <-lm(medv~lstat, data=Boston )
attach(Boston)
lm.fit <-lm(medv~lstat)

El comando causa un error porque R no sabe dónde encontrar las variables Medv e Istat. La siguiente línea le dice a R que las variables son en Boston. Si adjuntamos Boston, la primera línea funciona bien porque R ahora reconoce las variables.

lm.fit <-lm(medv~lstat ,data=Boston )
attach (Boston )
lm.fit <-lm(medv~lstat)

Si tecleamos lm.fit, se obtiene alguna información básica sobre el modelo. Para obtener información más detallada, utilizamos summary(lm.fit). Esto nos da valores p y los errores estándar de los coeficientes, así como la estadística R2 y F-estadística para el modelo.

lm.fit #medv=34.55-0.95lstat, el beta (-.95) es negativo. Entre mayor aumenta este beta lstat baja el $$ de la ksa
## 
## Call:
## lm(formula = medv ~ lstat)
## 
## Coefficients:
## (Intercept)        lstat  
##       34.55        -0.95
summary (lm.fit)
## 
## Call:
## lm(formula = medv ~ lstat)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.168  -3.990  -1.318   2.034  24.500 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 34.55384    0.56263   61.41   <2e-16 ***
## lstat       -0.95005    0.03873  -24.53   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.216 on 504 degrees of freedom
## Multiple R-squared:  0.5441, Adjusted R-squared:  0.5432 
## F-statistic: 601.6 on 1 and 504 DF,  p-value: < 2.2e-16

Podemos usar la función names() para averiguar qué otras piezas de información se almacenan en lm.fit. Aunque podemos extraer estas cantidades por nombre, por ejemplo lm.fit$coefficients, es más seguro usar el extractor funciones como coef() para acceder a ellas.

names(lm.fit )
##  [1] "coefficients"  "residuals"     "effects"       "rank"         
##  [5] "fitted.values" "assign"        "qr"            "df.residual"  
##  [9] "xlevels"       "call"          "terms"         "model"
coef(lm.fit)
## (Intercept)       lstat 
##  34.5538409  -0.9500494

Para obtener un intervalo de confianza para las estimaciones de los coeficientes, podemos usa el comando confint().

confint(lm.fit)
##                 2.5 %     97.5 %
## (Intercept) 33.448457 35.6592247
## lstat       -1.026148 -0.8739505

La función predict() puede utilizarse para producir intervalos de confianza y intervalos de predicción para la predicción de medv para un valor dado de lstat.

predict(lm.fit ,data.frame(lstat=c(5 ,10 ,15) ), interval = "confidence") #A partir de los datos 
##        fit      lwr      upr
## 1 29.80359 29.00741 30.59978
## 2 25.05335 24.47413 25.63256
## 3 20.30310 19.73159 20.87461
predict(lm.fit ,data.frame(lstat=c(5 ,10 ,15) ), interval = "prediction") #a partir del modelo, el valor se ajusta al modelo, bandas de predicción no tienen datos solo el modelo, menos certeza que el de confianza
##        fit       lwr      upr
## 1 29.80359 17.565675 42.04151
## 2 25.05335 12.827626 37.27907
## 3 20.30310  8.077742 32.52846

Por ejemplo, el intervalo de confianza del 95% asociado con un valor lstat de 10 es (24,47, 25,63), y el intervalo de predicción del 95% es (12,828, 37,28). Como esperado, los intervalos de confianza y de predicción se centran en la el mismo punto (un valor predicho de 25.05 para el medv cuando el lstat es igual a 10), pero estos últimos son sustancialmente más amplios.

Ahora trazaremos medv e lstat junto con la menor regresión de cuadrados usando las funciones plot() y abline().

plot(lstat ,medv)
abline (lm.fit)

Hay algunas pruebas de la no linealidad en la relación entre el lstat y medv. Exploraremos este tema más tarde en este laboratorio.

La función abline() puede usarse para dibujar cualquier línea, no sólo la línea de regresión de mínimos cuadrados. Para dibujar una línea con intercepción a y pendiente b, escribimos abline(a,b). A continuación experimentamos con algunos ajustes adicionales para trazar líneas y puntos. El comando lwd=3 hace que el ancho de la línea de regresión se incremente en un factor de 3; esto funciona también para las funciones plot() y lines(). También podemos usar la opción pch para crear diferentes símbolos de trazado.

plot(lstat ,medv ,col ="red ")
abline (lm.fit ,lwd =3, col ="red ")

plot(lstat ,medv ,pch =20)
abline (lm.fit ,lwd =3)

plot(lstat ,medv ,pch ="x")
abline (lm.fit ,lwd =6)

plot (1:25 ,1:25, pch =1:25)

A continuación examinamos algunos gráficos de diagnóstico, varios de los cuales fueron discutidos en la sección 3.3.3. Se producen automáticamente cuatro gráficos de diagnóstico aplicando la función plot() directamente a la salida de lm(). En general, esta producirá una trama a la vez, y al pulsar Enter se generará la siguiente trama. Sin embargo, a menudo es conveniente ver las cuatro parcelas juntas. Podemos lograrlo usando la función par(), que le dice a R que divida el de la pantalla de visualización en paneles separados para que se puedan ver varios gráficos simultáneamente. Por ejemplo, par(mfrow=c(2,2)) divide la región de los gráficos en una cuadrícula de 2 × 2 paneles.

par(mfrow =c(2,2))
plot(lm.fit)

Alternativamente, podemos calcular los residuos de un ajuste de regresión lineal usando la función residuals(). La función rstudent() devolverá el los residuos estudiados, y podemos usar esta función para trazar los residuos contra los valores ajustados.

par(mfrow =c(1,2))
plot(predict (lm.fit), residuals (lm.fit))
plot(predict (lm.fit), rstudent (lm.fit))

Sobre la base de las parcelas residuales, hay algunas pruebas de no linealidad. Las estadísticas de apalancamiento pueden ser calculadas para cualquier número de predictores usando la función hatvalues().

plot(hatvalues (lm.fit ))

which.max (hatvalues (lm.fit))
## 375 
## 375

La función which.max() identifica el índice del elemento más grande de un vector. En este caso, nos dice qué observación tiene la mayor influencia estadística.

4. Regresión Lineal Múltiple

Para poder ajustar un modelo de regresión lineal múltiple es necesario usar los mínimos cuadrados, volvemos a utilizar la función lm(). La sintaxis lm(y~x1+x2+x3) se usa para ajustar un modelo con tres predictores, x1, x2 y x3. La función summary() ahora produce los coeficientes de regresión para todos los predictores.

library (MASS)
library (ISLR)

lm.fit<-lm(medv~lstat+age,data=Boston)
summary (lm.fit)
## 
## Call:
## lm(formula = medv ~ lstat + age, data = Boston)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.981  -3.978  -1.283   1.968  23.158 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 33.22276    0.73085  45.458  < 2e-16 ***
## lstat       -1.03207    0.04819 -21.416  < 2e-16 ***
## age          0.03454    0.01223   2.826  0.00491 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.173 on 503 degrees of freedom
## Multiple R-squared:  0.5513, Adjusted R-squared:  0.5495 
## F-statistic:   309 on 2 and 503 DF,  p-value: < 2.2e-16

El conjunto de datos de Boston contiene 13 variables, por lo que sería incomodo tener que escribir todo esto para realizar una regresión usando todos los predictores. En su lugar, podemos usar el siguiente atajo:

lm.fit <-lm(medv~.,data=Boston )
summary (lm.fit)
## 
## Call:
## lm(formula = medv ~ ., data = Boston)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.595  -2.730  -0.518   1.777  26.199 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  3.646e+01  5.103e+00   7.144 3.28e-12 ***
## crim        -1.080e-01  3.286e-02  -3.287 0.001087 ** 
## zn           4.642e-02  1.373e-02   3.382 0.000778 ***
## indus        2.056e-02  6.150e-02   0.334 0.738288    
## chas         2.687e+00  8.616e-01   3.118 0.001925 ** 
## nox         -1.777e+01  3.820e+00  -4.651 4.25e-06 ***
## rm           3.810e+00  4.179e-01   9.116  < 2e-16 ***
## age          6.922e-04  1.321e-02   0.052 0.958229    
## dis         -1.476e+00  1.995e-01  -7.398 6.01e-13 ***
## rad          3.060e-01  6.635e-02   4.613 5.07e-06 ***
## tax         -1.233e-02  3.760e-03  -3.280 0.001112 ** 
## ptratio     -9.527e-01  1.308e-01  -7.283 1.31e-12 ***
## black        9.312e-03  2.686e-03   3.467 0.000573 ***
## lstat       -5.248e-01  5.072e-02 -10.347  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.745 on 492 degrees of freedom
## Multiple R-squared:  0.7406, Adjusted R-squared:  0.7338 
## F-statistic: 108.1 on 13 and 492 DF,  p-value: < 2.2e-16

El vif() parte del paquete car, puede ser usada para calcular la variación de la inflación factores. La mayoría de los VIF son bajos a moderados para estos datos.

El VIF para cada término del modelo mide el efecto combinado que tienen las dependencias entre los regresores sobre la varianza de ese término. Si hay uno o más VIF grandes, hay multicolinealidad. La experiencia indica que si cualquiera de los VIF es mayor que 5 o 10, es indicio de que los coeficientes asociados de regresión están mal estimados debido a la multicolinealidad (Montgomery 2006).

El paquete car no es parte de la instalación de la base R, por lo que debe ser descargada la primera vez lo usas a través de la opción install.packages en R.

#install.packages('car')
library (car)
## Cargando paquete requerido: carData
vif(lm.fit)
##     crim       zn    indus     chas      nox       rm      age      dis 
## 1.792192 2.298758 3.991596 1.073995 4.393720 1.933744 3.100826 3.955945 
##      rad      tax  ptratio    black    lstat 
## 7.484496 9.008554 1.799084 1.348521 2.941491

¿Y si quisiéramos hacer una regresión usando todas las variables excepto uno? Por ejemplo, en el resultado de la regresión anterior, age tiene un alto valor p (p-value). Por lo tanto, podemos desear ejecutar una regresión excluyendo este predictor. Lo siguiente La sintaxis resulta en una regresión usando todos los predictores excepto age.

lm.fit1<-lm(medv~.-age-indus-rad-tax,data=Boston)
summary (lm.fit1)
## 
## Call:
## lm(formula = medv ~ . - age - indus - rad - tax, data = Boston)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.803  -2.832  -0.625   1.454  27.766 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  29.507997   4.872538   6.056 2.76e-09 ***
## crim         -0.061174   0.030377  -2.014 0.044567 *  
## zn            0.042032   0.013422   3.131 0.001842 ** 
## chas          3.029924   0.868349   3.489 0.000527 ***
## nox         -16.088513   3.232702  -4.977 8.93e-07 ***
## rm            4.149667   0.407685  10.179  < 2e-16 ***
## dis          -1.431665   0.188603  -7.591 1.59e-13 ***
## ptratio      -0.838640   0.117342  -7.147 3.19e-12 ***
## black         0.008292   0.002688   3.084 0.002153 ** 
## lstat        -0.525004   0.048351 -10.858  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.833 on 496 degrees of freedom
## Multiple R-squared:  0.7288, Adjusted R-squared:  0.7239 
## F-statistic: 148.1 on 9 and 496 DF,  p-value: < 2.2e-16

Como alternativa, se puede utilizar la función update().

lm.fit1<-update (lm.fit , ~.-age)

5. Términos de interacción

Es fácil incluir términos de interacción en un modelo lineal usando la función lm(). La sintaxis lstat:black le dice a R que incluya un término de interacción entre lstat y black. La sintaxis lstat x age incluye simultáneamente lstat, age, y el término de interacción lstat × age como predictores; es una abreviatura de lstat+age+lstat:age.

summary(lm(medv~lstat*age,data=Boston))
## 
## Call:
## lm(formula = medv ~ lstat * age, data = Boston)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.806  -4.045  -1.333   2.085  27.552 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 36.0885359  1.4698355  24.553  < 2e-16 ***
## lstat       -1.3921168  0.1674555  -8.313 8.78e-16 ***
## age         -0.0007209  0.0198792  -0.036   0.9711    
## lstat:age    0.0041560  0.0018518   2.244   0.0252 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.149 on 502 degrees of freedom
## Multiple R-squared:  0.5557, Adjusted R-squared:  0.5531 
## F-statistic: 209.3 on 3 and 502 DF,  p-value: < 2.2e-16

6. Transformaciones no lineales de los predictores

La función lm() también puede acomodar transformaciones no lineales de la predictores. Por ejemplo, dado un predictor X, podemos crear un predictor X2 usando I(X^2). La función I() es necesaria ya que el ^ tiene un significado especial en una fórmula; envolviendo como lo hacemos permite el uso estándar en R, que es para elevar X a la potencia 2. Ahora realizamos una regresión de medv a lstat y a lstat2.

library (MASS)
library (ISLR)

lm.fit2<-lm(medv~lstat+I(lstat^2), data=Boston)
summary(lm.fit2)
## 
## Call:
## lm(formula = medv ~ lstat + I(lstat^2), data = Boston)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -15.2834  -3.8313  -0.5295   2.3095  25.4148 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 42.862007   0.872084   49.15   <2e-16 ***
## lstat       -2.332821   0.123803  -18.84   <2e-16 ***
## I(lstat^2)   0.043547   0.003745   11.63   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.524 on 503 degrees of freedom
## Multiple R-squared:  0.6407, Adjusted R-squared:  0.6393 
## F-statistic: 448.5 on 2 and 503 DF,  p-value: < 2.2e-16

El p-value cercano a cero asociado con el término cuadrático sugiere que conduce a un modelo mejorado. Usamos la función anova() para profundizar cuantificar la medida en que el ajuste cuadrático es superior al ajuste lineal.

lm.fit <-lm(medv~lstat, data=Boston)
anova(lm.fit ,lm.fit2)
## Analysis of Variance Table
## 
## Model 1: medv ~ lstat
## Model 2: medv ~ lstat + I(lstat^2)
##   Res.Df   RSS Df Sum of Sq     F    Pr(>F)    
## 1    504 19472                                 
## 2    503 15347  1    4125.1 135.2 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Aquí el Modelo 1 representa el submodelo lineal que contiene un solo predictor, lstat, mientras que el Modelo 2 corresponde al modelo cuadrático más grande que tiene dos predictores, lstat e lstat2. La función anova() realiza una hipótesis prueba que compara los dos modelos. La hipótesis nula es que los dos modelos encajan los datos igualmente bien, y la hipótesis alternativa es que el modelo completo es superior. Aquí la estadística F-statistic es 135 y el valor p asociado es virtualmente cero. Esto proporciona una evidencia muy clara de que el modelo que contiene los predictores lstat e lstat2 es muy superior al modelo que sólo contiene el predictor lstat. Esto no es sorprendente, ya que antes vimos evidencia de la no linealidad en la relación entre medv y lstat. Si nosotros escribimos:

par(mfrow=c(2,2))
names(lm.fit2)
##  [1] "coefficients"  "residuals"     "effects"       "rank"         
##  [5] "fitted.values" "assign"        "qr"            "df.residual"  
##  [9] "xlevels"       "call"          "terms"         "model"
plot(lm.fit2)

plot(lm.fit)[1]

## NULL

Entonces vemos que cuando el término lstat2 se incluye en el modelo, hay un patrón poco discernible en los residuos.

Para crear un ajuste cúbico, podemos incluir un predictor de la forma I(X^3). Sin embargo, este enfoque puede empezar a ser incómodo para los de orden superior polinomios. Un mejor enfoque implica el uso de la función poly() para crear el polinomio dentro de lm(). Por ejemplo, el siguiente comando produce un ajuste polinómico de quinto orden:

lm.fit5<-lm(medv~poly(lstat,5), data=Boston)
summary (lm.fit5)
## 
## Call:
## lm(formula = medv ~ poly(lstat, 5), data = Boston)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -13.5433  -3.1039  -0.7052   2.0844  27.1153 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       22.5328     0.2318  97.197  < 2e-16 ***
## poly(lstat, 5)1 -152.4595     5.2148 -29.236  < 2e-16 ***
## poly(lstat, 5)2   64.2272     5.2148  12.316  < 2e-16 ***
## poly(lstat, 5)3  -27.0511     5.2148  -5.187 3.10e-07 ***
## poly(lstat, 5)4   25.4517     5.2148   4.881 1.42e-06 ***
## poly(lstat, 5)5  -19.2524     5.2148  -3.692 0.000247 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.215 on 500 degrees of freedom
## Multiple R-squared:  0.6817, Adjusted R-squared:  0.6785 
## F-statistic: 214.2 on 5 and 500 DF,  p-value: < 2.2e-16

Esto sugiere que la inclusión de términos polinómicos adicionales, hasta el quinto orden, lleva a una mejora en el ajuste del modelo! Sin embargo, una mayor investigación de los datos revelan que ningún término polinómico más allá del quinto orden tiene Valores significativos p en un ajuste de regresión.

Por supuesto, no estamos de ninguna manera restringidos a usar transformaciones polinómicas de los pronosticadores. Aquí intentamos una transformación logarítmica.

summary (lm(medv~log(rm),data=Boston))
## 
## Call:
## lm(formula = medv ~ log(rm), data = Boston)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -19.487  -2.875  -0.104   2.837  39.816 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -76.488      5.028  -15.21   <2e-16 ***
## log(rm)       54.055      2.739   19.73   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 6.915 on 504 degrees of freedom
## Multiple R-squared:  0.4358, Adjusted R-squared:  0.4347 
## F-statistic: 389.3 on 1 and 504 DF,  p-value: < 2.2e-16

7. Predictores cualitativos

Ahora examinaremos los datos de Carseats, que es parte de la biblioteca de ISLR. Intentaremos predecir las Sales (ventas de asientos de coche para niños) en 400 lugares basado en un número de predictores.

head( Carseats )
##   Sales CompPrice Income Advertising Population Price ShelveLoc Age Education
## 1  9.50       138     73          11        276   120       Bad  42        17
## 2 11.22       111     48          16        260    83      Good  65        10
## 3 10.06       113     35          10        269    80    Medium  59        12
## 4  7.40       117    100           4        466    97    Medium  55        14
## 5  4.15       141     64           3        340   128       Bad  38        13
## 6 10.81       124    113          13        501    72       Bad  78        16
##   Urban  US
## 1   Yes Yes
## 2   Yes Yes
## 3   Yes Yes
## 4   Yes Yes
## 5   Yes  No
## 6    No Yes
names(Carseats )
##  [1] "Sales"       "CompPrice"   "Income"      "Advertising" "Population" 
##  [6] "Price"       "ShelveLoc"   "Age"         "Education"   "Urban"      
## [11] "US"

Los datos de Carseats incluyen predictores cualitativos como Shelveloc, un indicador de la calidad de la ubicación de las estanterías, es decir, el espacio dentro de una tienda en la que se muestra el asiento del coche, en cada lugar. El predictor Shelveloc toma tres valores posibles, Malo, Medio y Bueno.

Dada una variable cualitativa como Shelveloc, R genera variables ficticias automáticamente. A continuación, ajustamos un modelo de regresión múltiple que incluye algunos términos de interacción.

lm.fit <-lm(Sales ~ . + Income:Advertising + Price:Age, data=Carseats )
summary (lm.fit)
## 
## Call:
## lm(formula = Sales ~ . + Income:Advertising + Price:Age, data = Carseats)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.9208 -0.7503  0.0177  0.6754  3.3413 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         6.5755654  1.0087470   6.519 2.22e-10 ***
## CompPrice           0.0929371  0.0041183  22.567  < 2e-16 ***
## Income              0.0108940  0.0026044   4.183 3.57e-05 ***
## Advertising         0.0702462  0.0226091   3.107 0.002030 ** 
## Population          0.0001592  0.0003679   0.433 0.665330    
## Price              -0.1008064  0.0074399 -13.549  < 2e-16 ***
## ShelveLocGood       4.8486762  0.1528378  31.724  < 2e-16 ***
## ShelveLocMedium     1.9532620  0.1257682  15.531  < 2e-16 ***
## Age                -0.0579466  0.0159506  -3.633 0.000318 ***
## Education          -0.0208525  0.0196131  -1.063 0.288361    
## UrbanYes            0.1401597  0.1124019   1.247 0.213171    
## USYes              -0.1575571  0.1489234  -1.058 0.290729    
## Income:Advertising  0.0007510  0.0002784   2.698 0.007290 ** 
## Price:Age           0.0001068  0.0001333   0.801 0.423812    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.011 on 386 degrees of freedom
## Multiple R-squared:  0.8761, Adjusted R-squared:  0.8719 
## F-statistic:   210 on 13 and 386 DF,  p-value: < 2.2e-16

La función contrasts() devuelve la codificación que R usa para variables dummy.

attach (Carseats )
contrasts (ShelveLoc )
##        Good Medium
## Bad       0      0
## Good      1      0
## Medium    0      1

Use ? Contrasts para aprender sobre otros contrastes y cómo configurarlos.

R ha creado una variable ficticia ShelveLocGood que toma un valor de 1 si la ubicación de la estantería es buena, y 0 en caso contrario. También ha creado un ShelveLocMedium variable dummie que es igual a 1 si la ubicación de la estantería es medio, y 0 de lo contrario. Una mala ubicación de la estantería corresponde a un cero para cada una de las dos variables dummies. El hecho de que el coeficiente de ShelveLocGood en la salida de la regresión es positivo indica que un buen La ubicación de las estanterías se asocia con altas ventas (en relación con una mala ubicación). Y ShelveLocMedium tiene un coeficiente positivo menor, lo que indica que un una estantería mediana lleva a mayores ventas que una mala estantería pero las ventas son menores que en una buena estantería.

8. Resuelve

Esta pregunta debe responderse utilizando el conjunto de datos de Carseats.

a. Ajuste un modelo de regresión simple para predecir ventas usando precio.

lm.fit <-lm(Sales~Price, data=Carseats)
summary (lm.fit)
## 
## Call:
## lm(formula = Sales ~ Price, data = Carseats)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.5224 -1.8442 -0.1459  1.6503  7.5108 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 13.641915   0.632812  21.558   <2e-16 ***
## Price       -0.053073   0.005354  -9.912   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.532 on 398 degrees of freedom
## Multiple R-squared:  0.198,  Adjusted R-squared:  0.196 
## F-statistic: 98.25 on 1 and 398 DF,  p-value: < 2.2e-16

b. Proporcione una interpretación de cada coeficiente en el modelo.

#Precio: Por cada unidad que aumente el precio, las ventas disminuyen en 0.054 unidades, manteniendo todo lo demás constante.El modelo estima que los precios mas altos están asociados a una disminución en ventas (por cada unidad de precio aumnetado hay un .054 decremento de ventas). El coeficiente es altamnete significativo. 

c. Utilizando el modelo, obtenga intervalos de confianza del 95% para los coeficientes.

confint(lm.fit)
##                  2.5 %      97.5 %
## (Intercept) 12.3978438 14.88598655
## Price       -0.0635995 -0.04254653

d. Ajuste un modelo de regresión múltiple para predecir ventas usando las variables Price, Urban y US.

lm.fit<-lm(Sales~Price+Urban+US,data=Carseats)
summary (lm.fit)
## 
## Call:
## lm(formula = Sales ~ Price + Urban + US, data = Carseats)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.9206 -1.6220 -0.0564  1.5786  7.0581 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 13.043469   0.651012  20.036  < 2e-16 ***
## Price       -0.054459   0.005242 -10.389  < 2e-16 ***
## UrbanYes    -0.021916   0.271650  -0.081    0.936    
## USYes        1.200573   0.259042   4.635 4.86e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.472 on 396 degrees of freedom
## Multiple R-squared:  0.2393, Adjusted R-squared:  0.2335 
## F-statistic: 41.52 on 3 and 396 DF,  p-value: < 2.2e-16

e. Proporcione una interpretación de cada coeficiente en el modelo. ¡Tenga cuidado, algunas de las variables en el modelo son cualitativas!

#Precio: Por cada unidad que aumente el precio, las ventas disminuyen en 0.057 unidades, manteniendo todo lo demás constante.El modelo estima que los precios mas altos están asociados a una disminución en ventas (por cada unidad de precio aumnetado hay un .057 decremento de ventas). El coeficiente es altamnete significativo.
#Urban: Manteniendo todo lo demás constante, las ventas en las tiendas ubicadas en áreas urbanas son 0.021 unidades menores que las ventas en las tiendas ubicadas en áreas no urbanas. Sin embargo, este coeficiente no es estadísticamente significativo (p-value=0.64), lo que sugiere que no hay una diferencia significativa en las ventas entre tiendas urbanas y no urbanas.
#US: Manteniendo todo lo demás constante, las ventas en las tiendas ubicadas en los Estados Unidos son 1.2 unidades mayores que las ventas en las tiendas ubicadas fuera de los Estados Unidos. Este coeficiente es estadísticamente significativo (p-value=0.000), lo que sugiere que hay una diferencia significativa en las ventas entre tiendas en los Estados Unidos y fuera de los Estados Unidos.

f. Escriba el modelo en forma de ecuación, teniendo cuidado de manejar las variables cualitativas correctamente.

#Sales=13.04-0.057*Price-0.021*Urban+1.2*US

g. Sobre la base de su respuesta a la pregunta anterior, ajuste un modelo más pequeño que solo use los predictores para los cuales hay evidencia de asociación con el resultado.

lm.fit<-lm(Sales~Price+US,data=Carseats)
summary (lm.fit)
## 
## Call:
## lm(formula = Sales ~ Price + US, data = Carseats)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.9269 -1.6286 -0.0574  1.5766  7.0515 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 13.03079    0.63098  20.652  < 2e-16 ***
## Price       -0.05448    0.00523 -10.416  < 2e-16 ***
## USYes        1.19964    0.25846   4.641 4.71e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.469 on 397 degrees of freedom
## Multiple R-squared:  0.2393, Adjusted R-squared:  0.2354 
## F-statistic: 62.43 on 2 and 397 DF,  p-value: < 2.2e-16

h. Utilizando el modelo de (g), obtenga intervalos de confianza del 95% para los coeficientes.

confint(lm.fit)
##                   2.5 %      97.5 %
## (Intercept) 11.79032020 14.27126531
## Price       -0.06475984 -0.04419543
## USYes        0.69151957  1.70776632