Codigo Del Proyecto
# Paquetes y carga de la base
#-------------------------------------------------
library(tidyverse)
datos <- read.csv(file.choose(), check.names = FALSE)
# Renombrar columnas según el orden del formulario
names(datos) <- c("timestamp", "sexo", "edad",
"q0", "q3000", "q6000", "q9000", "q12000", "q15000")
# Crear un ID por persona (opcional pero útil)
datos <- datos %>% mutate(id = row_number())
#-------------------------------------------------
# Preparar datos
#-------------------------------------------------
datos_long <- datos %>%
pivot_longer(
cols = starts_with("q"), # q0, q3000, q6000, ...
names_to = "precio_label",
values_to = "Q"
) %>%
mutate(
# Precio asociado a cada columna
P = case_when(
precio_label == "q0" ~ 0,
precio_label == "q3000" ~ 3000,
precio_label == "q6000" ~ 6000,
precio_label == "q9000" ~ 9000,
precio_label == "q12000" ~ 12000,
precio_label == "q15000" ~ 15000
),
# Dummy de sexo: 1 = hombre, 0 = mujer
sexo_dummy = if_else(sexo == "Masculino", 1, 0)
)
# Ajuste para evitar log(0): Q* = Q - min(Q) + 1, P* = P - min(P) + 1
datos_long <- datos_long %>%
mutate(
Q_adj = Q - min(Q) + 1,
P_adj = P - min(P) + 1,
lnQ = log(Q_adj),
lnP = log(P_adj),
lnEdad = log(edad),
# Estandarización (puntaje z) solo para variables continuas
ZQ = as.numeric(scale(Q_adj)),
ZP = as.numeric(scale(P_adj)),
ZEdad = as.numeric(scale(edad))
)
#-------------------------------------------------
# BLOQUE 3: Estimar los 7 modelos de la Parte I
#-------------------------------------------------
# 1) Modelo lineal estándar
# Q = β0 + β1 P + β2 Edad + β3 Sexo + ε
m1 <- lm(Q ~ P + edad + sexo_dummy, data = datos_long)
# 2) Modelo log-log
# lnQ = β0 + β1 lnP + β2 lnEdad + β3 Sexo + ε
m2 <- lm(lnQ ~ lnP + lnEdad + sexo_dummy, data = datos_long)
# 3) Modelo lin-log
# Q = β0 + β1 lnP + β2 lnEdad + β3 Sexo + ε
m3 <- lm(Q ~ lnP + lnEdad + sexo_dummy, data = datos_long)
# 4) Modelo log-lin
# lnQ = β0 + β1 P + β2 Edad + β3 Sexo + ε
m4 <- lm(lnQ ~ P + edad + sexo_dummy, data = datos_long)
# 5) Modelo cuadrático
# Q = β0 + β1 P + β2 P^2 + β3 Edad + β4 Sexo + ε
m5 <- lm(Q ~ P + I(P^2) + edad + sexo_dummy, data = datos_long)
# 6) Modelo cúbico
# Q = β0 + β1 P + β2 P^2 + β3 P^3 + β4 Edad + β5 Sexo + ε
m6 <- lm(Q ~ P + I(P^2) + I(P^3) + edad + sexo_dummy, data = datos_long)
# 7) Modelo estandarizado
# Z(Q) = β0 + β1 Z(P) + β2 Z(Edad) + β3 Sexo + ε
m7 <- lm(ZQ ~ ZP + ZEdad + sexo_dummy, data = datos_long)
# Para revisar rápido:
summary(m1)
summary(m2)
summary(m3)
summary(m4)
summary(m5)
summary(m6)
summary(m7)
#-------------------------------------------------
# BLOQUE 4: Métricas de ajuste para cada modelo
#-------------------------------------------------
# Lista con los modelos estimados
modelos <- list(
"Lineal" = m1,
"Log-Log" = m2,
"Lin-Log" = m3,
"Log-Lin" = m4,
"Cuadrático" = m5,
"Cúbico" = m6,
"Estandarizado" = m7
)
# Calcular R2, R2 ajustado, F, p-valor(F), RMSE y AIC
tabla_metricas <- purrr::map_dfr(names(modelos), function(nm) {
mod <- modelos[[nm]]
s <- summary(mod)
f <- s$fstatistic
tibble(
Modelo = nm,
R2 = s$r.squared,
R2_ajustado = s$adj.r.squared,
F = unname(f["value"]),
p_F = pf(f["value"], f["numdf"], f["dendf"],
lower.tail = FALSE),
RMSE = sqrt(mean(residuals(mod)^2)),
AIC = AIC(mod)
)
})
tabla_metricas
#-------------------------------------------------
# Prueba de Box–Cox
# Modelo en niveles: Q ~ P + Edad + Sexo
# (Usamos Q_adj para que todo sea > 0)
#-------------------------------------------------
library(MASS)
# Modelo en niveles con Q ajustada
m_box <- lm(Q_adj ~ P + edad + sexo_dummy, data = datos_long)
# Box–Cox sobre ese modelo
bc <- boxcox(m_box, lambda = seq(-2, 2, by = 0.1))
# Lambda óptimo
lambda_opt <- bc$x[which.max(bc$y)]
lambda_opt
#-------------------------------------------------
#Prueba de Ramsey RESET
#-------------------------------------------------
library(lmtest)
reset_m1 <- resettest(m1, power = 2:3) # agrega P^2, P^3, etc.
reset_m1