Modelo de Regresión Logistica

INTRODUCCION

La regresión logística es el conjunto de modelos estadísticos utilizados cuando se desea conocer la relación entre una variable dependiente cualitativa, dicotómica (regresión logística binaria o binomial) o con más de dos categorías (regresión logística multinomial). Una o más variables explicativas independientes, llamadas covariables, ya sean cualitativas o cuantitativas.

Para entender como funcionan:

Las covariables cualitativas deben ser dicotómicas, tomando valor 0 para su ausencia y 1 para su presencia. Los valores posibles de estas ecuaciones varían entre 0 y 1. Un valor cercano a 0 significa que es muy improbable que (Y) haya ocurrido, y un valor cercano a 1 significa que es muy probable que tuviese lugar.

Por lo tanto se requiere:

Desarrollar un trabajo en el cual su grupo ajuste un modelo (clasificador) que permita predecir la variable respuesta (Y) a partir de algunas variables predictoras (X).

Para ello tenga en cuenta los siguientes aspectos:

*1. Seleccione las variables que considere importantes en la predicción de la variable respuesta y presente una descripción de las mismas (estadísticas descriptivas).

*2. Con las variables seleccionadas encuentre un buen modelo que permita predecir la variable respuetsa y que cumpla con las condiciones minimas de bondad de ajuste (variables significativas de manera independiente, conjunata y no multicolinelaidad).

*3. Interprete el efecto que que tienen las variables significativas en la clasificación de la variablerespeusta (interprete los odds ratio de las variables significativas en el modelo).

*4. Presente la curva roc del modelo utilizando un punto de corte inical de 0.5, e indique la sensibilidad y especificidad obtenida por el modelo.

*5. ¿Se puede mejorar el poder de clasificación del modelo?. De ser asi, indique el mejor punto de corte para predecir la alerta de tsunami y presente nuevamente la sensibilidad y especificidad. Que puede concluir al respecto.

*6. Finalmente presente la ecuación matematica del modelo final.

*7. Concluya

0. Configuración inicial-Librerias requeridas

librerias requeridas:

1) MASS
2) visdat
3) doBy
4) FactoMineR
5) factoextra
6) caret
7) e1071
8) pROC
9) class
10) rpart
11) rpart.plot1

1. SELECCION DE LAS VARIABLES Y DESCRIPCION ESTADISTICA

Aquí seleccionas las variables relevantes para el análisis y presentas un resumen estadístico de las mismas. El código que corresponde a esta parte es:

# Cargando los datos desde un archivo CSV
library(readr)
df_weather <- read_csv("df_weather.csv")
## Rows: 2500 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Rain
## dbl (5): Temperature, Humidity, Wind_Speed, Cloud_Cover, Pressure
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
RainData = df_weather
View(df_weather)

str(RainData)
## spc_tbl_ [2,500 × 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ Temperature: num [1:2500] 23.7 27.9 25.1 23.6 20.6 ...
##  $ Humidity   : num [1:2500] 89.6 46.5 83.1 74.4 96.9 ...
##  $ Wind_Speed : num [1:2500] 7.34 5.95 1.37 7.05 4.64 ...
##  $ Cloud_Cover: num [1:2500] 50.5 4.99 14.86 67.26 47.68 ...
##  $ Pressure   : num [1:2500] 1032 993 1007 983 981 ...
##  $ Rain       : chr [1:2500] "rain" "no rain" "no rain" "rain" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   Temperature = col_double(),
##   ..   Humidity = col_double(),
##   ..   Wind_Speed = col_double(),
##   ..   Cloud_Cover = col_double(),
##   ..   Pressure = col_double(),
##   ..   Rain = col_character()
##   .. )
##  - attr(*, "problems")=<externalptr>

El archivo contiene 2500 registros y 6 columnas.La descripción general de las columnas:

  • Temperature: Temperatura en grados Celsius (float).
  • Humidity: Humedad relativa en porcentaje (float).
  • Wind_Speed: Velocidad del viento en m/s (float).
  • Cloud_Cover: Cobertura de nubes en porcentaje (float).
  • Pressure: Presión atmosférica en hPa (float).
  • Rain: Variable objetivo indicando si llueve o no (categoría: rain o no rain).

