library(ggplot2)
library(GGally) # for ggpairs
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
#Dataset
library(readxl)
df <- read_excel("C:/Users/ajasa/OneDrive/Documentos/database1.xlsx")
View(df)
#Visualization of correlation
ggcorr(df, label=TRUE)
## Warning in ggcorr(df, label = TRUE): data in column(s) 'Sex' are not numeric
## and were ignored

#Model (specification)
model <- lm( Calories ~ Body_Temp + Heart_Rate + Duration ,
data = df, na.action = na.exclude)
summary(model)
##
## Call:
## lm(formula = Calories ~ Body_Temp + Heart_Rate + Duration, data = df,
## na.action = na.exclude)
##
## Residuals:
## Min 1Q Median 3Q Max
## -171.562 -8.293 -1.049 6.541 223.424
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 488.920555 1.876246 260.6 <2e-16 ***
## Body_Temp -17.273071 0.048069 -359.3 <2e-16 ***
## Heart_Rate 1.968412 0.003524 558.6 <2e-16 ***
## Duration 6.676569 0.005618 1188.5 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 13.94 on 749996 degrees of freedom
## Multiple R-squared: 0.9501, Adjusted R-squared: 0.9501
## F-statistic: 4.759e+06 on 3 and 749996 DF, p-value: < 2.2e-16
# La variable Body_Temp presenta un coeficiente negativo (-17.27), lo que significa que, manteniendo constantes las demás variables, un incremento en la temperatura corporal está asociado con una reducción en las calorías estimadas, lo cual puede reflejar un efecto de ajuste estadístico más que una relación directa.
# La variable Heart_Rate tiene un coeficiente positivo (1.97), indicando que por cada latido adicional en la frecuencia cardíaca se incrementan casi 2 calorías, lo que concuerda con la lógica de que un mayor esfuerzo cardíaco implica más gasto energético.
# La duracion muestra el mayor impacto positivo (6.67), lo que significa que por cada minuto adicional de ejercicio se queman en promedio casi 7 calorías, siendo la variable más influyente en el modelo.
# El alto valor de R² (0.95) sugiere que el modelo explica un 95% de la variabilidad en las calorías, con una significancia estadística muy elevada (p < 2.2e-16), lo que confirma la solidez del modelo.
#Identification
ggplot(df, aes(x = Calories, y = Body_Temp)) +
geom_point(color = "purple") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Calories vs body temperature",
x = "Calories)", y = "Duration")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(df, aes(x = Calories, y = Heart_Rate)) +
geom_point(color = "blue") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Calories vs heart rate",
x = "Calories)", y = "Duration")
## `geom_smooth()` using formula = 'y ~ x'

ggplot(df, aes(x = Calories, y = Duration)) +
geom_point(color = "green") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Calories vs duration of the excercice",
x = "Calories)", y = "Duration")
## `geom_smooth()` using formula = 'y ~ x'

# Las tres gráficas muestran la relación entre las calorías quemadas y distintas variables fisiológicas durante el ejercicio: temperatura corporal, frecuencia cardíaca y duración tal y como lo muestra el modelo.
# En las tres gráficas se observa un fenómeno de heterocedasticidad, ya que la variabilidad de los puntos aumenta conforme crecen las calorías, es decir, los valores se dispersan más en niveles altos que en niveles bajos.
#Evaluation and accuracy
cat("R² Ajustado:", summary(model)$adj.r.squared, "\n") # El 95.01% de la variable dependiente es explicada por el modelo,
## R² Ajustado: 0.9500926
qqnorm(model$residuals)
qqline(model$residuals)

# El gráfico Q-Q muestra que los residuos del modelo de regresión, que predice las calorías quemadas a partir de las variables seleccionadas, no siguen perfectamente una distribución normal.
# En la zona central los puntos se alinean con la recta, lo que significa que para la mayoría de los casos el modelo predice de forma adecuada las calorías en función de las variables explicativas.
# En los extremos aparecen desviaciones notorias: existen personas que, según el modelo, queman muchas más o muchas menos calorías de lo esperado dado su nivel de duración, temperatura y frecuencia cardíaca, es decir que presentan comportamientos atipicos, tales como metabolismos mas acelerados, por decir un ejemplo.
p10_D <- quantile(df$Duration, 0.10, na.rm = TRUE)
p90_D <- quantile(df$Duration, 0.90, na.rm = TRUE)
med_T <- median(df$Body_Temp, na.rm = TRUE)
med_H <- median(df$Heart_Rate, na.rm = TRUE)
future_duration <- data.frame(
Body_Temp = med_T,
Heart_Rate = med_H,
Duration = seq(p10_D, p90_D, length.out = 30)
)
pred1 <- as.data.frame(predict(model, newdata = future_duration,
interval = "prediction", level = 0.95))
results1 <- cbind(future_duration, pred1)
# 4A) Gráfico 1: línea con banda de predicción
ggplot(results1, aes(x = Duration, y = fit)) +
geom_ribbon(aes(ymin = lwr, ymax = upr), alpha = 0.2) +
geom_line(size = 1.1) +
geom_point() +
labs(title = "Forecasting de Calorías (variando Duración)",
subtitle = "Body_Temp y Heart_Rate fijados en la mediana del dataset",
x = "Duración del ejercicio (min)",
y = "Calorías estimadas") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# Este gráfico muestra la relación entre la duración del ejercicio y las calorías estimadas cuando las demás variables (temperatura corporal y ritmo cardíaco) se mantienen constantes en su valor mediano.
# El gráfico indica que la duración del ejercicio es un predictor positivo y fuerte del gasto calórico, es decir, mientras más tiempo se realice actividad física, mayor será el número de calorías quemadas.