R: Anális de regresión lineal múltiple

A raiz de una necesidad en la limpieza de datos al encontrarme con varios NAs y con el objetivo de no ignorar esos registros, voy a aprovechas para hacer un modelo de regresión lineal y así obtener una predicción aproximada de esos valores apoyado por otras variables que tenemos

Recordemos que estamos trabajando sobre un dataset de actividades de carrera de un atleta

Cargo el csv para proseguir desde el este post
act_data <- read.csv('act_data_prev_lm.csv')
El objetivo es predecir la FCMedia donde falte
# Vemos las variables disponibles que podemos utilizar
colnames(act_data)
##  [1] "X"         "Hora"      "Dia"       "Mes"       "Year"      "Distancia" "Calorias"  "Tiempo"    "FCMedia"   "Zancada"   "Ascenso"   "Velocidad"
# Me quedo temporalmente con las filas que la FCMedia no es nula
act_data_wo_na <- act_data %>% filter(!is.na(FCMedia))

# Creo un primer modelo con varias variables y muestro un summary
lm_act_data_wo_na <- lm(data = act_data_wo_na, FCMedia~Distancia+Velocidad+Calorias+Tiempo+Zancada+Ascenso)
summary(lm_act_data_wo_na)
## 
## Call:
## lm(formula = FCMedia ~ Distancia + Velocidad + Calorias + Tiempo + 
##     Zancada + Ascenso, data = act_data_wo_na)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -48.308  -4.125   0.597   4.454  31.517 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 107.494051  10.338174  10.398  < 2e-16 ***
## Distancia    -3.184454   1.594848  -1.997  0.04645 *  
## Velocidad     2.782836   0.988310   2.816  0.00508 ** 
## Calorias      0.112378   0.005431  20.694  < 2e-16 ***
## Tiempo       -0.459636   0.277745  -1.655  0.09864 .  
## Zancada       1.170881   0.897796   1.304  0.19283    
## Ascenso       0.001815   0.014798   0.123  0.90243    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.45 on 456 degrees of freedom
## Multiple R-squared:  0.5492, Adjusted R-squared:  0.5432 
## F-statistic: 92.58 on 6 and 456 DF,  p-value: < 2.2e-16

A primera vista, veo en la evaluación del modelo que hay varias variables que no son signiticativas, puesto que su p-value < 0.1, por lo que realizaré otro modelo si estas, que son Tiempo, Zancada y Ascenso.

# Creo un segundo modelo excluyendo las variables no significativas
lm_act_data_wo_na <- lm(data = act_data_wo_na, FCMedia~Distancia+Velocidad+Calorias)
summary(lm_act_data_wo_na)
## 
## Call:
## lm(formula = FCMedia ~ Distancia + Velocidad + Calorias, data = act_data_wo_na)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -48.658  -3.842   0.441   4.457  33.580 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 92.074207   4.183391   22.01   <2e-16 ***
## Distancia   -5.604483   0.365985  -15.31   <2e-16 ***
## Velocidad    4.334694   0.393905   11.00   <2e-16 ***
## Calorias     0.109145   0.005203   20.98   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.466 on 459 degrees of freedom
## Multiple R-squared:  0.5446, Adjusted R-squared:  0.5416 
## F-statistic: 182.9 on 3 and 459 DF,  p-value: < 2.2e-16

Todas son ahora bastantes significativas ya que el p-value es menor de 0.001. Veamos la correlación de las variables, por si hubiese que desestimar alguna por redundancia

# Seleccionamos las columnas para buscar correlación
act_data_lm_fcm <- act_data_wo_na %>% select(Distancia, Velocidad, Calorias)
cor(act_data_lm_fcm)
##           Distancia    Velocidad     Calorias
## Distancia 1.0000000  0.101265185  0.882624699
## Velocidad 0.1012652  1.000000000 -0.008654845
## Calorias  0.8826247 -0.008654845  1.000000000

Dada la correlación entre Calorias y Distancia, lo cual tiene bastante lógica, ponemos en duda si es mejor el modelo con o sin Calorias. Por lo tanto lanzamos el modelo sin calorias para comparar.

lm_act_data_wo_na <- lm(data = act_data_wo_na, FCMedia~Distancia+Velocidad)
summary(lm_act_data_wo_na)
## 
## Call:
## lm(formula = FCMedia ~ Distancia + Velocidad, data = act_data_wo_na)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -33.549  -6.821   0.432   6.918  38.613 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 110.7419     5.7147  19.378  < 2e-16 ***
## Distancia     1.2141     0.2352   5.162 3.64e-07 ***
## Velocidad     2.6025     0.5385   4.833 1.83e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 11.84 on 460 degrees of freedom
## Multiple R-squared:  0.1079, Adjusted R-squared:  0.104 
## F-statistic: 27.82 on 2 and 460 DF,  p-value: 3.948e-12

Al comparar, vemos que el p-value sigue indicando que las varibles son significativas, pero el \(R^2\) es bastante superior en el anterior, con Calorias. 0.5416 > 0.104.

Es decir que el modelo 2 explica un 54.16% de la varianza de las variables dependientes, que sin ser un valor altísimo, se puede dar por bueno el modelo.

¿Con que coeficientes nos quedamos entonces? Distancia, Velocidad y Calorias, con el siguiente sumario:

lm_act_data_wo_na <- lm(data = act_data_wo_na, FCMedia~Distancia+Velocidad+Calorias)
summary(lm_act_data_wo_na)
## 
## Call:
## lm(formula = FCMedia ~ Distancia + Velocidad + Calorias, data = act_data_wo_na)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -48.658  -3.842   0.441   4.457  33.580 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 92.074207   4.183391   22.01   <2e-16 ***
## Distancia   -5.604483   0.365985  -15.31   <2e-16 ***
## Velocidad    4.334694   0.393905   11.00   <2e-16 ***
## Calorias     0.109145   0.005203   20.98   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.466 on 459 degrees of freedom
## Multiple R-squared:  0.5446, Adjusted R-squared:  0.5416 
## F-statistic: 182.9 on 3 and 459 DF,  p-value: < 2.2e-16
Vemos la correlación entre las variables significativas del modelo y la variable dependiente
act_selected <- act_data_wo_na %>% select(FCMedia, Distancia, Velocidad, Calorias)
pairs(act_selected, col = "blue")

Podemos ver un ejemplo de que hacer con los coeficientes obtenidos
# Guardamos los coeficientes obtenidos
coef <- summary(lm_act_data_wo_na)$coefficients
# Asignamos unos datos de ejemplo para predecir la frecuencia cardiaca media

# Hacemos el cálculo y mostramos el resultado
Distancia <- 7.5
Velocidad <- 10.2
Calorias  <- 450

fcm <- coef[1,1] +
  coef[2,1]*Distancia +
  coef[3,1]*Velocidad + 
  coef[4,1]*Calorias

fcm
## [1] 143.3697

Para 7.5 km recorridos a 10.2 Kmh y con un consumo de 450 calorias, el resultado es de 143 ppm

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.