se aborda cada paso del taller: seleccionar las variables predictoras relevantes y 2) ajustar un modelo inicial de clasificación para predecir la variable respuesta (“Rain”). Comenzaré con la limpieza y transformación de datos.

Verificacion si hay datos faltantes:

# Verificar si hay valores faltantes en el conjunto de datos
summary(RainData)  # Resumen general, incluye conteo de NAs
##   Temperature       Humidity        Wind_Speed         Cloud_Cover       
##  Min.   :10.00   Min.   : 30.01   Min.   : 0.009819   Min.   :  0.01504  
##  1st Qu.:16.36   1st Qu.: 47.34   1st Qu.: 4.761909   1st Qu.: 23.90002  
##  Median :22.54   Median : 63.92   Median : 9.908572   Median : 49.48828  
##  Mean   :22.58   Mean   : 64.35   Mean   : 9.906255   Mean   : 49.65810  
##  3rd Qu.:28.98   3rd Qu.: 81.56   3rd Qu.:14.948408   3rd Qu.: 75.32414  
##  Max.   :35.00   Max.   :100.00   Max.   :19.999132   Max.   : 99.99780  
##     Pressure          Rain          
##  Min.   : 980.0   Length:2500       
##  1st Qu.: 996.9   Class :character  
##  Median :1013.4   Mode  :character  
##  Mean   :1014.3                     
##  3rd Qu.:1031.7                     
##  Max.   :1050.0
# Visualización de valores faltantes
library(visdat)
vis_dat(RainData)  # Visualiza la estructura de los datos y posibles valores faltantes

# Conteo de valores faltantes por variable
colSums(is.na(RainData))  # Número de NAs por columna
## Temperature    Humidity  Wind_Speed Cloud_Cover    Pressure        Rain 
##           0           0           0           0           0           0

Identificacion de Datos Atipicos

# Función para identificar valores atípicos usando el rango intercuartil (IQR)
detect_outliers <- function(x) {
  Q1 <- quantile(x, 0.25, na.rm = TRUE)
  Q3 <- quantile(x, 0.75, na.rm = TRUE)
  IQR <- Q3 - Q1
  lower_bound <- Q1 - 1.5 * IQR
  upper_bound <- Q3 + 1.5 * IQR
  outliers <- which(x < lower_bound | x > upper_bound)
  return(outliers)
}

# Aplicar a las variables numéricas del conjunto de datos
numeric_cols <- sapply(RainData, is.numeric)
outliers_list <- lapply(RainData[, numeric_cols], detect_outliers)

# Mostrar los índices de los datos atípicos por variable
outliers_list
## $Temperature
## integer(0)
## 
## $Humidity
## integer(0)
## 
## $Wind_Speed
## integer(0)
## 
## $Cloud_Cover
## integer(0)
## 
## $Pressure
## integer(0)

Integracion al flujo de trabajo:

## 'data.frame':    2500 obs. of  6 variables:
##  $ Temperature: num  23.7 27.9 25.1 23.6 20.6 ...
##  $ Humidity   : num  89.6 46.5 83.1 74.4 96.9 ...
##  $ Wind_Speed : num  7.34 5.95 1.37 7.05 4.64 ...
##  $ Cloud_Cover: num  50.5 4.99 14.86 67.26 47.68 ...
##  $ Pressure   : num  1032 993 1007 983 981 ...
##  $ Rain       : Factor w/ 2 levels "no rain","rain": 2 1 1 2 1 1 1 1 1 2 ...
##   Temperature       Humidity        Wind_Speed         Cloud_Cover       
##  Min.   :10.00   Min.   : 30.01   Min.   : 0.009819   Min.   :  0.01504  
##  1st Qu.:16.36   1st Qu.: 47.34   1st Qu.: 4.761909   1st Qu.: 23.90002  
##  Median :22.54   Median : 63.92   Median : 9.908572   Median : 49.48828  
##  Mean   :22.58   Mean   : 64.35   Mean   : 9.906255   Mean   : 49.65810  
##  3rd Qu.:28.98   3rd Qu.: 81.56   3rd Qu.:14.948408   3rd Qu.: 75.32414  
##  Max.   :35.00   Max.   :100.00   Max.   :19.999132   Max.   : 99.99780  
##     Pressure           Rain     
##  Min.   : 980.0   no rain:2186  
##  1st Qu.: 996.9   rain   : 314  
##  Median :1013.4                 
##  Mean   :1014.3                 
##  3rd Qu.:1031.7                 
##  Max.   :1050.0
## Temperature    Humidity  Wind_Speed Cloud_Cover    Pressure        Rain 
##           0           0           0           0           0           0

