Evidencia Empirica
library(readr)
insurance <- read_csv("C:/Users/MINEDUCYT/Downloads/insurance.csv")
head(insurance, 10)## # A tibble: 10 × 7
## age sex bmi children smoker region charges
## <dbl> <chr> <dbl> <dbl> <chr> <chr> <dbl>
## 1 19 female 27.9 0 yes southwest 16885.
## 2 18 male 33.8 1 no southeast 1726.
## 3 28 male 33 3 no southeast 4449.
## 4 33 male 22.7 0 no northwest 21984.
## 5 32 male 28.9 0 no northwest 3867.
## 6 31 female 25.7 0 no southeast 3757.
## 7 46 female 33.4 1 no southeast 8241.
## 8 37 female 27.7 3 no northwest 7282.
## 9 37 male 29.8 2 no northeast 6406.
## 10 60 female 25.8 0 no northwest 28923.
Modelo Estimado
library(lmtest)
library(stargazer)
library(equatiomatic)
modelo_seguro <- lm(formula = charges ~ age + bmi + children + smoker + region, data = insurance)
extract_eq(modelo_seguro,wrap = TRUE) #optativo\[ \begin{aligned} \operatorname{charges} &= \alpha + \beta_{1}(\operatorname{age}) + \beta_{2}(\operatorname{bmi}) + \beta_{3}(\operatorname{children})\ + \\ &\quad \beta_{4}(\operatorname{smoker}_{\operatorname{yes}}) + \beta_{5}(\operatorname{region}_{\operatorname{northwest}}) + \beta_{6}(\operatorname{region}_{\operatorname{southeast}}) + \beta_{7}(\operatorname{region}_{\operatorname{southwest}})\ + \\ &\quad \epsilon \end{aligned} \]
library(stargazer)
modelo_seguro <- lm(charges ~ age + bmi + children + smoker + region, data = insurance)
stargazer(modelo_seguro, type = "html", title = "Modelo de Regresión Lineal - Seguro de Salud")| Dependent variable: | |
| charges | |
| age | 256.974*** |
| (11.891) | |
| bmi | 338.665*** |
| (28.559) | |
| children | 474.566*** |
| (137.740) | |
| smokeryes | 23,836.300*** |
| (411.856) | |
| regionnorthwest | -352.182 |
| (476.120) | |
| regionsoutheast | -1,034.360** |
| (478.537) | |
| regionsouthwest | -959.375** |
| (477.778) | |
| Constant | -11,990.270*** |
| (978.762) | |
| Observations | 1,338 |
| R2 | 0.751 |
| Adjusted R2 | 0.750 |
| Residual Std. Error | 6,060.178 (df = 1330) |
| F Statistic | 572.697*** (df = 7; 1330) |
| Note: | p<0.1; p<0.05; p<0.01 |
Verificación de los supuestos del Modelo Clásico de Regresión Lineal Múltiple
Verifiación de los ajuste de los residuos
library(fitdistrplus)
fit_normal<-fitdist(data = modelo_seguro$residuals,distr = "norm")
plot(fit_normal)Verificación de la Normalidad
\(H_0 : \varepsilon \sim N(0, \sigma^2)\) “Los Residuos siguen una distribución normal con media cero y varianza constante”
\(H_A : \varepsilon \not\sim N(0, \sigma^2)\) “Los Residuos no siguen una distribución normal con media cero y varianza constante”
Prueba de Shapiro-Wilk
# Extración de Residuos
residuos <- residuals(modelo_seguro)
options(scipen = 99) # Evitar notación científica en los resultados
# A) Prueba de Shapiro-Wilk
# Calculo de W
salida_SW <- shapiro.test(modelo_seguro$residuals)
print(salida_SW)##
## Shapiro-Wilk normality test
##
## data: modelo_seguro$residuals
## W = 0.89909, p-value < 0.00000000000000022
## [1] 11.07031
Prueba de Jaque-Bera
# B) Prueba de Jarque-Bera
library(tseries)
options(scipen = 99) # Evitar notación científica en los resultados
jb_test <- jarque.bera.test(residuos)
print(jb_test)##
## Jarque Bera Test
##
## data: residuos
## X-squared = 720.52, df = 2, p-value < 0.00000000000000022
Prueba de Kolmogorov-Smirnov con residuos estandarizados
options(scipen = 99) # Evitar notación científica en los resultados
# C) Prueba de Kolmogorov-Smirnov
library(nortest)
prueba_KS<-lillie.test(modelo_seguro$residuals)
prueba_KS##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: modelo_seguro$residuals
## D = 0.16124, p-value < 0.00000000000000022
Resultado en Forma Grafica
library(fastGraph)
# Parámetros del nivel de significancia y estadísticos
alpha_sig <- 0.05
JB_stat <- jb_test$statistic
gl <- jb_test$parameter
# Cálculo del Valor Crítico Teórico
VC_jb <- qchisq(1 - alpha_sig, gl, lower.tail = TRUE)
# Grafico
shadeDist(VC_jb,
ddist = "dchisq",
parm1 = gl,
lower.tail = FALSE,
xmin = 0,
xmax = 10,
sub = paste("VC:", round(VC_jb, 2), " ", "JB:", round(JB_stat, 2)))Conclusion: El comportamiento de los residuos es idéntico: todas las pruebas estadísticas arrojan un p-valor menor al nivel de significancia (0.05), confirmando el rechazo de la hipótesis nula de normalidad. Por lo que se puede decir, “Los Residuos no siguen una distribución normal con media cero y varianza constante”
Verificación de Multicolinealidad
Indice de Condición
\(\kappa(\mathbf{x}) = \sqrt{\frac{\lambda_{max}}{\lambda_{min}}}\)
Interpretación del Índice de Condición:
Si \(\kappa(\mathbf{x}) \leq 20\), la multicolinealidad es leve y no representa un problema significativo.
Cuando \(20 < \kappa(\mathbf{x}) < 30\), se considera que la multicolinealidad es de nivel moderado.
Si \(\kappa(\mathbf{x}) \geq 30\), la multicolinealidad es severa y puede comprometer los resultados del modelo.
# OPCION 1
# Cálculo del Indice de Condición usando librería “mctest”
library(mctest)
X_mat<-model.matrix(modelo_seguro)
mctest(mod = modelo_seguro)##
## Call:
## omcdiag(mod = mod, Inter = TRUE, detr = detr, red = red, conf = conf,
## theil = theil, cn = cn)
##
##
## Overall Multicollinearity Diagnostics
##
## MC Results detection
## Determinant |X'X|: 0.5205 0
## Farrar Chi-Square: 871.0716 1
## Red Indicator: 0.1477 0
## Sum of Lambda Inverse: 8.8309 0
## Theil's Method: -3.3025 0
## Condition Number: 16.0587 0
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test
Factores Inflacionarios de la Varianza (FIV)
VIF Interpretación
Igual a 1 - Sin multicolinealidad
Menor a 5 - Baja o moderada, generalmente aceptable
Menor a 10 - Posible problema de multicolinealidad
Mayor a 10. Problema serio de multicolinealidad
Nota: El criterio puede cambiar dependiendo del investigador.
# CÁLCULO DE LAS VIFs usando performance
library(performance)
VIFs<-multicollinearity(x = modelo_seguro,verbose = FALSE)
VIFs## # Check for Multicollinearity
##
## Low Correlation
##
## Term VIF VIF 95% CI adj. VIF Tolerance Tolerance 95% CI
## age 1.02 [1.00, 1.48] 1.01 0.98 [0.68, 1.00]
## bmi 1.10 [1.06, 1.19] 1.05 0.91 [0.84, 0.95]
## children 1.00 [1.00, 6798.74] 1.00 1.00 [0.00, 1.00]
## smoker 1.01 [1.00, 30.88] 1.00 0.99 [0.03, 1.00]
## region 1.10 [1.05, 1.19] 1.05 0.91 [0.84, 0.95]
Verificación de la Homocedasticidad
\(\hat{\delta}^2_u = \delta_0 + \delta_1 x_1 + \delta_2 x_2 + \ldots + \delta_k x_k + \alpha_2 x_1^2 + \alpha_2 x_2^2 \ldots + \alpha_k x_k^2 + \theta_1 x_1 x_2 + \theta_1 x_1 x_3 + \theta_k C2 \alpha_i x_j\)
Hipótesis
\(H_0\): \(\delta_1 = \delta_2 = \ldots = \delta_k = \alpha_1 = \alpha_2 = \ldots = \alpha_k = \theta_1 = \theta_2 = \ldots = \theta_k C_2 = 0\)
Existe evidencia estadística de que los residuos son homocedásticos (la varianza del error es constante).
\(H_1\): \(\delta_1 = \delta_2 = \ldots = \delta_k = \alpha_1 = \alpha_2 = \ldots = \alpha_k = \theta_1 = \theta_2 = \ldots = \theta_k C_2 \neq 0\)
Existe evidencia estadística de que los residuos son heterocedásticos (la varianza del error no es constante).
Prueba de White
library(lmtest)
options(scipen = 99) # Evitar notación científica en los resultados
# Ejecutar la prueba de White para el nuevo modelo
PWhite <- bptest(
modelo_seguro,
~ I(age^2) + I(bmi^2) + I(children^2) + age * bmi + age * children + age * smoker + age * region + bmi * children + bmi * smoker + bmi * region + children * smoker + children * region + smoker * region, data = insurance)
# Mostrar los resultados
print(PWhite)##
## studentized Breusch-Pagan test
##
## data: modelo_seguro
## BP = 139.81, df = 28, p-value < 0.00000000000000022
## Usando Libreraria Skedastic (Otra alternativa)
library(skedastic)
options(scipen = 99) # Evitar notación científica en los resultados
skedastic::white(modelo_seguro, interactions = FALSE) ## # A tibble: 1 × 5
## statistic p.value parameter method alternative
## <dbl> <dbl> <dbl> <chr> <chr>
## 1 128. 1.92e-20 14 White's Test greater
Conclusión. Como el p-value < nivel de significancia (0.05). Se rechaza la hipótesis nula; por lo tanto, existe evidencia estadística de la presencia de heterocedasticidad en la varianza de los residuos.
Verificación de Autocorrelación
Prueba de Durbin-Watson
Se asume que los residuos presentan la siguiente estructura:
\(u_i = \rho u_{i-1} + v_i\)
\(H_0 : \rho = 0\)
No existe autocorrelación de primer orden en los residuos del modelo estimado
\(H_1 : \rho \neq 0\)
Se detecta presencia de autocorrelación de primer orden en los residuos del modelo estimado
##
## Durbin-Watson test
##
## data: modelo_seguro
## DW = 2.089, p-value = 0.1035
## alternative hypothesis: true autocorrelation is not 0
## lag Autocorrelation D-W Statistic p-value
## 1 -0.04582739 2.088964 0.082
## Alternative hypothesis: rho != 0
Conclusión: Como el p-value es menor al nivel de significancia (0.05), se rechaza la hipótesis nula, lo que indica que existe evidencia estadística de la presencia de autocorrelación de primer orden en los residuos del modelo estimado.
Multiplicadores de Lagrange (Breusch-Godfrey)
\(u_j = \rho_1 u_{i-1} + \rho_2 u_{i-2} + \ldots + \rho_m u_{i-m} + u_j\)
\(H_0: \rho_1 = \rho_2 = \rho_3 = \ldots = \rho_m = 0\)
Los residuos del modelo no presentan dependencia entre sí y carecen de autocorrelación hasta el orden \(m\).
\(H_1: \rho_1 = \rho_2 = \rho_3 = \ldots = \rho_m \neq 0\)
Los residuos del modelo presentan dependencia entre sí y exhiben autocorrelación hasta el orden \(m\).
Prueba de Breusch-Godfrey de segundo orden
##
## Breusch-Godfrey test for serial correlation of order up to 2
##
## data: modelo_seguro
## LM test = 5.1285, df = 2, p-value = 0.07698
Conclusión. Como p-value > nivel de significancia (0.05), no se rechaza la hipótesis nula; por lo tanto, puede concluirse que los residuos del modelo no siguen autocorrelación de orden “2”.
Prueba de Breusch-Godfrey de primer orden
##
## Breusch-Godfrey test for serial correlation of order up to 1
##
## data: modelo_seguro
## LM test = 2.8251, df = 1, p-value = 0.0928
Conclusión. Como p-value > nivel de significancia (0.05), no se rechaza la hipótesis nula; por lo tanto, puede concluirse que los residuos del modelo no siguen autocorrelación de orden “1”.
Forma Gráfica
# Extraemos los residuos de tu modelo
residuos <- residuals(modelo_seguro)
# Graficamos con ZOOM
acf(residuos,
lag.max = 5, # Zoom en X: Muestra solo hasta el lag 5
ylim = c(-0.2, 0.2), # Zoom en Y: Corta el gráfico entre -0.2 y 0.2
main = "Correlograma de los Residuos",
xlab = "Lag",
ylab = "ACF")Intepretación. Al mirar la gráfica,ninguna de las líneas negras (del 1 al 5) se salga de las líneas punteadas azules. Como todas se quedan guardadas ahí dentro, significa que los errores del modelo son completamente aleatorios y no dependen unos de otros.
Estimadores HAC
## Warning in options(scipen = 99999): invalid 'scipen' 99999, used 9999
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -11990.270 978.762 -12.2505 < 0.00000000000000022 ***
## age 256.974 11.891 21.6101 < 0.00000000000000022 ***
## bmi 338.665 28.559 11.8584 < 0.00000000000000022 ***
## children 474.566 137.740 3.4454 0.000588 ***
## smokeryes 23836.301 411.856 57.8753 < 0.00000000000000022 ***
## regionnorthwest -352.182 476.120 -0.7397 0.459618
## regionsoutheast -1034.360 478.537 -2.1615 0.030834 *
## regionsouthwest -959.375 477.778 -2.0080 0.044846 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Warning in options(scipen = 99999): invalid 'scipen' 99999, used 9999
library(lmtest)
library(sandwich)
#Corregido
#HC0 Corrige Sólo Heterocedasticidad, use HC1 para corregir también Autocorrelación de Primer Orden
estimacion_omega<-vcovHC(modelo_seguro,type = "HC0")
coeftest(modelo_seguro,vcov. = estimacion_omega)##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -11990.27 1034.02 -11.5958 < 0.00000000000000022 ***
## age 256.97 11.86 21.6664 < 0.00000000000000022 ***
## bmi 338.67 31.53 10.7410 < 0.00000000000000022 ***
## children 474.57 129.80 3.6563 0.0002659 ***
## smokeryes 23836.30 571.14 41.7344 < 0.00000000000000022 ***
## regionnorthwest -352.18 482.84 -0.7294 0.4658903
## regionsoutheast -1034.36 499.59 -2.0704 0.0386042 *
## regionsouthwest -959.38 459.57 -2.0875 0.0370287 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
options(scipen = 99)
library(robustbase)
library(stargazer)
modelo_seguro_robust<-lmrob(charges ~ age + bmi + children + smoker + region, data = insurance)
# print(summary(modelo_seguro_robust))
stargazer(modelo_seguro,modelo_seguro_robust,type = "html",title = "comparativa")| Dependent variable: | ||
| charges | ||
| OLS | MM-type | |
| linear | ||
| (1) | (2) | |
| age | 256.974*** | 254.205 |
| (11.891) | ||
| bmi | 338.665*** | 2.438 |
| (28.559) | ||
| children | 474.566*** | 427.692 |
| (137.740) | ||
| smokeryes | 23,836.300*** | 14,754.670 |
| (411.856) | ||
| regionnorthwest | -352.182 | -192.899 |
| (476.120) | ||
| regionsoutheast | -1,034.360** | -599.957 |
| (478.537) | ||
| regionsouthwest | -959.375** | -536.830 |
| (477.778) | ||
| Constant | -11,990.270*** | -3,310.998 |
| (978.762) | ||
| Observations | 1,338 | 1,338 |
| R2 | 0.751 | 0.991 |
| Adjusted R2 | 0.750 | 0.991 |
| Residual Std. Error (df = 1330) | 6,060.178 | 902.145 |
| F Statistic | 572.697*** (df = 7; 1330) | |
| Note: | p<0.1; p<0.05; p<0.01 | |
Pronosticos
## Pronosticos
options(scipen = 99)
library(lmtest)
library(stargazer)
library(equatiomatic) # optativo remotes::install_github("datalorax/equatiomatic")
#Modelo estimado medv~. indica "medv" en función del resto de variables del dataframe
#Adaptado a tu modelo_seguro justificado con tus variables
modelo_seguro <- lm(formula = charges ~ age + bmi + children + smoker + region, data = insurance)
extract_eq(modelo_seguro,wrap = TRUE) #optativo\[ \begin{aligned} \operatorname{charges} &= \alpha + \beta_{1}(\operatorname{age}) + \beta_{2}(\operatorname{bmi}) + \beta_{3}(\operatorname{children})\ + \\ &\quad \beta_{4}(\operatorname{smoker}_{\operatorname{yes}}) + \beta_{5}(\operatorname{region}_{\operatorname{northwest}}) + \beta_{6}(\operatorname{region}_{\operatorname{southeast}}) + \beta_{7}(\operatorname{region}_{\operatorname{southwest}})\ + \\ &\quad \epsilon \end{aligned} \]
Usando Predict
library(stargazer)
options(scipen = 2)
#Data para la predicción X'm basado en un perfil de cliente para insurance
X_m<-data.frame(age=35, bmi=28.5, children=2, smoker="no", region="southwest")
# Intervalos de Confianza del 95% y del 99%
confidense<-c(0.95,0.99)
#Predicción usando predict (calculando ambos niveles para la matriz)
pred_95 <- predict(object = modelo_seguro, newdata = X_m, interval = "prediction", level = 0.95)
pred_99 <- predict(object = modelo_seguro, newdata = X_m, interval = "prediction", level = 0.99)
predicciones <- list()
predicciones$fit <- rbind(pred_95, pred_99)
rownames(predicciones$fit)<-as.character(confidense*100)
colnames(predicciones$fit)<-c("Ym","Li","Ls")
stargazer(predicciones$fit,
title = "Pronósticos e intervalos de confianza",
type = "html") #Poner results='asis' en opciones del chunk| Ym | Li | Ls | |
| 95 | 6,645.506 | -5,265.556 | 18,556.570 |
| 99 | 6,645.506 | -9,016.512 | 22,307.520 |
Predicción usnado libreria forescast
library(forecast)
library(kableExtra)
options(scipen = 2)
#Data para la predicción X'm
X_m<-data.frame(age=35, bmi=28.5, children=2, smoker="no", region="southwest")
#Nivel de confianza para el intervalo de confianza
confidense<-c(0.95,0.99)
#Realizando el pronóstico con forecast
pronosticos<-forecast(object = modelo_seguro,
level = confidense,
newdata = X_m,ts = FALSE)
kable(pronosticos,
caption = "Pronóstico e intervalos de confianza:",
digits = 1,format = "html") #Poner results='asis' en opciones del chunk| Point Forecast | Lo 95 | Hi 95 | Lo 99 | Hi 99 |
|---|---|---|---|---|
| 6645.5 | -5265.6 | 18556.6 | -9016.5 | 22307.5 |
#Simulación.
#Bias Proportion
Um<-function(pronosticado,observado){
library(DescTools)
((mean(pronosticado)-mean(observado))^2)/MSE(pronosticado,observado)
}
#Variance Proportion
Us<-function(pronosticado,observado){
library(DescTools)
((sd(pronosticado)-sd(observado))^2)/MSE(pronosticado,observado)
}
#Covariance Proportion
Uc<-function(pronosticado,observado){
library(DescTools)
(2*(1-cor(pronosticado,observado))*sd(pronosticado)*sd(observado))/MSE(pronosticado,observado)}
#Coeficiente U de Theil (también aparece en la librería "DescTools")
THEIL_U<-function(pronosticado,observado){
library(DescTools)
RMSE(pronosticado,observado)/(sqrt(mean(pronosticado^2))+sqrt(mean(observado^2)))
}
options(scipen = 99) #No mostrar notación cientifica.
library(dplyr) # Para manejo de datos y activar el operador "pipe" %>%
library(caret) # Permite Realizar muestreo sobre los data frame
library(DescTools) # Contiene las funciones para calcular las medidas de performance
library(stargazer) # Para dar formato, y obtener resumen estadistico de las simulaciones
set.seed(50) # Permite fijar la semilla aleatoria, para reproducir los resultados obtenidos en esta clase
# SOLICITADO: Simulación con 5,000 réplicas / iteraciones
numero_de_muestras<-5000
# Se crea la lista con las 5000 muestras sobre los cargos de seguros (80% entrenamiento)
muestras<- insurance$charges %>%
createDataPartition(p = 0.8,
times = numero_de_muestras,
list = TRUE)
# Listas vacias, que contendran los datos de entrenamiento, los pronosticos para los datos de prueba, y para las estadisticas de cada muestra
Modelos_Entrenamiento<-vector(mode = "list",
length = numero_de_muestras)
Pronostico_Prueba<-vector(mode = "list",
length = numero_de_muestras)
Resultados_Performance_data_entrenamiento<-vector(mode = "list",
length = numero_de_muestras)
Resultados_Performance<-vector(mode = "list",
length = numero_de_muestras)
#Estimación de los modelos lineales para cada muestra, los pronósticos y cálculo de las estadisticas de performance.
for(j in 1:numero_de_muestras){
Datos_Entrenamiento<- insurance[muestras[[j]], ]
Datos_Prueba<- insurance[-muestras[[j]], ]
# Modelo adaptado a tu estructura justificada
Modelos_Entrenamiento[[j]]<-lm(formula = charges ~ age + bmi + children + smoker + region, data = Datos_Entrenamiento)
Pronostico_Prueba[[j]]<-Modelos_Entrenamiento[[j]] %>% predict(Datos_Prueba)
Resultados_Performance_data_entrenamiento[[j]]<-data.frame(
R2 = R2(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$charges),
RMSE = RMSE(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$charges),
MAE = MAE(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$charges),
MAPE= MAPE(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$charges)*100,
THEIL=TheilU(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$charges,type = 1),
Um=Um(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$charges),
Us=Us(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$charges),
Uc=Uc(Modelos_Entrenamiento[[j]]$fitted.values,
Datos_Entrenamiento$charges)
)
Resultados_Performance[[j]]<-data.frame(
R2 = R2(Pronostico_Prueba[[j]], Datos_Prueba$charges),
RMSE = RMSE(Pronostico_Prueba[[j]], Datos_Prueba$charges),
MAE = MAE(Pronostico_Prueba[[j]], Datos_Prueba$charges),
MAPE= MAPE(Pronostico_Prueba[[j]], Datos_Prueba$charges)*100,
THEIL=TheilU(Pronostico_Prueba[[j]], Datos_Prueba$charges,
type = 1), # También se puede usar la función que creamos: THEIL_U
Um=Um(Pronostico_Prueba[[j]], Datos_Prueba$charges),
Us=Us(Pronostico_Prueba[[j]], Datos_Prueba$charges),
Uc=Uc(Pronostico_Prueba[[j]], Datos_Prueba$charges)
)
} #No olvidar este corchete ;)bind_rows(Resultados_Performance_data_entrenamiento) %>%
stargazer(title = "Medidas de Performance Datos del Modelo (Entrenamiento 80%)",
type = "html",
digits = 3)| Statistic | N | Mean | St. Dev. | Min | Max |
| R2 | 5,000 | 0.751 | 0.008 | 0.725 | 0.778 |
| RMSE | 5,000 | 6,033.374 | 73.045 | 5,735.630 | 6,256.792 |
| MAE | 5,000 | 4,166.144 | 51.019 | 3,977.420 | 4,327.530 |
| MAPE | 5,000 | 42.069 | 0.886 | 38.878 | 44.981 |
| THEIL | 5,000 | 0.173 | 0.003 | 0.163 | 0.182 |
| Um | 5,000 | 0.000 | 0.000 | 0 | 0 |
| Us | 5,000 | 0.072 | 0.003 | 0.063 | 0.080 |
| Uc | 5,000 | 0.929 | 0.003 | 0.921 | 0.938 |
bind_rows(Resultados_Performance) %>%
stargazer(title = "Medidas de Performance Simulación (Predictivo - 5,000 Réplicas)",
type = "html",
digits = 3)| Statistic | N | Mean | St. Dev. | Min | Max |
| R2 | 5,000 | 0.749 | 0.031 | 0.625 | 0.839 |
| RMSE | 5,000 | 6,092.745 | 292.925 | 5,109.142 | 7,164.056 |
| MAE | 5,000 | 4,211.507 | 156.204 | 3,699.289 | 4,826.858 |
| MAPE | 5,000 | 42.452 | 2.845 | 33.856 | 54.501 |
| THEIL | 5,000 | 0.174 | 0.010 | 0.141 | 0.215 |
| Um | 5,000 | 0.004 | 0.006 | 0.000 | 0.059 |
| Us | 5,000 | 0.078 | 0.043 | 0.00000 | 0.282 |
| Uc | 5,000 | 0.922 | 0.043 | 0.706 | 1.002 |