Está en la página 1de 20

Actividad 3: Modelos predictivos

Solución

Semestre 2021.1

Índice general
1 Regresión lineal 2
1.1 Estudio de correlación lineal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Modelo de regresión lineal. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Modelo de regresión lineal múltiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.4 Diagnosis del modelo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.5 Predicción del modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2 Regresión logística. 12
2.1 Estudio de relaciones entre variables. Análisis crudo de posibles factores de riesgo. . . . . . . 13
2.2 Modelo de regresión logística. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3 Predicción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4 Bondad del ajuste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.5 Curva ROC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.6 Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

En esta actividad se usará el fichero de datos (dat_Air) que contiene información sobre diferentes parámetros
sobre la calidad del aire de una determinada ciudad en el año 2021. Estos datos han sido medidos en tiempo
real en diferentes estaciones distribuidas en distintas zonas. Para nuestro estudio se ha seleccionado los datos
recopilados de este año por una de las estaciones móviles. Se muestran las medidas de una serie de variables,
tanto meteorológicas como de los principales contaminantes del aire (gases y partículas).
Todas ellas contribuyen para determinar el Índice de Calidad del Aire (ICA).
Las variables del fichero de datos son:

• Estación: Estación móvil.

• latitud: Latitud del lugar de medición.


• longitud: Longitud del lugar de medición.
• Fecha: Fecha de medición.

1
• Periodo: Mediciones cada hora. Periodo de 1 a 24 horas (diarias).
• SO2: Concentración de SO2 (dióxido de azfre) en 𝜇𝑔 /𝑚3 .

• H2S: Concentración de H2s (ácido sulfhidrico) en 𝜇𝑔 /𝑚3 .

• NO: Concentración de NO (óxido nítrico) en 𝜇𝑔 /𝑚3 .

• NO2: Concentración de (dióxido de nitrógeno) en 𝜇𝑔 /𝑚3 .

• NOX: Concentración de NOX (óxidos de nitrógeno) en 𝜇𝑔 /𝑚3 .

• O3: Concentración de Ozono en 𝜇𝑔 /𝑚3 .

• PM10: Partículas en suspensión <10 en 𝜇𝑔 /𝑚3 .

• PM25: Partículas en Suspensión PM 2,5 en 𝜇𝑔 /𝑚3 .

• BEN: Concentración de benceno en 𝜇𝑔 /𝑚3 .

• TOL: Tolueno en 𝜇𝑔 /𝑚3 .

• MXIL: MiXileno en 𝜇𝑔 /𝑚3 .


• Dir_Aire: Dirección del viento en grados.
• Vel: Velocidad del viento en 𝑚/𝑠𝑔.
• Tmp: Temperatura en grados centígrados.
• HR: Humedad relativa en % de hr.
• PRB: Presión Atmosférica en 𝑚𝑏.
• RS: Radiación Solar en 𝑊 /𝑚2 .
• LL: Precipitación en 𝑙/𝑚2 .

1 Regresión lineal
La calidad del aire ha sufrido cambios que afectan a nuestro modo de vida, por lo que resulta necesario
estudiarlo. Para ello se toman medidas de la emisión de diferentes contaminantes y de factores meteorológicos
como por ejemplo el viento, la precipitación, radiación solar o la temperatura, con el fin de buscar relaciones
entre dichas variables.
En este estudio se quiere demostrar la existencia de relación lineal entre los contaminantes atmosféricos y
las variables meteorológicas.

1.1 Estudio de correlación lineal.


Se pide calcularla matriz de correlación entre las variables siguientes: Contaminantes: O3, NO2 y PM10,
junto con las variables meteorológicas: Tmp, HR, RS, Vel y Dir_Aire.

a) Cual de los contaminantes atmosféricos citados anteriormente, tienen una mayor relación lineal con
la RS. Interpretar las relaciones de dicho contaminante con la RS y también con el resto de variables
metereológicas.

2
var.cor<- select(dat,O3, NO2,PM10, Tmp, HR, RS, Vel, Dir_Aire)
cor(var.cor, method = "pearson", use="pairwise.complete.obs")

## O3 NO2 PM10 Tmp HR RS