## $Temperature
## integer(0)
## 
## $Humidity
## integer(0)
## 
## $Wind_Speed
## integer(0)
## 
## $Cloud_Cover
## integer(0)
## 
## $Pressure
## integer(0)

Diagramas de caja para todas las variables numéricas

# Diagramas de caja para todas las variables numéricas
par(mfrow = c(2, 3))  # Ajusta según el número de variables
lapply(names(RainData[, numeric_cols]), function(col) {
  boxplot(RainData[[col]], main = col, col = "lightblue", horizontal = TRUE)
})
## [[1]]
## [[1]]$stats
##          [,1]
## [1,] 10.00184
## [2,] 16.35924
## [3,] 22.53645
## [4,] 28.97834
## [5,] 34.99521
## 
## [[1]]$n
## [1] 2500
## 
## [[1]]$conf
##          [,1]
## [1,] 22.13768
## [2,] 22.93521
## 
## [[1]]$out
## numeric(0)
## 
## [[1]]$group
## numeric(0)
## 
## [[1]]$names
## [1] ""
## 
## 
## [[2]]
## [[2]]$stats
##          [,1]
## [1,] 30.00507
## [2,] 47.33388
## [3,] 63.92080
## [4,] 81.56191
## [5,] 99.99748
## 
## [[2]]$n
## [1] 2500
## 
## [[2]]$conf
##          [,1]
## [1,] 62.83919
## [2,] 65.00240
## 
## [[2]]$out
## numeric(0)
## 
## [[2]]$group
## numeric(0)
## 
## [[2]]$names
## [1] ""
## 
## 
## [[3]]
## [[3]]$stats
##              [,1]
## [1,]  0.009819276
## [2,]  4.761373594
## [3,]  9.908571944
## [4,] 14.949797483
## [5,] 19.999132255
## 
## [[3]]$n
## [1] 2500
## 
## [[3]]$conf
##           [,1]
## [1,]  9.586618
## [2,] 10.230526
## 
## [[3]]$out
## numeric(0)
## 
## [[3]]$group
## numeric(0)
## 
## [[3]]$names
## [1] ""
## 
## 
## [[4]]
## [[4]]$stats
##             [,1]
## [1,]  0.01503811
## [2,] 23.89434240
## [3,] 49.48828432
## [4,] 75.33540634
## [5,] 99.99779518
## 
## [[4]]$n
## [1] 2500
## 
## [[4]]$conf
##          [,1]
## [1,] 47.86275
## [2,] 51.11382
## 
## [[4]]$out
## numeric(0)
## 
## [[4]]$group
## numeric(0)
## 
## [[4]]$names
## [1] ""
## 
## 
## [[5]]
## [[5]]$stats
##           [,1]
## [1,]  980.0145
## [2,]  996.9233
## [3,] 1013.4330
## [4,] 1031.7434
## [5,] 1049.9856
## 
## [[5]]$n
## [1] 2500
## 
## [[5]]$conf
##          [,1]
## [1,] 1012.333
## [2,] 1014.533
## 
## [[5]]$out
## numeric(0)
## 
## [[5]]$group
## numeric(0)
## 
## [[5]]$names
## [1] ""

