Está en la página 1de 12

Regresion: Consumo energético

Se desea construir un modelo para predecir la energía consumida per cápita ( ), en


función del porcentaje de residentes en áreas metropolitanas ( ), usando los datos
contenidos en states.rds :

1. Examine/grafique los datos antes de usarlos


2. Imprima e interprete el modelo obtenido
3. Grafique el modelo para verificar las suposiciones

Seleccione uno o más predictores para adicionar a su modelo y repita los pasos 1-3. ¿Es este
modelo significativamente mejor que el modelo con solo como único predictor?

Lectura de datos
In [1]: # lee los datos de un archivo .rds
states.data <- readRDS("states.rds")

In [2]: # obtiene las etiquetas de los datos


states.info <- data.frame(attributes(states.data)
[c("names","var.labels")])

In [3]: # imprime las etiquetas


states.info
names var.labels

state State

region Geographical region

pop 1990 population

area Land area, square miles

density People per square mile

metro Metropolitan area population, %

waste Per capita solid waste, tons

energy Per capita energy consumed, Btu

miles Per capita miles/year, 1,000

toxic Per capita toxics released, lbs

green Per capita greenhouse gas, tons

house House '91 environ. voting, %

senate Senate '91 environ. voting, %

csat Mean composite SAT score

vsat Mean verbal SAT score

msat Mean math SAT score

percent % HS graduates taking SAT

expense Per pupil expenditures prim&sec

income Median household income, $1,000


names var.labels

high % adults HS diploma

In [4]: # imprime las 5 primeras filas de datos


states.data[1:5,]
state region pop area density metro waste energy miles toxic ⋯ house

Alabama South 4041000 52423 77.08 67.4 1.11 393 10.5 27.86 ⋯ 30

Alaska West 550000 570374 0.96 41.1 0.91 991 7.2 37.41 ⋯

Arizona West 3665000 113642 32.25 79.0 0.79 258 9.7 19.65 ⋯ 13

Arkansas South 2351000 52075 45.15 40.1 0.85 330 8.9 24.60 ⋯ 25

California West 29760000 155973 190.80 95.7 1.51 246 8.7 3.26 ⋯ 50

In [5]: # define un sub data frame con 2 variables


sts.me.en <- subset(states.data, select = c("metro", "energy"))

In [6]: # resumen de variables metro y energy


summary(sts.me.en)
metro energy
Min. : 20.40 Min. :200.0
1st Qu.: 46.98 1st Qu.:285.0
Median : 67.55 Median :320.0
Mean : 64.07 Mean :354.5
3rd Qu.: 81.58 3rd Qu.:371.5
Max. :100.00 Max. :991.0
NA's :1 NA's :1

Se observa que existe un elemento faltante (NA) en ambas variables.

Analisis de correlacion
In [7]: # correlación entre metro y energy
cor(sts.me.en)
metro energy

metro 1 NA

energy NA 1

La correlacion no esta definida, debido a los NA en los datos. Primero debemos eliminirlos.

In [8]: # depura NA
states.data1 <- na.omit(states.data)

In [9]: # define un sub data frame con 2 variables sin NA


sts.me.en1 <- subset(states.data1, select = c("metro", "energy"))

In [10]: # resumen de variables metro y energy


summary(sts.me.en1)
metro energy
Min. : 20.40 Min. :200.0
1st Qu.: 47.92 1st Qu.:287.0
Median : 67.55 Median :320.0
Mean : 64.31 Mean :343.6
In [11]: # correlación entre metro y energy
cor(sts.me.en1)
metro energy

metro 1.0000000 -0.3116753

energy -0.3116753 1.0000000

Regresion univariable
In [12]: # primeramente realizaremos una regresión univariable
ener.mod1 <- lm(energy ~ metro,data=states.data1)

In [13]: # resumen de resultados


summary(ener.mod1)

Call:
lm(formula = energy ~ metro, data = states.data1)

Residuals:
Min 1Q Median 3Q Max
-179.17 -54.21 -21.64 15.07 448.02

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 449.8382 50.4472 8.917 1.37e-11 ***
metro -1.6526 0.7428 -2.225 0.031 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 112.3 on 46 degrees of freedom


Multiple R-squared: 0.09714, Adjusted R-squared: 0.07751
F-statistic: 4.949 on 1 and 46 DF, p-value: 0.03105
In [14]: # grafica energy vs metro
plot(sts.me.en1)
# adiciona línea regresión
abline(coef(ener.mod1),lty=5)

In [15]: # examina objeto regresión


class(ener.mod1)
'lm'

In [16]: # lista nombres del objeto


names(ener.mod1)
'coefficients' 'residuals' 'effects' 'rank' 'fitted.values' 'assign' 'qr' 'df.residual'
'xlevels' 'call' 'terms' 'model'

In [17]: # lista métodos aplicables al objeto


methods(class = class(ener.mod1))
[1] add1 alias anova case.names c
oerce
[6] confint cooks.distance deviance dfbeta d
fbetas
[11] drop1 dummy.coef effects extractAIC f
amily
[16] formula hatvalues influence initialize k
appa
[21] labels logLik model.frame model.matrix n
In [18]: # imprime intervalos de confianza
confint(ener.mod1)
2.5 % 97.5 %

