En esta sección se muestra las librerías a utilizar y funciones que se requieren para realizar las simulaciones
library(Matrix)
library(stats)
library(broom)
library(dplyr)
library(ggfortify)
library(MASS)
library(EnvStats)
library(lmtest)
library(DescTools)
library(gvlma)
library(psych)
library(knitr)
library(Metrics)
Se procede a generar una función R que cumple los supuestos del modelo de regresión lineal:
\[E^{\theta}(y_{i}|z_{i}) = EL^{\theta}(y_{i}|z_{i})= \beta^{\prime}z_{i}= \displaystyle\sum_{j=1}^{q}\beta _{j}z_{ij} \]
# Proceso Generador de datos
f_ProcesoGeneradorDatos = function(pN,pB0,pB1,pB2,pB3,pSigma){
psd = rep(pSigma,pN)
Z0 = rep(1,pN)
Z1 = runif(pN,20,80)
Z2 = rexp(pN,0.01)
Z3 = rnorm(pN,mean=40,sd=5)
Y = rnorm(pN,mean = (pB0 + pB1*Z1 + pB2*Z2 + pB3*Z3),sd= psd)
M = as.matrix(cbind (Y,Z0,Z1,Z2,Z3))
return(M)
}
Esto nos permite simular datos como por ejemplo: E(Y/Z)~ N(10Z0 + 0.3Z1 + 0.4Z2 - 1.2Z3, 8)
Parámetros :
B0 = 10
B1 = 0.3
B2 = 0.4
B3 = 1.2
Sigma = 8
Mostramos las primeras 20 observaciones generadas por la función:
M = f_ProcesoGeneradorDatos(20,B0,B1,B2,B3,Sigma)
M
## Y Z0 Z1 Z2 Z3
## [1,] 58.61575 1 53.37349 9.048203 36.34459
## [2,] 123.50782 1 20.99971 134.921563 44.24281
## [3,] 162.10263 1 38.21572 219.637337 37.65139
## [4,] 99.36736 1 36.88638 102.085008 43.74056
## [5,] 104.00104 1 41.81047 25.357506 46.17104
## [6,] 98.97224 1 48.01159 29.248950 53.74811
## [7,] 107.33137 1 78.06965 80.426349 35.07459
## [8,] 74.72967 1 31.46951 23.631980 41.83440
## [9,] 131.78014 1 27.11963 150.972006 40.69657
## [10,] 164.51520 1 71.30100 157.845088 45.78310
## [11,] 80.46052 1 75.75088 1.113151 34.89797
## [12,] 112.30219 1 50.24977 99.328566 37.24104
## [13,] 98.66661 1 53.29017 20.422773 46.02805
## [14,] 93.36489 1 50.99708 71.492748 32.47757
## [15,] 150.16766 1 58.89884 153.107629 41.30495
## [16,] 132.15959 1 26.60537 188.338647 39.56592
## [17,] 209.73811 1 42.67583 294.258413 49.38902
## [18,] 56.14117 1 39.03198 22.531373 37.36127
## [19,] 96.85721 1 25.09469 108.079396 37.13552
## [20,] 71.87900 1 27.33701 7.499001 36.98669
Mostramos un gráfico para observar la distribución de las variables
multi.hist(x = M[,-2])
También creamos una segunda función que no cumple los supuestos de un modelo de regresión lineal:
# Proceso Generador de datos: No cumple
f_ProcesoGeneradorDatos2 = function(pN,pB0,pB1,pB2,pB3,pSigma){
psd = seq(0, 10, length.out = pN) + pSigma
Z0 = rep(1,pN)
Z1 = runif(pN,20,80)
# Correlación
Z2 = rexp(pN,0.01) + Z1
Z3 = rnorm(pN,mean=40,sd=5)
# No normalidad
Y = pB0 + sqrt(pB1)*Z1 + (pB2^2)*Z2 + pB3*Z3 + rexp(pN, psd/1000)
M = as.matrix(cbind (Y,Z0,Z1,Z2,Z3))
return(M)
}
Esta función genera datos que no cumplen con los supuestos de un modelo de regresión lineal
M = f_ProcesoGeneradorDatos2(20,B0,B1,B2,B3,Sigma)
M
## Y Z0 Z1 Z2 Z3
## [1,] 245.43147 1 46.47229 222.14955 37.08346
## [2,] 170.49893 1 42.62876 491.46441 41.25707
## [3,] 143.82893 1 28.92184 34.46972 40.37954
## [4,] 142.99672 1 22.41173 30.31685 40.20813
## [5,] 305.62195 1 43.31085 60.64287 29.97321
## [6,] 160.80544 1 66.61025 390.24539 40.99429
## [7,] 153.54871 1 74.80918 93.10748 50.02064
## [8,] 369.36865 1 31.23908 207.73259 41.62709
## [9,] 115.90900 1 44.49722 60.29334 43.03583
## [10,] 175.02683 1 20.81276 230.10312 41.61067
## [11,] 158.39839 1 28.50718 30.15324 45.33033
## [12,] 208.75399 1 64.87750 75.91679 44.75717
## [13,] 134.96707 1 20.03465 170.94656 41.89297
## [14,] 104.02692 1 47.79180 98.60955 37.31221
## [15,] 92.75251 1 50.88560 89.89255 33.18095
## [16,] 167.65504 1 50.66531 187.76888 29.49964
## [17,] 158.10667 1 44.11114 346.02237 46.75996
## [18,] 137.49537 1 59.48950 87.94536 38.18702
## [19,] 129.62073 1 64.71303 178.18444 42.01113
## [20,] 174.15530 1 54.32674 199.42512 47.26528
multi.hist(x = M[,-2])
Esta función estima los parámetros: \(\beta_{0},\phantom{a}\beta_{1} ,\phantom{a}\beta_{2},\phantom{a} \beta_{3}\phantom{a} y \phantom{a}\sigma\)
f_RegresionLineal= function(pM){
Y = pM[,1]
Z = pM[,2:5]
N = nrow(Z)
k = ncol(Z)
B_hat = solve(t(Z)%*%Z)%*%(t(Z)%*%Y)
Y_hat = Z%*%B_hat
e_hat = Y - Y_hat
SCR = t(e_hat)%*%e_hat
sCT = t(Y)%*%Y- N*(mean(Y)^2)
sigma_mco = sqrt(SCR/(N - k))
sigma_mv = sqrt(SCR/(N))
xBO = B_hat[1,1]
xB1 = B_hat[2,1]
xB2 = B_hat[3,1]
xB3 = B_hat[4,1]
xs_mco = sigma_mco
xs_mv = sigma_mv
XR2 = 1 - SCR/sCT
B = data.frame( BO = xBO , B1 = xB1 ,B2 = xB2 ,B3 = xB3 , S_MCO = xs_mco, S_MV = xs_mv ,R2 = XR2,row.names = NULL )
return(B)
}
Con ellos podemos estimar los parámetros del modelo dado los parámetros poblacionales
B0 = 10
B1 = 0.3
B2 = 0.4
B3 = 1.2
Sigma = 8
M = f_ProcesoGeneradorDatos(200,B0,B1,B2,B3,Sigma)
P = f_RegresionLineal(M)
P
Para simular la validación de los supuestos, generamos 100 observaciones que cumplen con 4 supuestos de un modelo lineal
B0 = 10
B1 = 0.3
B2 = 0.4
B3 = 1.2
Sigma = 8
M = f_ProcesoGeneradorDatos(200,B0,B1,B2,B3,Sigma)
mrl = lm(Y~Z1+Z2+Z3,data = as.data.frame(M))
coefficients(mrl)
## (Intercept) Z1 Z2 Z3
## 11.0620101 0.3701391 0.4055110 1.0771049
Para validar los supuestos es importante analizar los residuos que se generan, es decir, la diferencia entre la valor real de la variable respuesta y el valor estimado de la misma:
\[u_{i} = \widehat{y_{i}} - y_{i}\]
residuos = residuals(mrl)
head(residuals(mrl), 10)
## 1 2 3 4 5 6 7
## -0.9961438 -2.4953599 3.8917899 8.3467562 -5.5513838 -0.9301819 -2.1572065
## 8 9 10
## -0.1383001 -2.7033042 0.5462970
El primers supuesto es el que corresponde a la linealidad del modelo:
\[E^{\theta}(y_{i}|z_{i}) = EL^{\theta}(y_{i}|z_{i})= \beta^{\prime}z_{i}= \displaystyle\sum_{j=1}^{q}\beta _{j}z_{ij} \]
Se deduce que este supuesto puede ser verificado si la media de los residuos es 0
\[E^{\theta}(u_{i}|z_{i}) = 0\]
mean(residuos)
## [1] -2.489849e-16
plot(residuos) + abline (h = 0, col = 'red', lwd = 2)
## integer(0)
autoplot(mrl,1)
Se cumple el supuesto A1
El segundo supuesto indica que la matriz de datos \(Z\) debe tener rango completo:
\[Rango(Z) = q \;\;(n > q)\]
O equivalentemente :
\[Rango(Z'Z)=q,; det(Z'Z)\neq 0 ; Z'Z\phantom{a}invertible\]
Z = M[,2:5]
rankMatrix(Z)[1]
## [1] 4
det(t(Z)%*%Z)
## [1] 7.530774e+16
solve(t(Z)%*%Z)
## Z0 Z1 Z2 Z3
## Z0 4.420461e-01 -9.254413e-04 -8.151921e-05 -9.569006e-03
## Z1 -9.254413e-04 1.799860e-05 1.313269e-07 7.670032e-07
## Z2 -8.151921e-05 1.313269e-07 6.264550e-07 4.665214e-07
## Z3 -9.569006e-03 7.670032e-07 4.665214e-07 2.362716e-04
Se cumple el supuesto A2
El tercer supuesto indica la homocedasticidad de la variable respuesta \(y_{i}\) condicionada a los valores de \(z_{i}\) debe ser constante
\[Var^{\theta}(y_{i}|z_{i})=\sigma^{2}\phantom{abc}para\phantom{a}todo\phantom{abc}i=1,\ldots,n.\]
Este supuesto se puede verificar si se cumplen estas dos condiciones:
# A3.1 Homocedasticidad de los residuos Var(ui) = cte
# studentized Breusch-Pagan test
#Ho : los residuos tienen varianza constante.
#H1 : los residuos no tienen varianza constante.
#p-valor es mayor de 0.05, no se rechaza HO
bptest(mrl)
##
## studentized Breusch-Pagan test
##
## data: mrl
## BP = 0.61881, df = 3, p-value = 0.8921
autoplot(mrl,3)
Se verifica que los residuos son homocedásticos
# A3.1 Autorrelacion entre los residuos : Cov(ui,uj) = 0
#Ho : Los residuos no estan autocorrelacionados
#Ha: Los residuos están autocorrelacionados
#p-valor es mayor de 0.05, no se rechaza HO
DurbinWatsonTest(mrl)
##
## Durbin-Watson test
##
## data: mrl
## DW = 2.0568, p-value = 0.6546
## alternative hypothesis: true autocorrelation is greater than 0
# Todos los barras se encuetra entre de las bandas
acf(residuos )
Se verifica que los residuos no se encuentran correlacionados
Este supuesto corresponde a normalidad condicionada de la variable de respuesta
\[ y_{i}|z_{i} \sim i.i.N(\beta^{\prime}z_{i},\sigma^{2}) \]
Este supuesto es equivalente a la normalidad de los residuos:
\[ u_{i}|z_{i} \sim i.i.N(0,\sigma^{2}) \]
#Kolmogorov-Smirnov test
#H0: los residuos proceden de una distribución normal
#H1: los residuos no proceden de una distribución normal
#p-valor es mayor de 0.05, no se rechaza HO
ks.test(residuals(mrl),pnorm (0,Sigma))
##
## Exact two-sample Kolmogorov-Smirnov test
##
## data: residuals(mrl) and pnorm(0, Sigma)
## D = 0.52, p-value = 0.9652
## alternative hypothesis: two-sided
# Graficos
hist( residuos)
qqPlot(residuos)
autoplot(mrl,2)
Se verfica que los residuos tienen uan distribucion normal como media 0 y varianza constante
Podemos resumir la verificación de los supuetsos A1, A2, A3 y A4 en el siguiente gráfico:
# Graficos para verificar los principales supuestos
#plot(gvlma(mrl))
En esta sección se verifican algunas propiedades de los estimadores
# P1 CONSISTENCIA plim(B2_hat) = B2
N = 10000
M = f_ProcesoGeneradorDatos(N,B0,B1,B2,B3,Sigma)
R = data.frame()
for(i in seq(10, N, by = 1)){
P = cbind(f_RegresionLineal(M[1:i,]),"N"=i)
R = rbind(R,P)
}
ggplot(data=R, aes(x=N, y=B2)) +
geom_line(color="blue") + geom_hline(yintercept = B2, color = "red")
# P2 INSESGADEZ E(B2_hat) = B2, aplicamos TCL
N = 50
n = 1000
R = data.frame()
for(i in seq(1, n, by = 1)){
M = f_ProcesoGeneradorDatos(N,B0,B1,B2,B3,Sigma)
P = cbind(f_RegresionLineal(M),"N"= N)
R = rbind(R,P)
}
hist(R$B2,freq = FALSE,breaks =100, xlab = sprintf("B= %f y B_hat = %f",B2,mean(R$B2)))
lines(density(R$B2), lwd = 2, col = 'red')
abline(v = mean(R$B2) ,lwd = 2, col = 'blue')
N = 50
n = 1000
R = data.frame()
for(i in seq(1, n, by = 1)){
M = f_ProcesoGeneradorDatos(N,B0,B1,B2,B3,Sigma)
P = cbind(f_RegresionLineal(M),"N"= N)
R = rbind(R,P)
}
hist(R$S_MCO,freq = FALSE,breaks =100, xlab = sprintf("Sigma= %f y S_MCO = %f",Sigma,mean(R$S_MCO)))
abline(v = Sigma ,lwd = 2, col = 'blue')
abline(v = mean(R$S_MCO) ,lwd = 2, col = 'green')
hist(R$S_MV,freq = FALSE,breaks =100, xlab = sprintf("Sigma= %f y S_MV = %f",Sigma,mean(R$S_MV)))
abline(v = Sigma ,lwd = 2, col = 'blue')
abline(v = mean(R$S_MV) ,lwd = 2, col = 'green')
En esta sección se hace uso de las propiedades asintóticas de los estimadores
B0 = 10
B1 = 0.3
B2 = 0.4
B3 = 1.2
Sigma = 8
# Datos de la muestra (entrenamiento)
M1 = f_ProcesoGeneradorDatos(70,B0,B1,B2,B3,Sigma)
# Datos fuera de la muestra (test)
M2 = f_ProcesoGeneradorDatos(30,B0,B1,B2,B3,Sigma)
# Regresion Lineal
mrl = lm(Y~Z1+Z2+Z3,data = as.data.frame(M1))
summary(mrl)
##
## Call:
## lm(formula = Y ~ Z1 + Z2 + Z3, data = as.data.frame(M1))
##
## Residuals:
## Min 1Q Median 3Q Max
## -13.314 -5.878 1.275 4.969 13.676
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.671455 7.259393 0.368 0.714
## Z1 0.265144 0.051815 5.117 2.89e-06 ***
## Z2 0.395661 0.006466 61.192 < 2e-16 ***
## Z3 1.419173 0.186131 7.625 1.24e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6.944 on 66 degrees of freedom
## Multiple R-squared: 0.9849, Adjusted R-squared: 0.9842
## F-statistic: 1433 on 3 and 66 DF, p-value: < 2.2e-16
confint(mrl)
## 2.5 % 97.5 %
## (Intercept) -11.8223914 17.1653004
## Z1 0.1616919 0.3685966
## Z2 0.3827515 0.4085705
## Z3 1.0475515 1.7907953
Las predicción dentro y fuera de la muestra
# Prediccion dentro de la muestra
F = fitted(mrl,interval)
M1 = cbind(M1, Y_hat = F )
head(M1, n = 10)
## Y Z0 Z1 Z2 Z3 Y_hat
## 1 86.63781 1 55.19162 15.60118 38.82631 78.57923
## 2 213.91993 1 45.56357 368.62192 34.45080 209.49335
## 3 101.20189 1 58.86051 46.29636 47.45368 103.94065
## 4 133.85926 1 51.70315 180.58724 39.33129 143.64950
## 5 110.81754 1 72.64153 85.74488 40.16805 112.86328
## 6 85.17545 1 25.73945 28.30841 41.56195 79.68028
## 7 109.82021 1 51.32938 140.09526 32.66965 118.07528
## 8 79.43354 1 56.53064 25.90246 38.87194 83.07484
## 9 103.26120 1 41.68332 83.75998 39.83708 103.39983
## 10 69.50813 1 75.41742 26.45760 33.30779 80.40572
# Prediccion fuera de la muestra
P = predict(mrl, as.data.frame(M2[,3:5]),interval = 'confidence')
M2 = cbind(M2, P )
head(M2, n = 10)
## Y Z0 Z1 Z2 Z3 fit lwr upr
## 1 110.17360 1 54.62586 35.720166 39.55591 87.42497 85.40005 89.44988
## 2 74.71601 1 65.29735 21.567264 40.16439 85.51823 82.88170 88.15475
## 3 98.69709 1 69.90459 66.318432 43.92076 109.77705 106.87840 112.67571
## 4 140.00625 1 50.48341 145.274998 45.15306 137.61651 134.97526 140.25777
## 5 127.26910 1 72.09972 75.541622 49.26971 121.59942 117.45492 125.74391
## 6 77.44540 1 48.68116 41.404326 38.76597 86.97670 85.04608 88.90732
## 7 65.54845 1 35.19314 5.034263 47.16891 80.93544 76.84153 85.02936
## 8 181.20495 1 76.45148 259.013611 41.05208 183.68373 180.46440 186.90307
## 9 197.45009 1 56.92082 312.241382 43.29901 202.75422 199.59932 205.90913
## 10 119.56210 1 44.62702 134.711311 39.02293 123.18437 121.34925 125.01948
Se comparan ambas prediciones utilizando el indicador:
\[rmse = \sqrt{\frac{\sum_{i=i}^{N}(\widehat{y_{i}} - y_{i})^2}{N}}\]
rmse(M1[,1],M1[,6])
## [1] 6.742762
rmse(M2[,1],M2[,6])
## [1] 9.071189
Comportamiento del \(R_{2}\) :
# CONSISTENCIA R2
N = 10000
M = f_ProcesoGeneradorDatos(N,B0,B1,B2,B3,Sigma)
R = data.frame()
for(i in seq(10, N, by = 1)){
P = cbind(f_RegresionLineal(M[1:i,]),"N"=i)
R = rbind(R,P)
}
ggplot(data=R, aes(x=N, y=R2)) +
geom_line(color="blue") + geom_hline(yintercept = 1, color = "red")
Se observa que los parámetros estimados no corresponden a los poblacionales, no se cumplen las propiedad asintóticas y las predicciones dentro y fuera de la muestra no se corresponden con los datos observados.
B0 = 10
B1 = 0.3
B2 = 0.4
B3 = 1.2
Sigma = 8
# Datos de la muestra (entrenamiento)
M3 = f_ProcesoGeneradorDatos2(70,B0,B1,B2,B3,Sigma)
# Datos fuera de la muestra (test)
M4 = f_ProcesoGeneradorDatos2(30,B0,B1,B2,B3,Sigma)
# Regresion Lineal
mrl = lm(Y~Z1+Z2+Z3,data = as.data.frame(M3))
summary(mrl)
##
## Call:
## lm(formula = Y ~ Z1 + Z2 + Z3, data = as.data.frame(M3))
##
## Residuals:
## Min 1Q Median 3Q Max
## -94.20 -49.82 -22.92 16.63 382.69
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 77.82604 96.04657 0.810 0.42068
## Z1 0.41922 0.58372 0.718 0.47517
## Z2 0.28111 0.08277 3.396 0.00116 **
## Z3 1.27170 2.12055 0.600 0.55076
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 85.06 on 66 degrees of freedom
## Multiple R-squared: 0.1725, Adjusted R-squared: 0.1349
## F-statistic: 4.585 on 3 and 66 DF, p-value: 0.005619
confint(mrl)
## 2.5 % 97.5 %
## (Intercept) -113.9371128 269.5892027
## Z1 -0.7462179 1.5846674
## Z2 0.1158486 0.4463655
## Z3 -2.9621182 5.5055260
# Prediccion dentro de la muestra
F = fitted(mrl,interval)
M3 = cbind(M3, Y_hat = F )
# Prediccion fuera de la muestra
P = predict(mrl, as.data.frame(M4[,3:5]),interval = 'confidence')
M4= cbind(M4, P )
rmse(M3[,1],M3[,6])
## [1] 82.59298
rmse(M4[,1],M4[,6])
## [1] 94.77064
Comportamiento del \(R_{2}\) :
# CONSISTENCIA R2
N = 10000
M = f_ProcesoGeneradorDatos2(N,B0,B1,B2,B3,Sigma)
R = data.frame()
for(i in seq(10, N, by = 1)){
P = cbind(f_RegresionLineal(M[1:i,]),"N"=i)
R = rbind(R,P)
}
ggplot(data=R, aes(x=N, y=R2)) +
geom_line(color="blue") + geom_hline(yintercept = 1, color = "red")