Las estadísticas descriptivas indican lo siguiente sobre las variables predictoras:

  • Temperature: Rango de 10.00 a 34.99 °C, con una media de 22.58 °C y desviación estándar de 7.32.
  • Humidity: Oscila entre 30% y 99.99%, con una media de 64.35% y desviación estándar de 19.95.
  • Wind_Speed: Va de 0.01 m/s a 20 m/s, con una media de 9.91 m/s.
  • Cloud_Cover: Varía entre 0% y 99.99%, con una media de 49.66%.
  • Pressure: Valores entre 980.01 y 1049.98 hPa, con una media de 1014.31 hPa.

La variable objetivo Rain tiene valores binarios:

1 = Llueve (12.56% de los datos). 0 = No llueve (87.44% de los datos).

Se dividen los datos en conjuntos de entrenamiento y prueba, y luego ajustar un modelo inicial de clasificación

Resumen de todas las variables a través de la media y la desviación por grupo de lluvia

library(table1)
## 
## Attaching package: 'table1'
## The following objects are masked from 'package:base':
## 
##     units, units<-
table1(~ . | Rain, data=RainData)
## Warning in table1.formula(~. | Rain, data = RainData): Terms to the right of
## '|' in formula 'x' define table columns and are expected to be factors with
## meaningful labels.
0
(N=2186)
1
(N=314)
Overall
(N=2500)
Temperature
Mean (SD) 23.3 (7.38) 17.4 (4.30) 22.6 (7.33)
Median [Min, Max] 23.9 [10.0, 35.0] 17.6 [10.0, 24.8] 22.5 [10.0, 35.0]
Humidity
Mean (SD) 61.5 (19.4) 84.5 (8.65) 64.3 (20.0)
Median [Min, Max] 59.5 [30.0, 100] 84.3 [70.1, 100] 63.9 [30.0, 100]
Wind_Speed
Mean (SD) 9.91 (5.76) 9.89 (5.92) 9.91 (5.78)
Median [Min, Max] 9.93 [0.00982, 20.0] 9.80 [0.0337, 20.0] 9.91 [0.00982, 20.0]
Cloud_Cover
Mean (SD) 46.1 (28.9) 74.7 (14.6) 49.7 (29.1)
Median [Min, Max] 44.2 [0.0150, 100] 74.5 [50.1, 99.7] 49.5 [0.0150, 100]
Pressure
Mean (SD) 1010 (20.1) 1010 (20.6) 1010 (20.2)
Median [Min, Max] 1010 [980, 1050] 1010 [980, 1050] 1010 [980, 1050]
color=c("Gray","Blue")  # Define colores para los gráficos

# Gráficos individuales de todas las variables predictoras vs Rain
par(mfrow=c(2,3))
attach(RainData)
tabla <- prop.table(table(Rain))
coord <- barplot(tabla, col=color, ylim=c(0,1), main="Distribución de Lluvia")
text(coord, tabla, labels=round(tabla,2), pos=3)
lapply(names(RainData[,-6]), function(y) {
  boxplot(RainData[,y] ~ RainData$Rain, ylab=y, xlab="Rain", boxwex=0.5, col=NULL)
})