## O3 1.0000000 -0.65866770 -0.5477070 0.3799431 -0.40347883 0.3706419
## NO2 -0.6586677 1.00000000 0.5152062 -0.3606274 0.07741631 -0.1379997
## PM10 -0.5477070 0.51520620 1.0000000 -0.2674071 0.10956565 -0.1812253
## Tmp 0.3799431 -0.36062739 -0.2674071 1.0000000 -0.15583636 0.4059449
## HR -0.4034788 0.07741631 0.1095656 -0.1558364 1.00000000 -0.4015780
## RS 0.3706419 -0.13799973 -0.1812253 0.4059449 -0.40157798 1.0000000
## Vel 0.5189889 -0.34422266 -0.2530217 0.2055267 -0.45660255 0.5386392
## Dir_Aire -0.4192089 0.15112043 0.2015001 -0.2555900 0.09937266 -0.2781388
## Vel Dir_Aire
## O3 0.5189889 -0.41920894
## NO2 -0.3442227 0.15112043
## PM10 -0.2530217 0.20150011
## Tmp 0.2055267 -0.25558999
## HR -0.4566025 0.09937266
## RS 0.5386392 -0.27813878
## Vel 1.0000000 -0.12660561
## Dir_Aire -0.1266056 1.00000000

El contaminante con mayor relación con la RS, sería el O3 (ozono). Con respecto al ozono, se observa
que todas las variables meteorológicas tienen relación: temperatura, humedad relativa, la radiación solar,
velocidad y dirección del aire. La humedad relativa (HR), tiene una correlación alta negativa,ya que la
ausencia de lluvias favorece el aumento de contaminación.

b) Se toma la media diaria de cada una de las variables del apartado a) y posteriormente se estudia
de nuevo la relación pedida en dicho apartado. ¿Existe alguna diferencia en la relación entre las
nuevas variables construídas con los valores medios diarios, con respecto a los resultados obtenidos
anteriormente?

Fecha_1 <- strptime(x = as.character(Fecha),format = "%m/%d/%Y")


sum(is.na(Fecha_1))

## [1] 0

class(Fecha_1)

## [1] "POSIXlt" "POSIXt"

dat_m <- ddply(dat, c("Fecha_1"), summarise,N= length(O3),O3_m = mean(O3),NO2_m = mean(NO2), PM10_m = me


head(dat_m)

## Fecha_1 N O3_m NO2_m PM10_m Tmp_m HR_m RS_m


## 1 2021-01-01 24 51.20833 10.20833 28.66667 5.687500 91.37500 57.62500
## 2 2021-01-02 24 37.08333 13.75000 15.16667 5.629167 94.79167 66.00000
## 3 2021-01-03 24 44.25000 13.45833 22.45833 5.633333 98.33333 44.87500
## 4 2021-01-04 24 34.50000 21.58333 18.12500 4.054167 98.29167 49.04167
## 5 2021-01-05 24 17.50000 24.79167 20.08333 4.608333 98.41667 51.95833

3
## 6 2021-01-06 24 14.41667 19.83333 29.54167 4.816667 95.04167 71.37500
## Dir_Aire_m vel_m
## 1 259.6667 2.611250
## 2 250.9167 2.223750
## 3 238.3750 2.449583
## 4 232.9167 2.318750
## 5 240.7500 1.520000
## 6 244.4583 1.490833

var.cor_m<- select(dat_m,O3_m,NO2_m,PM10_m,Tmp_m,HR_m, RS_m,vel_m,Dir_Aire_m)


cor(var.cor_m, method = "pearson", use="pairwise.complete.obs")

## O3_m NO2_m PM10_m Tmp_m HR_m


## O3_m 1.0000000 -0.6917658 -0.45709596 0.205291755 -0.12578916
## NO2_m -0.6917658 1.0000000 0.61133807 -0.433878534 -0.12077999
## PM10_m -0.4570960 0.6113381 1.00000000 -0.186784344 -0.17811170
## Tmp_m 0.2052918 -0.4338785 -0.18678434 1.000000000 0.17793208
## HR_m -0.1257892 -0.1207800 -0.17811170 0.177932079 1.00000000
## RS_m 0.3261532 -0.3887028 -0.06702799 0.414430672 -0.05329388
## vel_m 0.4643958 -0.4096369 -0.22326567 -0.005729496 -0.40859634
## Dir_Aire_m -0.3477417 0.2211452 0.05609679 -0.186099789 -0.17341389
## RS_m vel_m Dir_Aire_m
## O3_m 0.32615320 0.464395767 -0.347741688
## NO2_m -0.38870280 -0.409636862 0.221145239
## PM10_m -0.06702799 -0.223265665 0.056096795
## Tmp_m 0.41443067 -0.005729496 -0.186099789
## HR_m -0.05329388 -0.408596336 -0.173413891
## RS_m 1.00000000 0.251470979 -0.316772739
## vel_m 0.25147098 1.000000000 0.001024755
## Dir_Aire_m -0.31677274 0.001024755 1.000000000

Las medias suavizan los valores de temperatura y HR, ya que puede haber descensos bruscos entre la franja
horaria de día y de noche, por lo que puede afectar al coeficiente de correlación.

1.2 Modelo de regresión lineal.

Se quiere explicar el nivel de ozono en función de la radiación solar.

a) Estimar por mínimos cuadrados ordinarios un modelo lineal que explique la variable (O3) en función
de la radiación solar (RS).

