Para realizar un Análisis de Regresión Lineal Simple en R, se hará comparación de dos enfoques: el enfoque clásico y el enfoque actual; además, se utilizará el conjunto de datos predefinido de R "mtcars", del cual obtendremos la relación entre el "consumo de combustible" (mpg) como variable dependiente y el "peso del vehículo" (wt) como variable independiente.
A. Enfoque Clásico
1. Recolección y Descripción de la Data
```{r}
# Cargar datos (por ejemplo mtcars)
data(mtcars)
head(mtcars)
summary(mtcars)
```
2. Preparación de los Datos
- Verificar que los datos están limpios:
```{r}
# Verificar valores faltantes
sum(is.na(mtcars))
# Verificar duplicados
sum(duplicated(mtcars))
```
- Para este caso, "mtcars" no tiene valores faltantes ni duplicados; pero si los hubiera, habilitamos el siguiente código:
```{r}
# Imputar valores faltantes(por ejemplo con la mediana)
# mtcars[is.na(mtcars)] <- median(mtcars, na.rm = TRUE)
# Eliminar duplicados si es necesario
# mtcars <- mtcars[!duplicated(mtcars), ]
```
3. Análisis Exploratorio
```{r}
# Estadísticos descriptivos
summary(mtcars)
# Gráfico de barras por variable
par(mfrow=c(2,2))
hist(mtcars$mpg, main="Distribución de mpg", xlab="mpg")
hist(mtcars$wt, main="Distribución de wt", xlab="wt")
# Gráfico de dispersión
plot(mtcars$wt, mtcars$mpg, xlab = "Peso del Vehículo (1000 lbs)", ylab = "Consumo (mpg)", main = "Consumo vs. Peso del Vehículo")
```
4. Construcción del Modelo
```{r}
# Construcción del modelo
model <- lm(mpg ~ wt, data = mtcars)
summary(model)
```
5. Outliers
- Detectamos outliers o valores atípicos.
```{r}
# Detectar outliers usando los residuos estandarizados
residuals_standardized <- rstandard(model)
outliers <- which(abs(residuals_standardized) > 2)
mtcars[outliers, ]
```
- En caso se tenga que eliminar outliers, activamos los siguientes códigos.
```{r}
# Eliminación de outliers y ajuste de modelo
#mtcars_clean <- mtcars[-outliers, ]
#model_clean <- lm(mpg ~ wt, data = mtcars_clean)
#summary(model_clean)
```
Nota. Si se eliminaron los outliers del modelo, los siguientes pasos deben realizarse con el modelo limpio.
6. Abordar los Supuestos
- Verificamos los supuestos de la regresión lineal simple.
```{r}
# Linealidad
plot(mtcars$wt, model$residuals, xlab = "Peso del Vehículo (1000 lbs)", ylab = "Residuos", main = "Residuos vs. Peso del Vehículo")
abline(h = 0, col = "red")
# Independencia de los errores
library(lmtest)
dwtest(model)
# Homoscedasticidad
library(car)
bptest(model)
# Normalidad de los errores
qqnorm(model$residuals)
qqline(model$residuals)
shapiro.test(model$residuals)
```
7. Manejo de los Supuestos
Si encontramos supuestos que no se cumplen como:
- Linealidad: Si la relación no es lineal, podríamos transformar las variables (por ejemplo, sacar logaritmos) o usar una regresión polinómica.
- Independencia: Si los errores no son independientes, podríamos utilizar modelos de series temporales si los datos son secuenciales.
- Homocedasticidad: Si hay heterocedasticidad, podríamos transformar las variables o recurrir a métodos robustos.
- Normalidad: Si los errores no son normales, podría ser necesario transformar variables o recurrir a métodos no paramétricos.
Nota. Si hemos llevado a cabo alguna transformación, los siguientes pasos, deberán trabajarse usando el modelo transformado..
8. Validación del Modelo Final
```{r}
# Métricas de validación
summary(model)
anova(model)
# R2 y RMSE
r2 <- summary(model)$r.squared
rmse <- sqrt(mean(model$residuals^2))
cat("R2: ", r2, "\n")
cat("RMSE: ", rmse, "\n")
```
9. Predicción
```{r}
# Predicciones
pred <- predict(model, newdata = data.frame(wt = c(3, 4, 5)))
print(pred)
```
B. Enfoque Actual
1. Recolección y Descripción de la Data
```{r}
# Cargar los datos mtcars
data(mtcars)
head(mtcars)
summary(mtcars)
```
2. Preparación de los Datos
2.1. Limpieza de Datos
- Verificamos valores faltantes y duplicados, y los tratamos.
```{r}
# Verificar valores faltantes
sum(is.na(mtcars))
# En caso hayan valores faltantes, se haría
# mtcars <- na.omit(mtcars)
# o tambien se puede imputar usando por ejemplo, la mediana
# mtcars[is.na(mtcars)] <- median(mtcars, na.rm = TRUE)
# Verificar duplicados
sum(duplicated(mtcars))
#Eliminamos los duplicados si es necesario
# mtcars <- mtcars[!duplicated(mtcars),]
```
2.2. Transformar la data
- Para el ejemplo no será necesario estandarizar, pero si lo fuera, habilitar:
```{r}
# Estandarización
# mtcars$wt <- scale(mtcars$wt)
# mtcars$mpg <- scale(mtcars$mpg)
```
2.3. Codificación de datos categóricos
No hay variables categóricas para los datos del ejemplo; pero si los habría, se puede codificar en variables Dummy, habilitando lo siguiente:
```{r}
# Por ejemplo, suponiendo que la variables "cyl" de mtcars, es categórica
# mtcars$cyl <- as.factor(mtcars$cyl)
# mtcars <- model.matrix(~ mpg + wt + cyl - 1, data = mtcars)
```
2.4. Identificación y Eliminación de Outliers
- Ajustamos un modelo inicial solo para identificar y eliminar outliers:
```{r}
# Construcción del modelo inicial
model_initial <- lm(mpg ~ wt, data = mtcars)
summary(model_initial)
# Cálculo de residuos estandarizados
residuals_standardized <- rstandard(model_initial)
# Identificación de outliers (absoluto valor > 2)
outliers <- which(abs(residuals_standardized) > 2)
outliers
# Eliminación de outliers
mtcars_clean <- mtcars[-outliers, ]
```
2.5. Ajuste del Modelo Limpio
- Ajustamos el modelo sin los outliers, antes de dividir los datos:
```{r}
# Ajuste del modelo sin outliers
model_clean <- lm(mpg ~ wt, data = mtcars_clean)
summary(model_clean)
```
3. División de la Data
- Dividimos los datos en conjuntos de entrenamiento y prueba:
```{r}
# División de la data
set.seed(123)
train_index <- sample(seq_len(nrow(mtcars_clean)), size = 0.7*nrow(mtcars_clean))
train_data <- mtcars_clean[train_index, ]
test_data <- mtcars_clean[-train_index, ]
# En caso se quiera ver la división gráficamente, realizamos:
library(ggplot2)
mtcars_clean$set <- "Test"
mtcars_clean$set[train_index] <- "Train"
ggplot(mtcars_clean, aes(x = wt, y = mpg, color = set)) + geom_point(size = 3) +
labs(title = "División de Datos en Conjuntos de Entrenamiento y Prueba",
x = "Peso del Vehículo (wt)",
y = "Millas por Galón (mpg)",
color = "Conjunto") +
theme_minimal()
```
4. Ajustar el Modelo en la Data de Entrenamiento
- Ajustamos el modelo en el conjunto de datos de entrenamiento:
```{r}
# Ajustar el modelo en la data de entrenamiento
model_train <- lm(mpg ~ wt, data = train_data)
summary(model_train)
```
5. Abordar los Supuestos en el Conjunto de Entrenamiento
- Verificamos los supuestos del modelo ajustado en los datos de entrenamiento:
```{r}
# Linealidad
plot(train_data$wt, model_train$residuals, xlab = "Peso del Vehículo (1000 lbs)", ylab = "Residuos", main = "Residuos vs. Peso del Vehículo")
abline(h = 0, col = "red")
# Independencia de los errores
library(lmtest)
dwtest(model_train)
# Homoscedasticidad
library(car)
bptest(model_train)
# Normalidad de los errores
qqnorm(model_train$residuals)
qqline(model_train$residuals)
shapiro.test(model_train$residuals)
```
6. Transformaciones y Ajustes
Si se incumplen los supuestos podemos realizar las transformaciones necesarias; si no, procedemos con el siguiente paso.
7. Construcción del Modelo
- Construimos el modelo final.
```{r}
# Construcción del modelo final (puede incluir transformaciones realizadas)
model_final <- lm(mpg ~ wt, data = train_data)
summary(model_final)
```
8. Validación
- Usamos el conjunto de prueba para validar el modelo.
```{r}
# Predicciones en el conjunto de prueba
pred_test <- predict(model_final, newdata = test_data)
# Métricas de validación
r2_test <- summary(lm(test_data$mpg ~ pred_test))$r.squared
rmse_test <- sqrt(mean((test_data$mpg - pred_test)^2))
cat("R2 (test): ", r2_test, "\n")
cat("RMSE (test): ", rmse_test, "\n")
anova(lm(test_data$mpg ~ pred_test))
```
9. Predicción con nuevos datos
```{r}
# Predicciones con nuevos datos
new_data <- data.frame(wt = c(3, 4, 5))
pred_new <- predict(model_final, newdata = new_data)
print(pred_new)
```
10. Evaluación Final de Supuestos y Ajustes Adicionales
- Revisamos nuevamente los supuestos para el modelo final, así también realizamos ajustes adicionales si fuera necesario. Si los supuestos no se cumple, podríamos considerar el hacer uso de otros modelos.
Para concluir, podemos afirmar que ambos enfoques proporcionan modelos útiles y válidos aunque el último es más robusto y proporciona una validación más rigurosa, ya que se separan los datos en conjuntos de entrenamiento y prueba.
Recomendados: (1), (2).
No hay comentarios:
Publicar un comentario