library(readxl)
ventas_empresa <- read_excel("C:/Users/JOSE CASTRO/Downloads/ventas_empresa.xlsx")
head(ventas_empresa)
## # A tibble: 6 × 4
## V C P M
## <dbl> <dbl> <dbl> <dbl>
## 1 607 197 173 110
## 2 590 208 152 107
## 3 543 181 150 99
## 4 558 194 150 102
## 5 571 192 163 109
## 6 615 196 179 114
str(ventas_empresa)
## tibble [24 × 4] (S3: tbl_df/tbl/data.frame)
## $ V: num [1:24] 607 590 543 558 571 615 606 593 582 646 ...
## $ C: num [1:24] 197 208 181 194 192 196 203 200 198 221 ...
## $ P: num [1:24] 173 152 150 150 163 179 169 166 159 206 ...
## $ M: num [1:24] 110 107 99 102 109 114 113 113 115 119 ...
names(ventas_empresa)
## [1] "V" "C" "P" "M"
1.Estime el modelo de regresión lineal, correspondiente y verifique el supuesto de normalidad, usando todas las pruebas vistas en clase. EL CASO DEL JB Y DEL SW REPRESENTE SUS RESULTADOS DE FORMA GRÁFICA Y COMENTE AL RESPECTO.
modelo_estimado <- lm(V ~ C + P + M, data = ventas_empresa)
summary(modelo_estimado)
##
## Call:
## lm(formula = V ~ C + P + M, data = ventas_empresa)
##
## Residuals:
## Min 1Q Median 3Q Max
## -17.279 -6.966 1.555 6.721 14.719
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 107.4435 18.0575 5.950 8.08e-06 ***
## C 0.9226 0.2227 4.142 0.000505 ***
## P 0.9502 0.1558 6.097 5.86e-06 ***
## M 1.2978 0.4307 3.013 0.006872 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 9.506 on 20 degrees of freedom
## Multiple R-squared: 0.9798, Adjusted R-squared: 0.9768
## F-statistic: 323.6 on 3 and 20 DF, p-value: < 2.2e-16
Verificando el ajuste de los residuos a la distribución normal, se usará la librería fitdistrplus.
library(fitdistrplus)
## Warning: package 'fitdistrplus' was built under R version 4.5.3
## Cargando paquete requerido: MASS
## Cargando paquete requerido: survival
fit_normal <- fitdist(data = modelo_estimado$residuals, distr = "norm")
plot(fit_normal)
library(tseries)
## Warning: package 'tseries' was built under R version 4.5.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
salida_JB<-jarque.bera.test(modelo_estimado$residuals)
salida_JB
##
## Jarque Bera Test
##
## data: modelo_estimado$residuals
## X-squared = 1.4004, df = 2, p-value = 0.4965
library(fastGraph)
## Warning: package 'fastGraph' was built under R version 4.5.3
alpha_sig <- 0.05
JB <- salida_JB$statistic
gl <- salida_JB$parameter
VC <- qchisq(1 - alpha_sig, gl, lower.tail = TRUE)
shadeDist(JB,
ddist = "dchisq",
parm1 = gl,
lower.tail = FALSE,
xmin = 0,
sub = paste("VC:", round(VC,2),
"JB:", round(JB,2)))
cat("JB =", salida_JB$statistic,
"\np-value =", salida_JB$p.value)
## JB = 1.400415
## p-value = 0.4964822
En este caso, dado que el p-value = 0.4964822 > 0.05, no se rechaza la hipótesis nula de normalidad, por lo que los residuos siguen una distribución normal.
library(nortest)
prueba_KS <- lillie.test(modelo_estimado$residuals)
print(prueba_KS)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: modelo_estimado$residuals
## D = 0.13659, p-value = 0.2935
p.value <- prueba_KS$p.value
print(p.value)
## [1] 0.2934537
En este caso, dado que el p-value = 0.2935 > 0.05, no se rechaza la hipótesis nula de normalidad, por lo que los residuos siguen una distribución normal.
hist(resid(modelo_estimado),
probability = TRUE,
main = "Histograma de residuos",
xlab = "Residuos")
curve(dnorm(x,
mean = mean(resid(modelo_estimado)),
sd = sd(resid(modelo_estimado))),
add = TRUE)
salida_SW <- shapiro.test(resid(modelo_estimado))
print(salida_SW)
##
## Shapiro-Wilk normality test
##
## data: resid(modelo_estimado)
## W = 0.95315, p-value = 0.3166
Wn_salida <- qnorm(salida_SW$p.value, lower.tail = FALSE)
print(Wn_salida)
## [1] 0.4773519
library(fastGraph)
shadeDist(Wn_salida,
ddist = "dnorm",
lower.tail = FALSE,
sub = paste("Wn:", round(Wn_salida,3),
"p-value:", round(salida_SW$p.value,5)))
En este caso, dado que el p-value = 0.3166 > 0.05, no se rechaza la hipótesis nula de normalidad, por lo que los residuos siguen una distribución normal. Además, gráficamente se observa que el estadístico transformado no cae en una región crítica de rechazo.
library(mctest)
X_mat <- model.matrix(modelo_estimado)
resultado_mctest <- mctest(mod = modelo_estimado)
resultado_mctest
##
## 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.0346 0
## Farrar Chi-Square: 71.2080 1
## Red Indicator: 0.8711 1
## Sum of Lambda Inverse: 20.9196 1
## Theil's Method: 0.5430 1
## Condition Number: 71.1635 1
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test
Los resultados obtenidos mediante la librería mctest muestran evidencia de multicolinealidad entre los regresores del modelo. En particular, el índice de condición es igual a 71.1635, valor superior a 20, lo que indica la presencia de multicolinealidad importante.
library(mctest)
resultado_fg <- mctest::omcdiag(mod = modelo_estimado)
resultado_fg
##
## Call:
## mctest::omcdiag(mod = modelo_estimado)
##
##
## Overall Multicollinearity Diagnostics
##
## MC Results detection
## Determinant |X'X|: 0.0346 0
## Farrar Chi-Square: 71.2080 1
## Red Indicator: 0.8711 1
## Sum of Lambda Inverse: 20.9196 1
## Theil's Method: 0.5430 1
## Condition Number: 71.1635 1
##
## 1 --> COLLINEARITY is detected by the test
## 0 --> COLLINEARITY is not detected by the test
m <- ncol(model.matrix(modelo_estimado)[,-1])
n <- nrow(model.matrix(modelo_estimado)[,-1])
R <- cor(model.matrix(modelo_estimado)[,-1])
determinante_R <- det(R)
chi_FG <- -(n - 1 - (2*m + 5)/6) * log(determinante_R)
gl <- m * (m - 1) / 2
VC <- qchisq(0.95, df = gl)
chi_FG
## [1] 71.20805
library(fastGraph)
shadeDist(chi_FG,
ddist = "dchisq",
parm1 = gl,
lower.tail = FALSE,
xmin = 0,
sub = paste("VC:", round(VC,2),
"FG:", round(chi_FG,2)))
Dado que el estadístico χ²FG = 106.75 es mayor que el valor crítico de la distribución chi-cuadrado (VC = 5.99), se rechaza la hipótesis nula de no colinealidad. Por lo tanto, existe evidencia estadística de multicolinealidad entre los regresores del modelo.
library(performance)
## Warning: package 'performance' was built under R version 4.5.3
VIFs <- multicollinearity(modelo_estimado, verbose = FALSE)
VIFs
## # Check for Multicollinearity
##
## Low Correlation
##
## Term VIF VIF 95% CI adj. VIF Tolerance Tolerance 95% CI
## P 3.84 [2.41, 6.73] 1.96 0.26 [0.15, 0.42]
##
## Moderate Correlation
##
## Term VIF VIF 95% CI adj. VIF Tolerance Tolerance 95% CI
## C 7.63 [4.49, 13.61] 2.76 0.13 [0.07, 0.22]
## M 9.45 [5.49, 16.91] 3.07 0.11 [0.06, 0.18]
library(see)
## Warning: package 'see' was built under R version 4.5.3
plot(VIFs)
Los resultados obtenidos muestran evidencia de multicolinealidad moderada entre algunos regresores del modelo. Las variables C y M presentan valores VIF relativamente elevados, mientras que la variable P presenta una correlación baja con las demás variables explicativas.
library(skedastic)
## Warning: package 'skedastic' was built under R version 4.5.3
white(modelo_estimado, interactions = TRUE)
## # A tibble: 1 × 5
## statistic p.value parameter method alternative
## <dbl> <dbl> <dbl> <chr> <chr>
## 1 7.12 0.624 9 White's Test greater
La prueba de White arroja un estadístico de 7.12265 con un p-value de 0.6243514, el cual es mayor que 0.05. Por lo tanto, no se rechaza la hipótesis nula de homocedasticidad, indicando que no existe evidencia de heterocedasticidad en el modelo.
residuos <- residuals(modelo_estimado)
ajustados <- fitted(modelo_estimado)
plot(ajustados, residuos,
main = "Residuos vs Valores Ajustados",
xlab = "Valores Ajustados",
ylab = "Residuos",
pch = 19)
abline(h = 0, col = "red", lwd = 2)
En el gráfico de residuos versus valores ajustados, se observa que los
residuos se distribuyen de manera aleatoria alrededor de la línea
horizontal en cero, sin presentar un patrón definido ni forma de embudo.
Esto sugiere que la varianza de los errores es constante a lo largo de
las observaciones.
library(lmtest)
## Cargando paquete requerido: zoo
##
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
dwtest(modelo_estimado, alternative = "two.sided")
##
## Durbin-Watson test
##
## data: modelo_estimado
## DW = 1.2996, p-value = 0.05074
## alternative hypothesis: true autocorrelation is not 0
library(lmtest)
bgtest(modelo_estimado, order = 2)
##
## Breusch-Godfrey test for serial correlation of order up to 2
##
## data: modelo_estimado
## LM test = 3.8409, df = 2, p-value = 0.1465
La prueba de Breusch-Godfrey arroja un estadístico LM de 3.8409 con 2 grados de libertad y un p-value de 0.1465. Dado que el p-value es mayor que 0.05, no se rechaza la hipótesis nula de ausencia de autocorrelación
Por lo tanto, se concluye que no existe evidencia de autocorrelación de primer ni de segundo orden en los residuos del modelo estimado.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
library(forecast)
ggAcf(residuals(modelo_estimado)) +
ggtitle("Función de Autocorrelación (ACF)") +
theme_minimal()
### PACF (Autocorrelación Parcial)
ggPacf(residuals(modelo_estimado)) +
ggtitle("Función de Autocorrelación Parcial (PACF)") +
theme_minimal()
Tanto los gráficos ACF como PACF muestran que los rezagos 1 y 2 se
encuentran dentro de los intervalos de confianza, indicando ausencia de
autocorrelación. Estos resultados son consistentes con la prueba de
Breusch-Godfrey, donde no se encontró evidencia de autocorrelación de
primer ni segundo orden.
En general, El modelo de regresión estimado cumple con la mayoría de los supuestos clásicos. Los residuos presentan distribución normal, no existe evidencia de heterocedasticidad ni autocorrelación. Sin embargo, se detecta la presencia de multicolinealidad entre algunos regresores, lo que podría afectar la precisión de los estimadores. En general, el modelo resulta adecuado para explicar el comportamiento de la variable dependiente.