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
El objetivo es predecir la FCMedia donde falte
## [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
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