Se evaluará la bondad del ajuste, a partir del coeficiente de determinación.

#Estimacion del modelo


attach (dat)

## The following objects are masked from dat (pos = 3):


##
## BEN, Dir_Aire, Estacion, Fecha, H2S, HR, latitud, LL, longitud,
## MXIL, NO, NO2, NOX, O3, Periodo, PM10, PM25, PRB, RS, SO2, Tmp,
## TOL, Vel

4
Model_1<- lm(O3~RS, data=dat)
summary(Model_1)

##
## Call:
## lm(formula = O3 ~ RS, data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -44.498 -19.477 2.083 17.318 60.373
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 34.377975 0.343194 100.17 <2e-16 ***
## RS 0.059081 0.001721 34.32 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 22.06 on 7398 degrees of freedom
## (62 observations deleted due to missingness)
## Multiple R-squared: 0.1374, Adjusted R-squared: 0.1373
## F-statistic: 1178 on 1 and 7398 DF, p-value: < 2.2e-16

Se observa que la variable RS es significativa con un p_valor de 2.2e-16 existiendo una relación líneal positiva
entre ambas variables, con un coeficiente de determinación ajustado de 0.1374. Si se calcula el coeficiente
de correlación se tiene un valor de 0.3706, que como era de esperar, coincide con el obtenido en el apartado
anterior.
NOTA: Al tener un modelo con una sola variable, se podría tomar el coeficiente de determinación sin ajustar,
ya que su valor no se altera.

b) Para calcular el índice de calidad del aire, se establecen diferentes categorías, según sea la concentración
de cada contaminante. En este apartado se tomará como contaminante la concentración de PM10 y
se establecerán las siguientes categorías, para construir el PM10_cat (Indice de calidad del Aire, en
función de PM10):

Muy buena: valores de (0 a 40],


Buena: valores de (40 a 60],
Mejorable: valores de (60 a 120],
Mala: valores de (120 a 160],
Muy mala: valores de (160 a 724]
Se pide, construir un modelo de regresión lineal, tomando como variable dependiente (O3) y la variable
explicativa PM10_cat. Interpretar los resultados.

#Estimacion del modelo

dat[,"PM10_cat"] <- cut(dat$PM10, breaks = c(0,40,60,120,160,725), labels = c("Muy buena", "buena", "mej
head(dat)

## Estacion latitud longitud Fecha Periodo SO2 H2S NO NO2 NOX O3 PM10 PM25
## 1 12 43.52096 -5.690707 11/7/2021 22 1 4.3 1 19 20 14 38 15
## 2 12 43.52096 -5.690707 11/7/2021 21 1 2.7 4 21 26 11 36 12

5
## 3 12 43.52096 -5.690707 11/7/2021 20 1 2.1 2 18 20 16 30 12
## 4 12 43.52096 -5.690707 11/7/2021 19 1 1.3 1 10 10 24 21 17
## 5 12 43.52096 -5.690707 11/7/2021 18 1 1.3 1 8 7 36 15 12
## 6 12 43.52096 -5.690707 11/7/2021 17 1 1.4 1 8 9 55 24 10
## BEN TOL MXIL Dir_Aire Vel Tmp HR PRB RS LL PM10_cat
## 1 0.6 1.1 3.1 296 0.98 11.2 92 1025 37 0 Muy buena
## 2 0.9 1.3 2.2 185 0.99 11.9 88 1026 37 0 Muy buena
## 3 0.2 0.6 0.8 297 0.99 12.4 85 1026 37 0 Muy buena
## 4 0.3 0.6 1.0 295 0.99 12.4 83 1026 37 0 Muy buena
## 5 0.5 1.0 1.2 309 1.00 13.4 76 1026 37 0 Muy buena
## 6 0.2 0.3 0.2 23 1.00 14.1 71 1026 47 0 Muy buena

table(dat[,"PM10_cat"])

##
## Muy buena buena mejorable mala Muy mala
## 5368 683 833 244 290

dat$PM10_cat=relevel(dat$PM10_cat, ref = 'Muy buena')


Model<- lm(O3~factor(PM10_cat), data=dat)
summary(Model)

##
## Call:
## lm(formula = O3 ~ factor(PM10_cat), data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -50.576 -10.576 0.424 11.424 66.107
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 51.5765 0.2419 213.22 <2e-16 ***
## factor(PM10_cat)buena -22.3445 0.7197 -31.05 <2e-16 ***
## factor(PM10_cat)mejorable -36.6632 0.6599 -55.55 <2e-16 ***
## factor(PM10_cat)mala -44.0641 1.1626 -37.90 <2e-16 ***
## factor(PM10_cat)Muy mala -44.6837 1.0683 -41.83 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 17.69 on 7385 degrees of freedom
## (72 observations deleted due to missingness)
## Multiple R-squared: 0.4452, Adjusted R-squared: 0.4449
## F-statistic: 1481 on 4 and 7385 DF, p-value: < 2.2e-16

Se observa que la variable PM10_cat es significativa con un p_valor de 2.2e-16 existiendo una relación líneal
alta negativa entre ambas variables, con un coeficiente de determinación ajustado de 0.4452. En este caso es
una relación inversa, es decir con valores bajos de PM10, aumenta la concentración de O3.

1.3 Modelo de regresión lineal múltiple


Se quiere explicar el nivel de ozono en función de la radiación solar,concentración de NO2, temperatura
(Tmp) y dirección del aire (Dir_Aire).

6
a)Primero, se añadirá al modelo del apartado a), la variable explicativa (Dir_Aire).¿ El modelo ha mejorado?.