## [[1]]
## [[1]]$stats
##          [,1]     [,2]
## [1,] 10.00184 10.01661
## [2,] 16.91624 13.38871
## [3,] 23.91877 17.60834
## [4,] 29.79699 21.05089
## [5,] 34.99521 24.82201
## 
## [[1]]$n
## [1] 2186  314
## 
## [[1]]$conf
##          [,1]     [,2]
## [1,] 23.48349 16.92514
## [2,] 24.35406 18.29153
## 
## [[1]]$out
## numeric(0)
## 
## [[1]]$group
## numeric(0)
## 
## [[1]]$names
## [1] "0" "1"
## 
## 
## [[2]]
## [[2]]$stats
##          [,1]     [,2]
## [1,] 30.00507 70.09464
## [2,] 45.14654 76.54002
## [3,] 59.48185 84.27668
## [4,] 77.07532 92.45387
## [5,] 99.99748 99.99518
## 
## [[2]]$n
## [1] 2186  314
## 
## [[2]]$conf
##          [,1]     [,2]
## [1,] 58.40287 82.85773
## [2,] 60.56084 85.69563
## 
## [[2]]$out
## numeric(0)
## 
## [[2]]$group
## numeric(0)
## 
## [[2]]$names
## [1] "0" "1"
## 
## 
## [[3]]
## [[3]]$stats
##              [,1]        [,2]
## [1,]  0.009819276  0.03368996
## [2,]  4.782463507  4.64282223
## [3,]  9.926077388  9.80416495
## [4,] 14.947018060 14.95483699
## [5,] 19.999132255 19.98956500
## 
## [[3]]$n
## [1] 2186  314
## 
## [[3]]$conf
##           [,1]      [,2]
## [1,]  9.582582  8.884699
## [2,] 10.269572 10.723631
## 
## [[3]]$out
## numeric(0)
## 
## [[3]]$group
## numeric(0)
## 
## [[3]]$names
## [1] "0" "1"
## 
## 
## [[4]]
## [[4]]$stats
##             [,1]     [,2]
## [1,]  0.01503811 50.07305
## [2,] 20.25564228 61.53026
## [3,] 44.20647599 74.51799
## [4,] 71.00628067 88.00939
## [5,] 99.99779518 99.67201
## 
## [[4]]$n
## [1] 2186  314
## 
## [[4]]$conf
##          [,1]     [,2]
## [1,] 42.49144 72.15699
## [2,] 45.92151 76.87899
## 
## [[4]]$out
## numeric(0)
## 
## [[4]]$group
## numeric(0)
## 
## [[4]]$names
## [1] "0" "1"
## 
## 
## [[5]]
## [[5]]$stats
##           [,1]      [,2]
## [1,]  980.0145  980.1089
## [2,]  996.7884  997.6501
## [3,] 1013.4330 1013.2662
## [4,] 1031.5905 1032.3788
## [5,] 1049.9856 1049.9079
## 
## [[5]]$n
## [1] 2186  314
## 
## [[5]]$conf
##          [,1]     [,2]
## [1,] 1012.257 1010.170
## [2,] 1014.609 1016.363
## 
## [[5]]$out
## numeric(0)
## 
## [[5]]$group
## numeric(0)
## 
## [[5]]$names
## [1] "0" "1"
detach(RainData)

Para finalizar se determino:

Primero, identificamos las variables disponibles en el conjunto de datos y revisamos su estructura. Observamos que la variable de respuesta (Rain) es binaria (llueve/no llueve). Realizamos una exploración inicial con estadísticos descriptivos (media, mediana, mínimos, máximos, etc.) para comprender la distribución de las variables predictoras.

También verificamos si había valores faltantes, lo cual es crucial para evitar sesgos en el modelo. La visualización de estos datos mostró que algunas variables contenían datos incompletos, lo que requería un manejo de estos mismos, como imputación o exclusión. Este proceso garantiza una mayorcalidad del conjunto de datos antes de modelar.

2. Encontrar un buen modelo que prediga la variable respuesta

Este modelo debe cumplir con las condiciones de bondad de ajuste, aquí se simplificando el modelo para incluir solo variables significativas. se podriam usar el VIF para asegurarte de que no haya multicolinealidad (los valores mayores a 10 indican problemas).

Ajusta un Modelo saturado –> todas las variable

# Ajusta un Modelo saturado --> todas las variables
Modelo_RLMsat <- glm(Rain ~ ., data=RainData, family="binomial")

