Ejercicio #1: utilizando R realice una función que dado un dataframe cualquiera de dos columnas, donde la primera (índice 1) sea el valor de la variable independiente (X) y la segunda sea el valor de una variable dependiente (Y), devuelva una lista con los siguientes elementos: * Un arreglo con los valores de los estimadores para beta1 y beta2 * El valor del coeficiente de determinación 𝑟# del modelo. * El coeficiente de correlación 𝑟 (raíz cuadrada de 𝑟#). * Un arreglo con los valores de los residuos. * Una gráfica con la nube de puntos y la recta de regresión del modelo.
# Función para calcular los estimadores, coeficientes y residuos sin usar lm()
regresion_manual <- function(df) {
# Verificar que el dataframe tenga exactamente 2 columnas
if (ncol(df) != 2) {
stop("El dataframe debe tener exactamente dos columnas")
}
x <- df[,1]
y <- df[,2]
# Número de observaciones
n <- length(x)
# Estimadores para beta1 y beta0
beta1 <- (sum(x) * sum(y) - n * sum(x * y)) / (sum(x)^2 - n * sum(x^2))
beta0 <- (sum(y) - beta1 * sum(x)) / n
# Predicciones del modelo
y_pred <- beta0 + beta1 * x
# Residuos
residuos <- y - y_pred
# Coeficiente de determinación r^2
r2 <- sum((y_pred - mean(y))^2) / sum((y - mean(y))^2)
# Coeficiente de correlación r
r <- sqrt(r2)
# Resultados en una lista
resultados <- list(
beta = c(beta0, beta1),
r2 = r2,
r = r,
residuos = residuos
)
return(resultados)
}
# Crear un dataframe de ejemplo
df_ejemplo <- data.frame(X = c(1, 2, 3, 4, 5), Y = c(2, 4, 5, 4, 5))
# Llamar a la función
resultados <- regresion_manual(df_ejemplo)
# Mostrar los resultados
print(resultados)
## $beta
## [1] 2.2 0.6
##
## $r2
## [1] 0.6
##
## $r
## [1] 0.7745967
##
## $residuos
## [1] -0.8 0.6 1.0 -0.6 -0.2
# Gráfica con ggplot2
# Crear dataframe con las predicciones
df_ejemplo$Y_pred <- resultados$beta[1] + resultados$beta[2] * df_ejemplo$X
ggplot(df_ejemplo, aes(x = X, y = Y)) +
geom_point(color = 'blue') +
geom_line(aes(y = Y_pred), color = 'red') +
labs(title = "Nube de puntos y recta de regresión",
x = "X",
y = "Y")
Ejercicio #2: Para este ejercicio se le solicita que desarrolle las siguientes actividades utilizando RStudio Con el dataset Admissions adjunto a este laboratorio realice lo siguiente:
# Cargar el dataset
admissions <- read.csv("C:/Users/halegre/Documents/Heberto/galileo/r/lab3/Admisions.csv")
# Análisis estadístico
summary(admissions)
## Serial.No. GRE.Score TOEFL.Score University.Rating
## Min. : 1.0 Min. :290.0 Min. : 92.0 Min. :1.000
## 1st Qu.:125.8 1st Qu.:308.0 1st Qu.:103.0 1st Qu.:2.000
## Median :250.5 Median :317.0 Median :107.0 Median :3.000
## Mean :250.5 Mean :316.5 Mean :107.2 Mean :3.114
## 3rd Qu.:375.2 3rd Qu.:325.0 3rd Qu.:112.0 3rd Qu.:4.000
## Max. :500.0 Max. :340.0 Max. :120.0 Max. :5.000
## SOP LOR CGPA Research
## Min. :1.000 Min. :1.000 Min. :6.800 Min. :0.00
## 1st Qu.:2.500 1st Qu.:3.000 1st Qu.:8.127 1st Qu.:0.00
## Median :3.500 Median :3.500 Median :8.560 Median :1.00
## Mean :3.374 Mean :3.484 Mean :8.576 Mean :0.56
## 3rd Qu.:4.000 3rd Qu.:4.000 3rd Qu.:9.040 3rd Qu.:1.00
## Max. :5.000 Max. :5.000 Max. :9.920 Max. :1.00
## Chance.of.Admit
## Min. :0.3400
## 1st Qu.:0.6300
## Median :0.7200
## Mean :0.7217
## 3rd Qu.:0.8200
## Max. :0.9700
# Gráfica de densidad para cada variable numérica
numeric_vars <- admissions[, sapply(admissions, is.numeric)]
plots <- lapply(names(numeric_vars), function(var) {
ggplot(admissions, aes_string(x = var)) +
geom_density(fill = "blue", alpha = 0.5) +
labs(title = paste("Densidad de", var))
})
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
do.call(grid.arrange, c(plots, ncol = 3))
ggpairs(numeric_vars)
Existen variables que estan correlacionadas siendo las mas importantes GGPA con Score.
# Scatter plots
ggplot(admissions, aes(x = GRE.Score, y = Chance.of.Admit)) + geom_point() + ggtitle("GRE.Score vs Chance of Admit")
ggplot(admissions, aes(x = TOEFL.Score, y = Chance.of.Admit)) + geom_point() + ggtitle("TOEFL.Score vs Chance of Admit")
ggplot(admissions, aes(x = CGPA, y = Chance.of.Admit)) + geom_point() + ggtitle("CGPA vs Chance of Admit")
# Configuración de cross-validation
set.seed(123)
train_control <- trainControl(method = "cv", number = 10)
# Modelos a evaluar
formulas <- list(
Chance.of.Admit ~ TOEFL.Score,
Chance.of.Admit ~ CGPA,
Chance.of.Admit ~ GRE.Score,
Chance.of.Admit ~ TOEFL.Score + CGPA,
Chance.of.Admit ~ TOEFL.Score + GRE.Score,
Chance.of.Admit ~ GRE.Score + CGPA,
Chance.of.Admit ~ TOEFL.Score + CGPA + GRE.Score
)
# Evaluación de modelos
results <- lapply(formulas, function(f) {
model <- train(f, data = admissions, method = "lm", trControl = train_control)
rmse <- model$results$RMSE
list(formula = f, RMSE = rmse)
})
# Configuración de cross-validation
set.seed(123)
train_control <- trainControl(method = "cv", number = 10)
# Modelos a evaluar
formulas <- list(
Chance.of.Admit ~ TOEFL.Score,
Chance.of.Admit ~ CGPA,
Chance.of.Admit ~ GRE.Score,
Chance.of.Admit ~ TOEFL.Score + CGPA,
Chance.of.Admit ~ TOEFL.Score + GRE.Score,
Chance.of.Admit ~ GRE.Score + CGPA,
Chance.of.Admit ~ TOEFL.Score + CGPA + GRE.Score
)
# Evaluación de modelos
results <- lapply(formulas, function(f) {
model <- train(f, data = admissions, method = "lm", trControl = train_control)
rmse <- model$results$RMSE
list(formula = f, RMSE = rmse)
})
# Convertir la lista de resultados en un data frame
resultados_df <- do.call(rbind, lapply(results, function(x) {
data.frame(Formula = paste(deparse(x$formula), collapse = " "), RMSE = x$RMSE)
}))
# Ordenar el data frame por RMSE en orden ascendente
resultados_df <- resultados_df[order(resultados_df$RMSE), ]
resultados_df
## Formula RMSE
## 7 Chance.of.Admit ~ TOEFL.Score + CGPA + GRE.Score 0.06215776
## 6 Chance.of.Admit ~ GRE.Score + CGPA 0.06283237
## 4 Chance.of.Admit ~ TOEFL.Score + CGPA 0.06381828
## 2 Chance.of.Admit ~ CGPA 0.06625857
## 5 Chance.of.Admit ~ TOEFL.Score + GRE.Score 0.07681233
## 3 Chance.of.Admit ~ GRE.Score 0.08265295
## 1 Chance.of.Admit ~ TOEFL.Score 0.08579917
Ejercicio #3: A continuación se le muestran tres imágenes que muestran los resultados obtenidos de correr la función summary() a dos modelos de regresión lineal, para este ejercicio se le solicita que realice la interpretación de las tablas resultantes. Recuerde tomar en cuenta la signficancia de los parámetros (signfícancia local), la signficancia del modelo (signficancia global), el valor del 𝑟!: y cualquier observación que considere relevante para determinar si el modelo estructuralmente es adecuado o no.
#Modelo 1
Ek modelo 1 muestra la relacion del la variable dependiente Roll con la variable independiete UNEM, esta ultima es estadisticamente significativa al 5% al nivel local mientras que el intercepto del modelo no es estadisticamente significativo. El r2 0.1531. indica que aproximadamente el 15.31% de la variabilidad en ROLL es explicada por UNEM, y a nivel global el p-value: 0.03579. Indica que el modelo en su conjunto es significativo al nivel del 5%.
#Modelo 2
El modelo 2 muestra la relacion de la variable dependiente Roll con las variables independientes UNEM, HGRAD y INC, a nivel local todas las vriables son estadisticamente significativa a 0.001%, mientras que el r2 0.9621 indica que aproximadamente el 96.21% de la variabilidad en ROLL es explicada por las variables independientes. Por su parte el p-value es muy cercano a cero, lo que indica que en conjunto el modelo es significativo.
El modelo 3 muesta la relacion entre la variable dependiente Cab.Price con la variable independiente Months. La variable Months como el intercepto son estadisticamente significativas al 0.0001% a nivel loval y el r2 es considerablemente alto con 94.6%. Por tanto el p-value tambien es bastante bajo lo que implica que a nivel conjunto el modelo es significativo.