Model.a <- lm(O3~RS+Dir_Aire, data=dat)


summary(Model.a)

##
## Call:
## lm(formula = O3 ~ RS + Dir_Aire, data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -51.698 -17.196 1.004 15.521 58.004
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 51.060456 0.604354 84.49 <2e-16 ***
## RS 0.043873 0.001676 26.18 <2e-16 ***
## Dir_Aire -0.080668 0.002476 -32.58 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 20.63 on 7397 degrees of freedom
## (62 observations deleted due to missingness)
## Multiple R-squared: 0.2456, Adjusted R-squared: 0.2454
## F-statistic: 1204 on 2 and 7397 DF, p-value: < 2.2e-16

Si, existe una mejora del modelo, con un coeficiente de determinación ajustado de 0.2455.

b) Posteriormente se añade al modelo anterior la variable NO2. Existe una mejora del modelo?

Model.b <- lm(O3~RS+NO2+Dir_Aire, data=dat)


summary(Model.b)

##
## Call:
## lm(formula = O3 ~ RS + NO2 + Dir_Aire, data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -51.534 -11.356 0.036 10.819 56.549
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 67.865501 0.501158 135.42 <2e-16 ***
## RS 0.034134 0.001257 27.16 <2e-16 ***
## NO2 -1.435094 0.018689 -76.79 <2e-16 ***
## Dir_Aire -0.063746 0.001860 -34.26 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.39 on 7394 degrees of freedom
## (64 observations deleted due to missingness)
## Multiple R-squared: 0.5803, Adjusted R-squared: 0.5802
## F-statistic: 3408 on 3 and 7394 DF, p-value: < 2.2e-16

7
Si, existe una mejora del modelo, con un coeficiente de determinación ajustado de 0.5804.

c) Se toma la variable (Tmp) y se añade al modelo anterior. Se pide comprobar la presencia o no


colinealidad entre las variables (RS) y (Tmp). Podéis usar la librería (faraway) y estudiar el FIV(factor
de inflación de la varianza). Según la conclusión obtenida, discutir si sería indicado o no añadir la
variable (Tmp) al modelo. De ser afirmativa la respuesta, construye el modelo e interpretar el resultado.

# Se calculará el coeficiente de correlación entre las variables RS y Tmp


cor(x = RS, y = Tmp, method = "pearson")

## [1] 0.4059449

# Veamos cómo difieren las estimaciones del modelo global con ’RS’ y ’Tmp’, de los modelos de regresión
Model.g<-lm(O3~RS+Tmp, data=dat)
model.RS <- lm(O3~RS, data=dat )
model.Tmp<- lm(O3~Tmp, data=dat )
summary(Model.g)

##
## Call:
## lm(formula = O3 ~ RS + Tmp, data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -50.890 -17.625 1.076 16.521 55.702
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 15.119419 0.860783 17.57 <2e-16 ***
## RS 0.041386 0.001811 22.86 <2e-16 ***
## Tmp 1.471880 0.060749 24.23 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 21.23 on 7397 degrees of freedom
## (62 observations deleted due to missingness)
## Multiple R-squared: 0.2008, Adjusted R-squared: 0.2006
## F-statistic: 929.3 on 2 and 7397 DF, p-value: < 2.2e-16

summary(model.RS)

##
## Call:
## lm(formula = O3 ~ RS, data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -44.498 -19.477 2.083 17.318 60.373
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)

8
## (Intercept) 34.377975 0.343194 100.17 <2e-16 ***
## RS 0.059081 0.001721 34.32 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 22.06 on 7398 degrees of freedom
## (62 observations deleted due to missingness)
## Multiple R-squared: 0.1374, Adjusted R-squared: 0.1373
## F-statistic: 1178 on 1 and 7398 DF, p-value: < 2.2e-16

summary(model.Tmp)