# Verifica la significancia individual
summary(Modelo_RLMsat)
## 
## Call:
## glm(formula = Rain ~ ., family = "binomial", data = RainData)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.224e+01  4.782e+00  -2.560   0.0105 *  
## Temperature -2.683e-01  1.892e-02 -14.179   <2e-16 ***
## Humidity     1.357e-01  8.552e-03  15.865   <2e-16 ***
## Wind_Speed  -5.881e-03  1.640e-02  -0.359   0.7199    
## Cloud_Cover  8.219e-02  5.330e-03  15.420   <2e-16 ***
## Pressure     2.057e-04  4.659e-03   0.044   0.9648    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1889.68  on 2499  degrees of freedom
## Residual deviance:  761.15  on 2494  degrees of freedom
## AIC: 773.15
## 
## Number of Fisher Scoring iterations: 8
Modelo_RLMred <- step(Modelo_RLMsat, direction="backward")
## Start:  AIC=773.15
## Rain ~ Temperature + Humidity + Wind_Speed + Cloud_Cover + Pressure
## 
##               Df Deviance     AIC
## - Pressure     1   761.15  771.15
## - Wind_Speed   1   761.28  771.28
## <none>             761.15  773.15
## - Temperature  1  1119.55 1129.55
## - Cloud_Cover  1  1248.28 1258.28
## - Humidity     1  1359.17 1369.17
## 
## Step:  AIC=771.15
## Rain ~ Temperature + Humidity + Wind_Speed + Cloud_Cover
## 
##               Df Deviance     AIC
## - Wind_Speed   1   761.28  769.28
## <none>             761.15  771.15
## - Temperature  1  1119.73 1127.73
## - Cloud_Cover  1  1249.85 1257.85
## - Humidity     1  1359.21 1367.21
## 
## Step:  AIC=769.28
## Rain ~ Temperature + Humidity + Cloud_Cover
## 
##               Df Deviance     AIC
## <none>             761.28  769.28
## - Temperature  1  1120.01 1126.01
## - Cloud_Cover  1  1249.87 1255.87
## - Humidity     1  1359.21 1365.21
summary(Modelo_RLMred)
## 
## Call:
## glm(formula = Rain ~ Temperature + Humidity + Cloud_Cover, family = "binomial", 
##     data = RainData)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -12.081943   0.771195  -15.67   <2e-16 ***
## Temperature  -0.268317   0.018914  -14.19   <2e-16 ***
## Humidity      0.135583   0.008543   15.87   <2e-16 ***
## Cloud_Cover   0.082182   0.005324   15.44   <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: 1889.68  on 2499  degrees of freedom
## Residual deviance:  761.28  on 2496  degrees of freedom
## AIC: 769.28
## 
## Number of Fisher Scoring iterations: 8
# Prueba: Multicolinealidad
library(car)
## Loading required package: carData
round(vif(Modelo_RLMred), 2)
## Temperature    Humidity Cloud_Cover 
##        1.70        1.68        1.73
# ANOVA: Modelo reducido vs saturado
anova(Modelo_RLMred, Modelo_RLMsat, test="Chisq")
## Analysis of Deviance Table
## 
## Model 1: Rain ~ Temperature + Humidity + Cloud_Cover
## Model 2: Rain ~ Temperature + Humidity + Wind_Speed + Cloud_Cover + Pressure
##   Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1      2496     761.28                     
## 2      2494     761.15  2  0.12913   0.9375

Para finalizar se determino:

Se ajustó inicialmente un modelo saturado de regresión logística, incluyendo todas las variables predictoras. Esto nos permitió observar la significancia estadística individual de cada predictor. En el resumen del modelo saturado:

Algunas variables resultaron no significativas (p-valores altos), indicando que no aportan información relevante para predecir la respuesta. Otras variables fueron altamente significativas, mostrando una fuerte asociación con la probabilidad de lluvia.

Despues se realiza una selección de variables mediante el método de eliminación hacia atrás (backward selection). Esto resultó en un modelo reducido con solo las variables significativas. Este modelo final evita el problema de sobreajuste, lo cual es esencial para garantizar su generalización en los nuevos datos.

3. Interpretar el efecto de las variables significativas en la clasificación (odds ratio)

Int.parRL <- function(Modelo){
  Tabla_coef <- cbind(Coef=round(coef(Modelo),2),IC=round(confint(Modelo,level=0.95),2))
  Tabla_odds <- round(exp(Tabla_coef),2)
  colnames(Tabla_odds)[1] <- "e-beta"
  list(Coeficientes=Tabla_coef, OR=Tabla_odds)
}

