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(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.4
## ✔ ggplot2   3.4.3     ✔ stringr   1.5.0
## ✔ lubridate 1.9.2     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
ENSANUT_2006 <- read_excel("C:/Users/Asus ZenBook/Downloads/ENSANUT 2006.xlsx", 
    sheet = "ENSANUT 2006")
ENSANUT_2006 <- mutate_all(ENSANUT_2006, ~ifelse(is.na(.), "No contestó", .))

Regresión lineal

# Regresión lineal
modelo <- lm(bmi ~ liquidos + miscelaneos + verduras + carnes + lacteos + cereales + azucar, data = ENSANUT_2006)
summary(modelo)
## 
## Call:
## lm(formula = bmi ~ liquidos + miscelaneos + verduras + carnes + 
##     lacteos + cereales + azucar, data = ENSANUT_2006)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -13.742  -0.174   2.359   4.473 199.851 
## 
## Coefficients: (6 not defined because of singularities)
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            11.82948    0.20285  58.316  < 2e-16 ***
## liquidos2               0.18928    0.24528   0.772  0.44030    
## liquidosNo contestó     1.91255    0.21246   9.002  < 2e-16 ***
## miscelaneos2            0.28029    0.24192   1.159  0.24664    
## miscelaneosNo contestó       NA         NA      NA       NA    
## verduras2              -0.08514    0.25942  -0.328  0.74276    
## verdurasNo contestó          NA         NA      NA       NA    
## carnes2                -0.30089    0.24222  -1.242  0.21418    
## carnesNo contestó            NA         NA      NA       NA    
## lacteos2                0.68866    0.24155   2.851  0.00436 ** 
## lacteosNo contestó           NA         NA      NA       NA    
## cereales2              -0.59828    0.29405  -2.035  0.04190 *  
## cerealesNo contestó          NA         NA      NA       NA    
## azucar2                -0.57725    0.22174  -2.603  0.00924 ** 
## azucar9                -0.23549    0.80470  -0.293  0.76980    
## azucarNo contestó            NA         NA      NA       NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.398 on 23995 degrees of freedom
## Multiple R-squared:  0.01215,    Adjusted R-squared:  0.01178 
## F-statistic: 32.78 on 9 and 23995 DF,  p-value: < 2.2e-16

Regresión multiple

# Regresión multiple
multi_model <- lm(bmi ~ liquidos + cereales + verduras + carnes + lacteos + miscelaneos + azucar, data = ENSANUT_2006)
summary(multi_model)
## 
## Call:
## lm(formula = bmi ~ liquidos + cereales + verduras + carnes + 
##     lacteos + miscelaneos + azucar, data = ENSANUT_2006)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -13.742  -0.174   2.359   4.473 199.851 
## 
## Coefficients: (6 not defined because of singularities)
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            11.82948    0.20285  58.316  < 2e-16 ***
## liquidos2               0.18928    0.24528   0.772  0.44030    
## liquidosNo contestó     1.91255    0.21246   9.002  < 2e-16 ***
## cereales2              -0.59828    0.29405  -2.035  0.04190 *  
## cerealesNo contestó          NA         NA      NA       NA    
## verduras2              -0.08514    0.25942  -0.328  0.74276    
## verdurasNo contestó          NA         NA      NA       NA    
## carnes2                -0.30089    0.24222  -1.242  0.21418    
## carnesNo contestó            NA         NA      NA       NA    
## lacteos2                0.68866    0.24155   2.851  0.00436 ** 
## lacteosNo contestó           NA         NA      NA       NA    
## miscelaneos2            0.28029    0.24192   1.159  0.24664    
## miscelaneosNo contestó       NA         NA      NA       NA    
## azucar2                -0.57725    0.22174  -2.603  0.00924 ** 
## azucar9                -0.23549    0.80470  -0.293  0.76980    
## azucarNo contestó            NA         NA      NA       NA    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.398 on 23995 degrees of freedom
## Multiple R-squared:  0.01215,    Adjusted R-squared:  0.01178 
## F-statistic: 32.78 on 9 and 23995 DF,  p-value: < 2.2e-16
summary_result_multi <- summary(multi_model)
p_values_multi <- summary_result_multi$coefficients[, "Pr(>|t|)"]
alpha_multi <- 0.05
for (i in seq_along(p_values_multi)) {
  if (p_values_multi[i] < alpha_multi) {
    cat(names(p_values_multi)[i], "is statistically significant (p-value <", alpha_multi, ")\n")
  } else {
    cat(names(p_values_multi)[i], "is not statistically significant (p-value >=", alpha_multi, ")\n")
}
}
## (Intercept) is statistically significant (p-value < 0.05 )
## liquidos2 is not statistically significant (p-value >= 0.05 )
## liquidosNo contestó is statistically significant (p-value < 0.05 )
## cereales2 is statistically significant (p-value < 0.05 )
## verduras2 is not statistically significant (p-value >= 0.05 )
## carnes2 is not statistically significant (p-value >= 0.05 )
## lacteos2 is statistically significant (p-value < 0.05 )
## miscelaneos2 is not statistically significant (p-value >= 0.05 )
## azucar2 is statistically significant (p-value < 0.05 )
## azucar9 is not statistically significant (p-value >= 0.05 )

Matriz de correlación

# Matriz de correlación
cor_matrix <- cor(ENSANUT_2006[, c("edad_anos", "bmi", "sexo")])
print(cor_matrix)
##             edad_anos         bmi         sexo
## edad_anos 1.000000000  0.15261876  0.008228689
## bmi       0.152618759  1.00000000 -0.010481616
## sexo      0.008228689 -0.01048162  1.000000000
interpret_correlation <- function(cor_value) {
  if (cor_value > 0.8) {
    return("Muy Fuerte")
  } else if (cor_value > 0.6) {
    return("Fuerte")
  } else if (cor_value > 0.4) {
    return("Moderado")
  } else if (cor_value > 0.2) {
    return("Debil")
  } else {
    return("Muy debil")
  }
}
interpreted_matrix <- apply(cor_matrix, c(1, 2), interpret_correlation)
print(interpreted_matrix)
##           edad_anos    bmi          sexo        
## edad_anos "Muy Fuerte" "Muy debil"  "Muy debil" 
## bmi       "Muy debil"  "Muy Fuerte" "Muy debil" 
## sexo      "Muy debil"  "Muy debil"  "Muy Fuerte"
heatmap(cor_matrix, 
        annot = interpreted_matrix, # show the interpretations in each cell
        cmap = "coolwarm", # color map
        main = "Correlation Matrix with Interpretations")
## Warning in plot.window(...): "annot" is not a graphical parameter
## Warning in plot.window(...): "cmap" is not a graphical parameter
## Warning in plot.xy(xy, type, ...): "annot" is not a graphical parameter
## Warning in plot.xy(xy, type, ...): "cmap" is not a graphical parameter
## Warning in title(...): "annot" is not a graphical parameter
## Warning in title(...): "cmap" is not a graphical parameter

Anova

modelo <- lm(bmi ~ liquidos + cereales + verduras + carnes + miscelaneos + lacteos + azucar + edad_anos, data = ENSANUT_2006)
anova_resultados <- anova(modelo)
print(anova_resultados)
## Analysis of Variance Table
## 
## Response: bmi
##                Df  Sum Sq Mean Sq  F value    Pr(>F)    
## liquidos        2   19281  9640.3 138.4141 < 2.2e-16 ***
## cereales        1     271   271.1   3.8918  0.048534 *  
## verduras        1       1     1.3   0.0190  0.890291    
## carnes          1      45    45.3   0.6501  0.420078    
## miscelaneos     1     160   159.8   2.2945  0.129847    
## lacteos         1     567   567.3   8.1450  0.004322 ** 
## azucar          2     482   241.2   3.4637  0.031329 *  
## edad_anos       1   21256 21256.3 305.1954 < 2.2e-16 ***
## Residuals   23994 1671138    69.6                       
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Modelo Predictivo

print(paste("Modelo Predictivo - Alimentos"))
## [1] "Modelo Predictivo - Alimentos"
df_cleaned <- ENSANUT_2006[, c("bmi", "edad_anos", "liquidos", "cereales", "verduras", "carnes", "miscelaneos", "lacteos", "azucar")]
df_cleaned <- df_cleaned[complete.cases(df_cleaned), ]
set.seed(123)
split_index <- sample(1:nrow(df_cleaned), 0.8 * nrow(df_cleaned))
train_data <- df_cleaned[split_index, ]
test_data <- df_cleaned[-split_index, ]
lm_model <- lm(bmi ~ liquidos + cereales + verduras + carnes + miscelaneos + lacteos + azucar + edad_anos, data = train_data)
predictions <- predict(lm_model, newdata = test_data)
mse <- mean((test_data$bmi - predictions)^2)
r_squared <- summary(lm_model)$r.squared
adjusted_r_squared <- summary(lm_model)$adj.r.squared
mae <- mean(abs(test_data$bmi - predictions))
rmse <- sqrt(mse)

print(paste("Model Evaluation Metrics:"))
## [1] "Model Evaluation Metrics:"
print(paste("Mean Squared Error (MSE): ", mse))
## [1] "Mean Squared Error (MSE):  71.5174475137006"
print(paste("Mean Absolute Error (MAE): ", mae))
## [1] "Mean Absolute Error (MAE):  5.9651698842639"
print(paste("Root Mean Squared Error (RMSE): ", rmse))
## [1] "Root Mean Squared Error (RMSE):  8.45679889282586"
print(paste("R-squared: ", r_squared))
## [1] "R-squared:  0.0237437950273371"
print(paste("Adjusted R-squared: ", adjusted_r_squared))
## [1] "Adjusted R-squared:  0.023235142807792"
if (mse == 0) {
  print("The model perfectly predicts the 'bmi' variable.")
} else {
  print(paste("En promedio, las predicciones del modelo están equivocadas por aproximadamente", round(sqrt(mse), 2), "unidades en la escala de 'bmi'"))
}
## [1] "En promedio, las predicciones del modelo están equivocadas por aproximadamente 8.46 unidades en la escala de 'bmi'"
if (rmse < 10) {
  cat("El RMSE es bajo, sugiriendo que el modelo tiene un buen ajuste.\n")
} else {
  cat("El RMSE es alto, indicando que el modelo puede tener limitaciones.\n")
}
## El RMSE es bajo, sugiriendo que el modelo tiene un buen ajuste.
if (r_squared > 0.5) {
  cat("El R-squared es alto, indicando una buena proporción de varianza explicada por el modelo.\n")
} else {
  cat("El R-squared is bajo, lo que sugiere que el modelo puede no capturar gran parte de la varianza en los datos.\n")
}
## El R-squared is bajo, lo que sugiere que el modelo puede no capturar gran parte de la varianza en los datos.
if (adjusted_r_squared > 0.5) {
  cat("El Adjusted R-squared es alto, lo cual es favorable al considerar el número de predictores.\n")
} else {
  cat("El Adjusted R-squared es bajo, sugiriendo que predictores adicionales pueden mejorar el modelo.\n")
  }
## El Adjusted R-squared es bajo, sugiriendo que predictores adicionales pueden mejorar el modelo.