##
## Call:
## lm(formula = O3 ~ Tmp, data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -53.664 -17.859 1.736 17.121 54.719
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 12.38430 0.88195 14.04 <2e-16 ***
## Tmp 2.03192 0.05751 35.33 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 21.97 on 7398 degrees of freedom
## (62 observations deleted due to missingness)
## Multiple R-squared: 0.1444, Adjusted R-squared: 0.1442
## F-statistic: 1248 on 1 and 7398 DF, p-value: < 2.2e-16

# Cargamos la librería faraway


library(faraway)

## Registered S3 methods overwritten by 'lme4':


## method from
## cooks.distance.influence.merMod car
## influence.merMod car
## dfbeta.influence.merMod car
## dfbetas.influence.merMod car

##
## Attaching package: 'faraway'

## The following object is masked from 'package:plyr':


##
## ozone

## The following objects are masked from 'package:car':


##
## logit, vif

9
# Cáculo de FIV
vif(Model.g)

## RS Tmp
## 1.194288 1.194288

# Se compara con 1/(1-R2)


1/(1-summary(Model.g)$r.squared)

## [1] 1.251252

# Construímos el modelo

Model.c <- lm(O3~RS+NO2+Dir_Aire+Tmp, data=dat)


summary(Model.c)

##
## Call:
## lm(formula = O3 ~ RS + NO2 + Dir_Aire + Tmp, data = dat)
##
## Residuals:
## Min 1Q Median 3Q Max
## -51.497 -11.322 0.128 10.842 56.059
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 66.449114 0.909958 73.024 <2e-16 ***
## RS 0.033273 0.001339 24.852 <2e-16 ***
## NO2 -1.423176 0.019749 -72.063 <2e-16 ***
## Dir_Aire -0.063277 0.001877 -33.712 <2e-16 ***
## Tmp 0.087959 0.047170 1.865 0.0623 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15.38 on 7393 degrees of freedom
## (64 observations deleted due to missingness)
## Multiple R-squared: 0.5805, Adjusted R-squared: 0.5803
## F-statistic: 2558 on 4 and 7393 DF, p-value: < 2.2e-16

Por un lado el coeficiente de correlación entre ambas variables es de 0.406, por lo que existe relación lineal
entre ambas variables. Primero se compara el modelo globlal, con cada uno de los modelos simples. El
coeficiente estimado para Tmp difiere del estimado con la regresión múltiple,en cambio el coeficiente de RS
es aproximadamente el mismo. Esto podría ser un indicativo de un problema, pero no está claro.
Se procederá a detectar posibles efectos de multicolinealidad. Puesto que uno de los efectos principales de la
multicolinealidad es la inflación de la varianza y covarianza de las estimaciones, se calculará el FIV(factor
de inflación de la varianza).
El FIV = 1,194 resulta menor que su equivalente en el modelo global, 1/(1−R2) = 1,251. Ademá el valor de
FIV, es muy bajo.
A la vista de los últimos resultados, no se encuentra indicios de multicolinealidad entre los regresores ’RS’ y
’Tmp’, respecto a los los criterios de diagnóstico propuestos.

10
NOTA: Generalmente, valores de un FIV superiores a 10 dan indicios de un problema de multicolinealidad,
si bien su magnitud depende del modelo ajustado.(Otros autores consideran valores por encima de 4). Es
mejor compararlo con su equivalente en el modelo ajustado, esto es, 1/(1 − R2), donde R2 es el coeficiente
de determinación del modelo. Los valores FIV mayores que esta cantidad implican que la relación entre las
variables explicativas es mayor que la que existe entre la respuesta y los predictores, y por tanto dan indicios
de multicolinealidad.
Por un lado, si sólo se toman las variables RS y Tmp, y se efectúa el estudio de colinealidad, nos da que
no se encuentran indicios,pero por otro lado, al añadir al modelo las variables, NO2 y Dir_Aire, además de
no apreciarse una mejora del mismo, se ve que la variable deja de ser significativa, si se mantiene el nivel
de significación de 5%. En estos casos, se debería proceder a estudiar la posibilidad de colinealidad de la
Tmp, con el resto de variables explicativas del modelo. ( No se ha pedido en la realización de esta
actividad).
Se dará por aceptable el modelo con una significación de 0.1.

1.4 Diagnosis del modelo.

Para la diagnosis se escoge el modelo construído en el apartado b) y se piden dos gráficos: uno con los valores
ajustados frente a los residuos (que nos permitirá ver si la varianza es constante) y el gráfico cuantil-cuantil
que compara los residuos del modelo con los valores de una variable que se distribuye normalmente(QQ plot).
Interpretar los resultados.

residuos <- rstandard(Model.b)


valor.ajustados <- fitted(Model.b)
plot(valor.ajustados, residuos)
3
2
1
residuos

0
−3 −2 −1

−40 −20 0 20 40 60 80

