library(readxl)
ventas_empresa <- read_excel("C:/Users/gisel/Downloads/ventas_empresa.xlsx")
View(ventas_empresa)
# 1. CARGA DE LIBRERÍAS Y DATOS
library(dplyr)
library(gt)
library(tseries) # Jarque-Bera
library(nortest) # Lilliefors
library(fastGraph) # Gráficas
library(stargazer) # Tablas de regresión
#ESTIMACIÓN DEL MODELO
modelo_ventas <- lm(V ~ C + P + M, data = ventas_empresa)
# Resultados del modelo
stargazer(modelo_ventas, title = "Modelo de Regresión de Ventas", type = "text")
##
## Modelo de Regresión de Ventas
## ===============================================
## Dependent variable:
## ---------------------------
## V
## -----------------------------------------------
## C 0.923***
## (0.223)
##
## P 0.950***
## (0.156)
##
## M 1.298***
## (0.431)
##
## Constant 107.444***
## (18.057)
##
## -----------------------------------------------
## Observations 24
## R2 0.980
## Adjusted R2 0.977
## Residual Std. Error 9.506 (df = 20)
## F Statistic 323.641*** (df = 3; 20)
## ===============================================
## Note: *p<0.1; **p<0.05; ***p<0.01
# Extracción de residuos
residuos <- modelo_ventas$residuals
# 3. VERIFICACIÓN DEL SUPUESTO DE NORMALIDAD
# A) PRUEBA JARQUE-BERA (JB)
options(scipen = 999)
salida_JB <- jarque.bera.test(residuos)
print(salida_JB)
##
## Jarque Bera Test
##
## data: residuos
## X-squared = 1.4004, df = 2, p-value = 0.4965
# Gráfica JB (Distribución Chi-cuadrado)
alpha_sig <- 0.05
JB_stat <- salida_JB$statistic
gl_jb <- salida_JB$parameter
VC_jb <- qchisq(1 - alpha_sig, gl_jb)
shadeDist(JB_stat, ddist = "dchisq", parm1 = gl_jb, lower.tail = FALSE, xmin = 0,
sub = paste("VC:", round(VC_jb, 2), " ", "JB:", round(JB_stat, 2)))
# B) PRUEBA LILLIEFORS (KS)
prueba_KS <- lillie.test(residuos)
print(prueba_KS)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: residuos
## D = 0.13659, p-value = 0.2935
# Tabla de cálculo manual (Estructura solicitada)
tabla_KS <- residuos %>%
as_tibble() %>%
mutate(posicion = row_number()) %>%
arrange(value) %>%
mutate(dist1 = row_number() / n(),
dist2 = (row_number() - 1) / n(),
zi = as.vector(scale(value, center = TRUE)),
pi = pnorm(zi),
dif1 = abs(dist1 - pi),
dif2 = abs(dist2 - pi))
# Mostrar tabla con destacados
tabla_KS %>%
gt() %>%
tab_header("Tabla para cálculo del Estadístico KS (Lilliefors)") %>%
tab_style(style = cell_fill(color = "lightblue"),
locations = cells_body(columns = dif1, rows = dif1 == max(dif1)))
| Tabla para cálculo del Estadístico KS (Lilliefors) | |||||||
| value | posicion | dist1 | dist2 | zi | pi | dif1 | dif2 |
|---|---|---|---|---|---|---|---|
| -17.27950969 | 11 | 0.04166667 | 0.00000000 | -1.949405386 | 0.02562352 | 0.0160431507 | 0.025623516 |
| -15.50384667 | 10 | 0.08333333 | 0.04166667 | -1.749082164 | 0.04013841 | 0.0431949244 | 0.001528258 |
| -13.84401165 | 19 | 0.12500000 | 0.08333333 | -1.561826195 | 0.05916447 | 0.0658355305 | 0.024168864 |
| -9.91393148 | 5 | 0.16666667 | 0.12500000 | -1.118450221 | 0.13168738 | 0.0349792889 | 0.006687378 |
| -8.43534410 | 9 | 0.20833333 | 0.16666667 | -0.951641887 | 0.17063932 | 0.0376940180 | 0.003972649 |
| -7.90808316 | 24 | 0.25000000 | 0.20833333 | -0.892158410 | 0.18615402 | 0.0638459847 | 0.022179318 |
| -6.65267950 | 23 | 0.29166667 | 0.25000000 | -0.750528776 | 0.22646815 | 0.0651985168 | 0.023531850 |
| -3.33614422 | 8 | 0.33333333 | 0.29166667 | -0.376370489 | 0.35332074 | 0.0199874078 | 0.061654074 |
| -3.32226362 | 4 | 0.37500000 | 0.33333333 | -0.374804535 | 0.35390292 | 0.0210970793 | 0.020569587 |
| -2.43553165 | 3 | 0.41666667 | 0.37500000 | -0.274766969 | 0.39174764 | 0.0249190286 | 0.016747638 |
| -0.40251845 | 21 | 0.45833333 | 0.41666667 | -0.045410527 | 0.48189005 | 0.0235567120 | 0.065223379 |
| 0.01280369 | 14 | 0.50000000 | 0.45833333 | 0.001444461 | 0.50057626 | 0.0005762565 | 0.042242923 |
| 3.09667909 | 20 | 0.54166667 | 0.50000000 | 0.349354988 | 0.63658859 | 0.0949219225 | 0.136588589 |
| 4.04562361 | 7 | 0.58333333 | 0.54166667 | 0.456411125 | 0.67595282 | 0.0926194830 | 0.134286150 |
| 4.98802235 | 12 | 0.62500000 | 0.58333333 | 0.562728793 | 0.71319021 | 0.0881902126 | 0.129856879 |
| 5.88324503 | 22 | 0.66666667 | 0.62500000 | 0.663724246 | 0.74656659 | 0.0798999242 | 0.121566591 |
| 6.28004614 | 18 | 0.70833333 | 0.66666667 | 0.708489765 | 0.76067942 | 0.0523460837 | 0.094012750 |
| 6.69809559 | 15 | 0.75000000 | 0.70833333 | 0.755652438 | 0.77507120 | 0.0250711962 | 0.066737863 |
| 6.78865323 | 16 | 0.79166667 | 0.75000000 | 0.765868789 | 0.77812281 | 0.0135438559 | 0.028122811 |
| 7.37251119 | 2 | 0.83333333 | 0.79166667 | 0.831737317 | 0.79722138 | 0.0361119495 | 0.005554717 |
| 8.70403920 | 6 | 0.87500000 | 0.83333333 | 0.981954997 | 0.83693899 | 0.0380610096 | 0.003605657 |
| 9.77138853 | 13 | 0.91666667 | 0.87500000 | 1.102369093 | 0.86484938 | 0.0518172880 | 0.010150621 |
| 10.67367778 | 1 | 0.95833333 | 0.91666667 | 1.204161768 | 0.88573647 | 0.0725968632 | 0.030930197 |
| 14.71907878 | 17 | 1.00000000 | 0.95833333 | 1.660547780 | 0.95159785 | 0.0484021522 | 0.006735485 |
# C) PRUEBA SHAPIRO-WILK (SW)
# ---------------------------------------------------------
# 1. Preparación de tabla manual y coeficientes ai
n_obs <- length(residuos)
residuos %>%
as_tibble() %>%
rename(residuales = value) %>%
arrange(residuales) %>%
mutate(pi = (row_number() - 0.375) / (n() + 0.25)) %>%
mutate(mi = qnorm(pi)) %>%
mutate(ai = 0) -> tabla_SW
# Cálculo de ai (Aproximación de Royston para n=24)
m_val <- sum(tabla_SW$mi^2)
theta <- 1 / sqrt(n_obs)
# Coeficientes extremos
tabla_SW$ai[n_obs] <- -2.706056*theta^5 + 4.434685*theta^4 - 2.071190*theta^3 - 0.147981*theta^2 + 0.2211570*theta + tabla_SW$mi[n_obs]/sqrt(m_val)
tabla_SW$ai[n_obs-1] <- -3.582633*theta^5 + 5.682633*theta^4 - 1.752461*theta^3 - 0.293762*theta^2 + 0.042981*theta + tabla_SW$mi[n_obs-1]/sqrt(m_val)
tabla_SW$ai[1] <- -tabla_SW$ai[n_obs]
tabla_SW$ai[2] <- -tabla_SW$ai[n_obs-1]
# Valores intermedios
omega <- (m_val - 2*tabla_SW$mi[n_obs]^2 - 2*tabla_SW$mi[n_obs-1]^2) / (1 - 2*tabla_SW$ai[n_obs]^2 - 2*tabla_SW$ai[n_obs-1]^2)
tabla_SW$ai[3:(n_obs-2)] <- tabla_SW$mi[3:(n_obs-2)] / sqrt(omega)
# Estadístico W manual
tabla_SW %>% mutate(ai_ui = ai * residuales, ui2 = residuales^2) -> tabla_SW
W_manual <- (sum(tabla_SW$ai_ui)^2) / sum(tabla_SW$ui2)
# Normalización Wn para la gráfica
mu_sw <- 0.0038915*log(n_obs)^3 - 0.083751*log(n_obs)^2 - 0.31082*log(n_obs) - 1.5861
sigma_sw <- exp(0.0030302*log(n_obs)^2 - 0.082676*log(n_obs) - 0.4803)
Wn_stat <- (log(1 - W_manual) - mu_sw) / sigma_sw
# Gráfica Shapiro-Wilk (Distribución Normal Estándar)
shadeDist(Wn_stat, ddist = "dnorm", lower.tail = FALSE,
sub = paste("Wn:", round(Wn_stat, 3), "W:", round(W_manual, 4)))
# Validación automática
shapiro.test(residuos)
##
## Shapiro-Wilk normality test
##
## data: residuos
## W = 0.95315, p-value = 0.3166
Prueba de Jarque-Bera (JB)Este test analizó si la asimetría y la curtosis de los residuales coinciden con las de una distribución normal. El estadístico obtenido fue de 1.4004 con un p-valor de 0.4965. Al superar ampliamente el umbral crítico de 0.05, se mantiene la hipótesis nula . Visualmente, el estadístico se sitúa en la zona de confianza de una distribución chi2 con dos grados de libertad, confirmando que los errores siguen la morfología de la campana de Gauss.
Prueba de Lilliefors (Corrección de Kolmogorov-Smirnov)Considerando que los parámetros poblacionales fueron estimados a partir de la muestra n=24, se empleó la corrección de Lilliefors. El análisis arrojó un estadístico D = 0.13659 y un p-valor de 0.2935. Dado que el p-valor es superior al nivel de significancia de 5%, se concluye que no existe una diferencia significativa entre la distribución observada y la teórica. Esto ratifica que las desviaciones máximas son despreciables y que los errores operan bajo condiciones de normalidad.
Prueba de Shapiro-Wilk (SW)Dada la alta potencia de esta prueba en muestras pequeñas, se utilizó como validación final. El resultado mostró un valor W = 0.95315 y un p-valor de 0.3166. Al no encontrar evidencia suficiente para rechazar la normalidad (p > 0.05), se confirma que el estadístico normalizado W_n se ubica fuera de las regiones críticas de rechazo. Este hallazgo asegura la linealidad y el comportamiento estable de los términos de error en el modelo.
# Evaluación de Multicolinealidad
# ---
# 1. Carga de librerías necesarias
library(stargazer)
library(mctest)
library(psych)
library(car)
library(fastGraph)
# --- 1. Índice de Condición ---
X_mat <- model.matrix(modelo_ventas) # Matriz de diseño
XX_matrix <- t(X_mat) %*% X_mat
# Normalización
options(scipen = 999)
Sn <- solve(diag(sqrt(diag(XX_matrix))))
XX_norm <- (Sn %*% XX_matrix) %*% Sn
# Autovalores y Cálculo de K
lambdas <- eigen(XX_norm, symmetric = TRUE)
K <- sqrt(max(lambdas$values) / min(lambdas$values))
print(paste("Índice de Condición (K):", round(K, 4)))
## [1] "Índice de Condición (K): 71.1635"
# --- 2. Prueba de Farrar-Glauber (Cálculo Manual) ---
Zn <- scale(X_mat[,-1]) # Escalamiento de regresores
n <- nrow(Zn)
m <- ncol(Zn)
R <- (t(Zn) %*% Zn) * (1 / (n - 1)) # Matriz de Correlación R
det_R <- det(R)
# Estadístico Chi-cuadrado FG
chi_FG <- -(n - 1 - (2 * m + 5) / 6) * log(det_R)
gl_fg <- m * (m - 1) / 2
VC_fg <- qchisq(p = 0.95, df = gl_fg)
p_val_fg <- pchisq(chi_FG, df = gl_fg, lower.tail = FALSE)
# Gráfica FG
shadeDist(chi_FG, ddist = "dchisq", parm1 = gl_fg, lower.tail = FALSE,
sub = paste("VC:", round(VC_fg, 2), " | FG:", round(chi_FG, 2)))
# --- 3. Factores Inflacionarios de la Varianza (VIF) ---
VIFs_car <- vif(modelo_ventas)
print(VIFs_car)
## C P M
## 7.631451 3.838911 9.449210