Int.parRL(Modelo_RLMred)
## Waiting for profiling to be done...
## $Coeficientes
##               Coef  2.5 % 97.5 %
## (Intercept) -12.08 -13.66 -10.63
## Temperature  -0.27  -0.31  -0.23
## Humidity      0.14   0.12   0.15
## Cloud_Cover   0.08   0.07   0.09
## 
## $OR
##             e-beta 2.5 % 97.5 %
## (Intercept)   0.00  0.00   0.00
## Temperature   0.76  0.73   0.79
## Humidity      1.15  1.13   1.16
## Cloud_Cover   1.08  1.07   1.09

En donde:

  1. coef(Modelo): Obtiene los coeficientes del modelo de regresión logística.

  2. confint(Modelo): Calcula los intervalos de confianza para los coeficientes.

  3. exp(): La regresión logística utiliza los coeficientes logarítmicos, por lo que se toma el exponente de cada coeficiente para obtener el odds ratio (OR).

  4. Int.parRL(): Función definida para mostrar los coeficientes y los odds ratios con sus intervalos de confianza.

Esto es importante para interpretar cómo cada variable afecta la probabilidad de lluvia. Un OR mayor que 1 indica que la variable aumenta la probabilidad de lluvia, y un OR menor que 1 indica que la variable disminuye la probabilidad.

# Asegúrate de trabajar solo con datos completos
RainData_complete <- RainData[complete.cases(RainData), ]

# Predicción con datos completos
Prob_RLMred <- predict(Modelo_RLMred, type = "response", newdata = RainData_complete)

# Crear las predicciones binarias
pc <- 0.5  # Punto de corte inicial
Predict_RLMred <- factor(ifelse(Prob_RLMred > pc, "1", "0"), levels = c("0", "1"))

# Asegurar que los valores reales también sean factores con los mismos niveles
RainData_complete$Rain <- factor(RainData_complete$Rain, levels = c("0", "1"))

# Verificar longitudes antes de usar confusionMatrix
length(Predict_RLMred) == length(RainData_complete$Rain)
## [1] TRUE
# Matriz de confusión
caret::confusionMatrix(Predict_RLMred, RainData_complete$Rain, positive = "1")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction    0    1
##          0 2122  110
##          1   64  204
##                                           
##                Accuracy : 0.9304          
##                  95% CI : (0.9197, 0.9401)
##     No Information Rate : 0.8744          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.6619          
##                                           
##  Mcnemar's Test P-Value : 0.0006462       
##                                           
##             Sensitivity : 0.6497          
##             Specificity : 0.9707          
##          Pos Pred Value : 0.7612          
##          Neg Pred Value : 0.9507          
##              Prevalence : 0.1256          
##          Detection Rate : 0.0816          
##    Detection Prevalence : 0.1072          
##       Balanced Accuracy : 0.8102          
##                                           
##        'Positive' Class : 1               
## 
print(paste("Longitud de predicciones:", length(Predict_RLMred)))
## [1] "Longitud de predicciones: 2500"
print(paste("Longitud de valores reales:", length(RainData_complete$Rain)))
## [1] "Longitud de valores reales: 2500"

Para finalizar se determino:

Para las variables significativas en el modelo final, se calcularon sus odds ratios (OR). Estos valores son esenciales para interpretar el impacto de cada variable:

  1. Un OR mayor que 1 indica que un aumento en la variable predictora incrementa las probabilidades de que llueva.
  2. Un OR menor que 1 indica que un aumento en la variable predictora disminuye las probabilidades de lluvia.

Por ejemplo, si una variable como “humedad relativa” tiene un OR de 1.5, significa que por cada unidad adicional de humedad relativa, las probabilidades de lluvia se multiplican por 1.5, manteniendo constantes las demás variables.

Los intervalos de confianza del 95% de los OR fueron revisados para asegurar que no incluyan el valor 1, lo cual corroboraría su significancia estadística.