valor.ajustados

11
qqnorm(residuos)

Normal Q−Q Plot


3
2
Sample Quantiles

1
0
−3 −2 −1

−4 −2 0 2 4

Theoretical Quantiles

A la vista del gráfico se observa un patrón de dispersión irregular. Es decir no es un patrón aleatorio de los
residuos. Esto indica que no se cumple el supuesto de varianza constante en los errores del modelo.
Por otro lado el QQ plot, muestra que los datos se ajustan bien a una normal.

1.5 Predicción del modelo

Según el modelo del apartado c), calcular la concentración de O3, si se tienen valores de RS de 180, NO2 de
15, Dir_Aire de 250 grados y Tmp de 20 grados centígrados.

newdata = data.frame(RS = 180, NO2=15, Dir_Aire=250, Tmp=20)


predict(Model.c, newdata)

## 1
## 37.03046

Se obtiene un valor de 37.

2 Regresión logística.
Se quiere estudiar la concentración de O3 del aire de una determinada ciudad.

12
Primero se creará una nueva variable dicotómica llamada icO3 (índice de calidad del aire basado en O3). Se
codificará de la siguiente manera:
buena: valores de (0 a 80],
mejorable: valores de (80 a 100]
Posteriormente se recodificará como valor 0,la categoría ” buena” en caso contrario se codificará con el valor
1.
Nota: Dicho índice de calidad se ha recodificado conforme a nuestros datos.

2.1 Estudio de relaciones entre variables. Análisis crudo de posibles factores de


riesgo.

a) Se Visualiza la relación entre icO3 y las variables independientes: RS, Vel y HR. Para ello se
recodificaran las variables RS y Vel, dejando la variable cuantitativa HR, tal como está en la base de
datos.

Para comprobar si existe asociación entre las variable dependiente y cada una de las variables explicativas,
se aplicará el test Chi-cuadrado de Pearson. Un resultado significativo nos dirá que existe asociación.

b) Posteriormente, para conocer el grado de dicha asociación, se calculará las OR (Odds-Ratio).


Importante: Para el cálculo de las OR, se partirá de la tabla de contingencia y se calculará a partir de
su fórmula. Debéis implementar dicha fórmula en R. Interpretar las OR calculadas.

Se procederán a categorizar las variables explicativas de la siguiente forma:


Radiación solar:
normal_baja:(0 a 100],
normal_alta: valores de (100 a 700)
Velocidad del viento:
flojo: valores de (0 a 3],
moderado: valores de (3 a 10]

a)

dat<-na.omit(dat)
dat[,"O3_cat2"] <- cut(dat$O3, breaks = c(0,80,100), labels = c("buena", "mejorable"))
icO3<-(dat$O3_cat2=="mejorable")
icO3<-ifelse(icO3==TRUE, 1, 0)
dat[,"RS_cat2"] <- cut(dat$RS, breaks = c(0,100,700), labels = c("Normal_baja", "Normal_alta"))
dat[,"Vel_cat2"] <- cut(dat$Vel, breaks = c(0,3,10), labels = c("flojo", "moderado"))
tab1 = table(icO3,dat$RS_cat2)
chi.test<-chisq.test(tab1)
print(chi.test)

##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tab1
## X-squared = 51.143, df = 1, p-value = 8.586e-13

13
# Se toma la variable velocidad del viento

tab2= table(icO3,dat$Vel_cat2)
chi.test<-chisq.test(tab2)
print(chi.test)

##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tab2
## X-squared = 16.848, df = 1, p-value = 4.05e-05

Tanto para RS como Vel, se obtiene un p-valor inferior a 0.05, por lo que podemos concluir que existe relación
entre la cantidad de concentración de O3 y dichos factores. b)

#Se calculan las OR para RS y Vel

OR.RS <-(tab1[1]*tab1[4])/(tab1[2]*tab1[3])
OR.RS

## [1] 3.084066

OR.Vel <-(tab2[1]*tab2[4])/(tab2[2]*tab2[3])
OR.Vel

## [1] 1.923125

Con referencia al cálculo de las OR se tiene:


-RS_cat2: OR de 3,08 por lo que nos indica que un lugar con RS más alta , tiene una probabilidad 3 veces
mayor de que su concentración de O3 sea superior a 80.
-Vel_cat2: OR de 1,92, por lo que la velocidad del viento moderada con respecto al flojo conlleva que se
tenga dos veces más posibilidades de tener una concentración de O3 sea superior a 80.
Con respecto a HR, no se puede seguir el procedimiento anterior para el cálculo de la OR puesto que HR es
una variable cuantitativa sin recodificar. En este caso, para calcular las OR, deberíamos construir un modelo
de regresión logística.

2.2 Modelo de regresión logística.