(Intercept) 348.293299 551.3831003

metro -3.147856 -0.1573365

Las regresiones lineales por mínimos cuadrados dependen de varias suposiciones:

1. residuos normalmente distribuidos y homocedásticos


2. errores independientes
3. relaciones lineales

Understanding Diagnostic Plots http://data.library.virginia.edu/diagnostic-plots/


(http://data.library.virginia.edu/diagnostic-plots/)

In [19]: # par y layout ayudan a combinar gráficos


# mfrow=c(nrows, ncols) crea una matriz
par(mfrow=c(1,2))

In [20]: # gráficos de diagnóstico


plot(ener.mod1)

Analisis multivariable
In [21]: # define un sub data frame con 7 variables
states.data2 <- subset(states.data1, select =
c("metro", "miles", "toxic", "green", "income"

In [22]: # matriz de dispersión


# panel.hist es la funcion que grafica histogramas en la diagonal (no modi
panel.hist <- function(x, ...)
{
usr <- par("usr"); on.exit(par(usr))
par(usr = c(usr[1:2], 0, 1.5) )
h <- hist(x, plot = FALSE)
breaks <- h$breaks; nB <- length(breaks)
y <- h$counts; y <- y/max(y)
rect(breaks[-nB], 0, breaks[-1], y, col = "black", ...)
}

# grafica matriz de dispersión


pairs(states.data2,panel=panel.smooth,diag.panel=panel.hist,upper.panel

In [23]: # correlación entre las 7 variables


# para evitar colinealidad valores <0.7
cor(states.data2)
metro miles toxic green income college energy

metro 1.0000000 -0.5981199 -0.1848052 -0.4111107 0.6777118 0.4636072 -0.3116753

miles -0.5981199 1.0000000 0.2039695 0.4966382 -0.4336843 -0.2579751 0.4740483


metro miles toxic green income college energy

toxic -0.1848052 0.2039695 1.0000000 0.2622973 -0.4381486 -0.3113628 0.5985974

green -0.4111107 0.4966382 0.2622973 1.0000000 -0.3655698 -0.2993456 0.7706181

income 0.6777118 -0.4336843 -0.4381486 -0.3655698 1.0000000 0.8024261 -0.4483793

college 0.4636072 -0.2579751 -0.3113628 -0.2993456 0.8024261 1.0000000 -0.3794125

Las correlaciones se pueden apreciar mejor de manera grafica usando corrplot

Para usarlo primero debemos instarlo copiando lo siguiente en la consola del Anaconda:
conda install -c conda-forge r-corrplot

An Introduction to corrplot Package https://cran.r-project.org/web/packages/corrplot/vignettes


/corrplot-intro.html (https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-
intro.html)

In [24]: # carga la libreria corrplot, calcula correlaciones y las grafica


library(corrplot)
M<-cor(states.data2)
corrplot(M, method="circle")
corrplot 0.84 loaded
Regresión multivariable
In [25]: # realiza la correlacion usando las variables metro, miles e income solame
summary(ener.mod2 <- lm(energy ~ metro+miles+income,data=states.data1

Call:
lm(formula = energy ~ metro + miles + income, data = states.data1)

Residuals:
Min 1Q Median 3Q Max
-138.41 -51.76 -10.61 28.60 379.66

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 145.894 194.707 0.749 0.4577
metro 1.205 1.010 1.193 0.2391
miles 42.693 15.445 2.764 0.0083 **
income -8.063 3.282 -2.457 0.0180 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 99.72 on 44 degrees of freedom


Multiple R-squared: 0.3194, Adjusted R-squared: 0.2729
F-statistic: 6.881 on 3 and 44 DF, p-value: 0.0006703

¿Cuál es la regresión multivariable con mayor poder predictivo?

Incluir interacciones en el modelo nos permite evaluar si la asociación entre un predictor y su


respuesta depende de un segundo predictor

In [26]: # regresión multivariable con interacción y cuadrados de toxic y green


summary(ener.mod3 <- lm(energy ~ toxic*green+I(toxic^2)+I(green^2),

Call:
lm(formula = energy ~ toxic * green + I(toxic^2) + I(green^2),
data = states.data1)

Residuals:
Min 1Q Median 3Q Max
-110.48 -31.16 -1.39 24.44 204.35

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 201.942874 32.059022 6.299 1.47e-07 ***
toxic -2.269437 1.712104 -1.326 0.19216
green 5.252933 1.821773 2.883 0.00618 **
I(toxic^2) 0.002473 0.016743 0.148 0.88326
I(green^2) -0.029078 0.018292 -1.590 0.11942
toxic:green 0.142213 0.061854 2.299 0.02654 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 54.74 on 42 degrees of freedom


Multiple R-squared: 0.8042, Adjusted R-squared: 0.7809
F-statistic: 34.5 on 5 and 42 DF, p-value: 7.766e-14
La regresión anterior es equivalente a la expresión:

Una manera equivalente de calcular lo mismo sería:

In [27]: summary(ener.mod3 <- lm(energy ~ toxic+green+toxic:green+I(toxic^2)

Call:
lm(formula = energy ~ toxic + green + toxic:green + I(toxic^2) +
I(green^2), data = states.data1)

Residuals:
Min 1Q Median 3Q Max
-110.48 -31.16 -1.39 24.44 204.35

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 201.942874 32.059022 6.299 1.47e-07 ***
toxic -2.269437 1.712104 -1.326 0.19216
green 5.252933 1.821773 2.883 0.00618 **
I(toxic^2) 0.002473 0.016743 0.148 0.88326
I(green^2) -0.029078 0.018292 -1.590 0.11942
toxic:green 0.142213 0.061854 2.299 0.02654 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 54.74 on 42 degrees of freedom


Multiple R-squared: 0.8042, Adjusted R-squared: 0.7809
F-statistic: 34.5 on 5 and 42 DF, p-value: 7.766e-14

En otras palabras:

Los dos puntos (:) indican interacción (multiplicación)

De los resultados se observa que los términos cuadráticos no son significativos, por lo que la
regresión tendría la forma:

In [28]: summary(ener.mod4 <- lm(energy ~ toxic*green,data=states.data1))


Call:
lm(formula = energy ~ toxic * green, data = states.data1)

Al ser la variable no significativa, tendremos la expresión final para la regresión:

In [29]: summary(ener.mod5 <- lm(energy ~ green+toxic:green,data=states.data1

Call:
lm(formula = energy ~ green + toxic:green, data = states.data1)

Residuals:
Min 1Q Median 3Q Max
-144.986 -32.174 -3.178 24.981 205.762

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 224.10982 14.76351 15.180 < 2e-16 ***
green 2.92910 0.62254 4.705 2.44e-05 ***
green:toxic 0.08822 0.01361 6.482 5.99e-08 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 54.78 on 45 degrees of freedom


Multiple R-squared: 0.79, Adjusted R-squared: 0.7806
F-statistic: 84.63 on 2 and 45 DF, p-value: 5.635e-16

In [30]: # gráficos de diagnóstico


plot(ener.mod5)

¿A qué conclusiones llegamos analizando los gráficos de diagnóstico?

Regresion con variables categoricas


A seguir usaremos variables categóricas ( ), pero primero aseguraremos que R las
reconozca como tales.
Factors in R https://www.stat.berkeley.edu/classes/s133/factors.html
(https://www.stat.berkeley.edu/classes/s133/factors.html)

In [31]: # vista compacta de la estructura interna


str(states.data1$region)
Factor w/ 4 levels "West","N. East",..: 3 1 3 1 1 2 3 3 3 1 ...

In [32]: # convierte en factor la variable categórica con valores limitados


states.data1$region <- factor(states.data1$region)

In [33]: # imprime frecuencia de valores


table(states.data1$region)

West N. East South Midwest


11 9 16 12

In [34]: # regresión con predictores categóricos


summary(ener.mod6 <- lm(energy ~ region,data=states.data1))

Call:
lm(formula = energy ~ region, data = states.data1)

Residuals:
Min 1Q Median 3Q Max
-143.13 -50.13 -23.62 17.36 418.82

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 367.18 33.25 11.044 2.87e-14 ***
regionN. East -118.07 49.56 -2.382 0.0216 *
regionSouth 12.94 43.19 0.300 0.7658
regionMidwest -23.18 46.03 -0.504 0.6170
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 110.3 on 44 degrees of freedom


Multiple R-squared: 0.1677, Adjusted R-squared: 0.111
F-statistic: 2.956 on 3 and 44 DF, p-value: 0.04268

En la regresión anterior se usaron los contrastes por defecto para definir las regiones, con el
1er nivel como referencia. Podemos cambiar la referencia o usar otra codificación usando la
función C.

Contrast Matrices https://stat.ethz.ch/R-manual/R-devel/library/stats/html/contrast.html


(https://stat.ethz.ch/R-manual/R-devel/library/stats/html/contrast.html)
In [35]: # imprime los contrastes por defecto
contrasts(states.data1$region)
N. East South Midwest

West 0 0 0

N. East 1 0 0

South 0 1 0

Midwest 0 0 1

In [36]: # regresión con N. East como base


summary(lm(energy ~ C(region, base=2),data=states.data1))

Call:
lm(formula = energy ~ C(region, base = 2), data = states.data1)

Residuals:
Min 1Q Median 3Q Max
-143.13 -50.12 -23.62 17.36 418.82

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 249.11 36.76 6.777 2.43e-08 ***
C(region, base = 2)1 118.07 49.56 2.382 0.0216 *
C(region, base = 2)3 131.01 45.95 2.851 0.0066 **
C(region, base = 2)4 94.89 48.63 1.951 0.0574 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 110.3 on 44 degrees of freedom


Multiple R-squared: 0.1677, Adjusted R-squared: 0.111
F-statistic: 2.956 on 3 and 44 DF, p-value: 0.04268

In [ ]:

También podría gustarte