4. Curva ROC del modelo y sensibilidad/especificidad

Aquí se genera la curva ROC y se calcula la sensibilidad y especificidad para evaluar el rendimiento del modelo. Este paso es crucial para evaluar cuán bien el modelo clasifica las observaciones en las categorías correctas (lluvia/no lluvia). El código correspondiente es:

# Curva ROC: Explorar un mejor punto de corte para el Modelo de regresión Logistica

roc <- roc(RainData_complete$Rain,Prob_RLMred, plot=TRUE, main="Curva ROC")
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases

pROC::plot.roc(roc, legacy.axes = TRUE, print.thres = "best", print.auc = TRUE,
               auc.polygon = FALSE, max.auc.polygon = FALSE, auc.polygon.col = "gainsboro",
               col = 2, grid = TRUE) 

En donde:

  1. predict(Modelo_RLMred, type = “response”): Realiza predicciones de probabilidad utilizando el modelo ajustado.

  2. ifelse(Prob_RLMred > pc, “1”, “0”): Convierte las probabilidades en predicciones binarias (si la probabilidad es mayor que 0.5, se predice “lluvia”).

  3. confusionMatrix(): Calcula la matriz de confusión para comparar las predicciones con los valores reales y obtener las métricas de rendimiento como la sensibilidad y especificidad.

  4. roc() y plot.roc(): Genera y dibuja la curva ROC para visualizar el rendimiento del modelo.

Para finalizar se determino:

La curva ROC se generó para evaluar el rendimiento del modelo en términos de su capacidad para discriminar entre los eventos de “lluvia” y “no lluvia”. El área bajo la curva (AUC) proporcionó una medida de la calidad general del modelo:

Una AUC cercana a 1 indica un excelente poder de discriminación. Si la AUC es cercana a 0.5, el modelo no es mejor que una predicción aleatoria. Con un punto de corte inicial de 0.5, se calcularon las métricas de sensibilidad (proporción de eventos positivos correctamente clasificados) y especificidad (proporción de eventos negativos correctamente clasificados). Esto permitió evaluar el balance entre ambos indicadores, crucial para aplicaciones prácticas

Curva ROC: El area bajo la curva (AUC): 1.00, lo que indica un modelo perfecto en este conjunto de datos. Esto determina que el modelo actual cumple con las condiciones mínimas de bondad de ajuste.

6. Ecuación matemática del modelo final

El modelo final se describe en términos de los coeficientes que fueron ajustados:

summary(Modelo_RLMred)$coefficients
##                 Estimate  Std. Error   z value     Pr(>|z|)
## (Intercept) -12.08194294 0.771195181 -15.66652 2.562392e-55
## Temperature  -0.26831695 0.018914187 -14.18602 1.118349e-45
## Humidity      0.13558346 0.008542901  15.87089 1.007981e-56
## Cloud_Cover   0.08218163 0.005323592  15.43725 9.193739e-54

En donde:

  1. summary(Modelo_RLMred): Muestra los coeficientes finales del modelo. La ecuación matemática de la regresión logística será la suma de los coeficientes multiplicados por las variables respectivas.

7. CONCLUSIONES

Conclusiones en terminos estadisticos:

El modelo es una herramienta eficaz para predecir la variable respuesta. Ajustar el punto de corte mejora su rendimiento, lo que puede ser útil en aplicaciones prácticas.

Conclusion respecto al desarollo

El modelo ajustado que se aplico para el desarrollo del taller predice con alta sensibilidad y especificidad. Al ajustar el punto de corte, el poder predictivo mejora, demostrando que las variables seleccionadas tienen un impacto significativo en la probabilidad de lluvia

1. Las variables seleccionadas tienen un impacto significativo y cuantificable en la probabilidad de lluvia

2. El modelo fue optimizado con un punto de corte personalizado, mejorando su rendimiento general.

3. Las interpretaciones de los OR permiten traducir los resultados del modelo en implicaciones prácticas y comprensibles.