a) Estimar el modelo de regresión logística tomando como variable dependiente icO3 y variable explicativa
RS_cat2. Calcula la OR a partir de los resultados del modelo y su intervalo de confianza. ¿Se puede
considerar que la radiación solar es un factor de riesgo?. Justifica tu respuesta.

logit_1 <- glm(formula=icO3~RS_cat2, data=dat, family=binomial)


summary(logit_1)

##
## Call:
## glm(formula = icO3 ~ RS_cat2, family = binomial, data = dat)

14
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.2838 -0.2838 -0.1627 -0.1627 2.9433
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -4.3184 0.1289 -33.51 < 2e-16 ***
## RS_cat2Normal_alta 1.1262 0.1635 6.89 5.58e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1567.0 on 7249 degrees of freedom
## Residual deviance: 1517.4 on 7248 degrees of freedom
## AIC: 1521.4
##
## Number of Fisher Scoring iterations: 7

exp(coefficients(logit_1))

## (Intercept) RS_cat2Normal_alta
## 0.01332169 3.08406625

exp(confint(logit_1))

## Waiting for profiling to be done...

## 2.5 % 97.5 %
## (Intercept) 0.01023653 0.01698063
## RS_cat2Normal_alta 2.24659234 4.26945409

Se oberva un AIC de 1521,4. Por lo tanto la RS con una OR de 3,08, se puede considerar un factor de
riesgo para el aumento de la concentración de O3. Como era de esperar, es el mismo resultado obtenido en
el apartado anterior.

b) Se crea un nuevo modelo con la misma variable dependiente y se añade al apartado a) la variable Tmp.
Interpretar si nos encontramos o no ante una posible variable de confusión.

logit_2 <- glm(formula=icO3~RS_cat2+Tmp, data=dat, family=binomial)


summary(logit_2)

##
## Call:
## glm(formula = icO3 ~ RS_cat2 + Tmp, family = binomial, data = dat)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.4483 -0.2438 -0.1852 -0.1430 3.1384
##

15
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -5.84198 0.36321 -16.084 < 2e-16 ***
## RS_cat2Normal_alta 0.78931 0.17634 4.476 7.60e-06 ***
## Tmp 0.10627 0.02237 4.751 2.02e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1567.0 on 7249 degrees of freedom
## Residual deviance: 1492.8 on 7247 degrees of freedom
## AIC: 1498.8
##
## Number of Fisher Scoring iterations: 7

Se obseva en el modelo que la temperatura es significativa, pero la asociación de la radiación solar con la
variable dependiente difiere significativamente según se considere, o no esta variable. Por lo que se podría
estar ante una variable de confusión. Esto es posible ya que la Tmp, tanto está relacionada con O3, como
con RS.

c) Se añade al modelo del apartado a) la variable HR. Estudiar la existencia o no de interacción entre las
variables explicativas RS y HR. Interpretar.

# Se analiza el modelo con interacción

logit_3 <- glm(formula=icO3~RS_cat2+HR+RS_cat2:HR, data=dat, family=binomial)


summary(logit_3)

##
## Call:
## glm(formula = icO3 ~ RS_cat2 + HR + RS_cat2:HR, family = binomial,
## data = dat)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.5835 -0.2786 -0.1594 -0.1210 3.1533
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.082392 0.574197 0.143 0.886
## RS_cat2Normal_alta -3.889610 0.885394 -4.393 1.12e-05 ***
## HR -0.050471 0.006905 -7.309 2.69e-13 ***
## RS_cat2Normal_alta:HR 0.057975 0.010626 5.456 4.87e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1567.0 on 7249 degrees of freedom
## Residual deviance: 1475.4 on 7246 degrees of freedom
## AIC: 1483.4
##
## Number of Fisher Scoring iterations: 7

16
En este caso, si existe interacción entre dichas variables, ya que el término de interacción RS_cat2:HR, es
estadísticamente significativo (p-value= 5,02e-08).

d) Se crea un nuevo modelo con las variables explicativas RS_cat2 y Dir_Aire. ¿Existe una mejora del
modelo?

RS_Rel=relevel(dat$RS_cat2, ref = 'Normal_baja')


logit_4 <- glm(formula=icO3~RS_Rel+Dir_Aire, data=dat, family=binomial)
summary(logit_4)

##
## Call:
## glm(formula = icO3 ~ RS_Rel + Dir_Aire, family = binomial, data = dat)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -0.4808 -0.2562 -0.1291 -0.0948 3.5542
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.769425 0.178290 -15.533 <2e-16 ***
## RS_RelNormal_alta 0.680208 0.167719 4.056 5e-05 ***
## Dir_Aire -0.010014 0.001106 -9.055 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1567.0 on 7249 degrees of freedom
## Residual deviance: 1404.8 on 7247 degrees of freedom
## AIC: 1410.8
##
## Number of Fisher Scoring iterations: 8

