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
## [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
act_selected <- act_data_wo_na %>% select(FCMedia, Distancia, Velocidad, Calorias)
pairs(act_selected, col = "blue")# 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