En base al indicador AIC = 1410,8, se ve una mejora en el modelo, con referencia a los anteriores.

2.3 Predicción

Según el modelo del apartado d), calcularla probabilidad de que la concentración de O3 sea o no superior a
80, con unos valores de RS_cat2=“Normal_alta” y Dir_Aire=40.

pred<-predict(logit_4, data.frame(RS_Rel = "Normal_alta",Dir_Aire=40),type = "response")


pred

## 1
## 0.07657714

El modelo del apartado d) nos predice una probablidad del 7,6 % de que icO3 sea superior a 80, suponiendo
los valores que se han tomado para las variables explicativas.

17
2.4 Bondad del ajuste

Usa el test de Hosman-Lemeshow para ver la bondad de ajuste, tomando el modelo del apartado d). En la
librería ResourceSelection hay una función que ajusta el test de Hosmer- Lemeshow.

library(ResourceSelection)

## ResourceSelection 0.3-5 2019-07-22

hoslem.test(icO3,fitted(logit_4))

##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: icO3, fitted(logit_4)
## X-squared = 32.269, df = 8, p-value = 8.336e-05

A la vista de los resultados el ajuste no es óptimo con un p-value = 8,3e-05.

2.5 Curva ROC

Dibujar la curva ROC, y calcular el área debajo de la curva con el modelo del apartado d). Discutir el
resultado.

library(pROC)

## Type 'citation("pROC")' for a citation.

##
## Attaching package: 'pROC'

## The following objects are masked from 'package:stats':


##
## cov, smooth, var

prob_low=predict(logit_4, dat, type="response")


r=roc(icO3,prob_low, data=dat)

## Setting levels: control = 0, case = 1

## Setting direction: controls < cases

plot(r)

18
1.0
0.8
0.6
Sensitivity
0.4
0.2
0.0

1.0 0.5 0.0


Specificity

auc(r)

## Area under the curve: 0.7758

En el modelo, el área por debajo de la curva toma el valor de 0,775, por lo que la habilidad del modelo para
predecir es buena.

2.6 Conclusiones

Se puede concluir que si existe correlación lineal entre las variables meteorológicas y contaminantes
atmosféricos. Con respecto al ozono, se observa que las variables más relacionadas son la temperatura, la
radiación solar y velocidad del aire. La humedad relativa (HR), tiene una correlación alta negativa, ya que la
ausencia de lluvias favorece el aumento de contaminación. Por otro lado se observa que las medias suavizan
los valores de algunas de las variables, como temperatura (Tmp) y humedad relativa (HR),por lo que afecta
a los resultados. Destacar que en meteorología, es frecuente trabajar con medias, medianas y cuantiles. Una
vez ajustado el modelo del apartado b), se ha obtenido la recta de regresión:
y = 67,8655 + 0,034 * RS -1,435 * NO2 - 0,0637 * Dir_Aire , con un coeficiente de determinación
ajustado de 0,5802, por lo que la varianza explicada por el modelo es del 58%.
Al introducir en el modelo anterior, la variable Tmp, se ve que deja de ser significativa, por lo que se
puede estar ante un problema de colinealidad. Se comprueba que aunque existe relación lineal entre RS y
Tmp, con dicha variable no hay colinealidad, por lo que se debería proceder al estudio de las relaciones con
las otras variables del modelo.
En vista a los resultados obtenidos con los modelos de regresión logística, las variables explicativas
RS_cat2 y Vel_cat2, pueden considerarse factores de riesgo para el aumento de la concentración de O3,
con OR de 3,08 y 1,92, respectivamente. Debido a la correlación entre algunas de las variables escogidas
para este estudio, se debe tener cuidado de no introducir en los modelos posibles variables de confusión.
19
Por ejemplo, se ha comprobado que al incorporar la variable Tmp al modelo de regresión logística del
apartado a),la asociación de la radiación solar con la variable dependiente difiere significativamente. Por
otro lado también es interesante el estudio de las posibles interacciones. Como ejemplo se ha escogido el
modelo con los factores RS_cat2 y HR, dando un resultado significativo. Una vez ajustado el último
modelo,con las variables explicativas RS_cat2 y Dir_Aire, se obtiene un indicador AIC = 1410,8, por lo
que se puede apreciar una mejora en el modelo, con referencia a los anteriores. Del estudio de la curva
ROC, se puede deducir que la habilidad de dicho modelo para predecir es buena, aunque el test de
Hosman-Lemeshow no haya dado significativo.
Mencionar que el modelo mejora si se hubiera añadido la variable HR y el término de interacción con un
AIC de 1367,9.En este caso, el test nos daría un p_value de 0,11, por lo que el ajuste sería óptimo.

20

También podría gustarte