Curso: Modelos Lineales II
Alumno : Alvaro Cesar Tauma Salvador (20181160)
Ejercicio1
Se tiene información de la producción minera del Perú para cinco productos en el periodo de 2001 -2018.
Datos en archivo MLG_PT_Semana_ 05 _ 01 csv
1. Formule el MLG en términos del estudio
2. Ajuste los datos de la producción minera a una regresión lineal múltiple Realice al análisis de la multicolinealidad
3.Ajuste los datos de la producción minera a una regresión lineal múltiple Ridge Use la estimación sesgada por mínimos cuadrados
4.Realice la comparación de ambos estimaciones
Variable respuesta: Y= Producción total minera (TM)
Variables predictoras:
X1=Producción cobre (TM)
X2=Producción zinc (TM)
X3=Producción oro (Krgs.)
X4=Producción plata (Krgs.)
X5=Producción plomo (TM)
a .Componente aleatorio:
$Yi∼N(μi,σ^2),E(Y)=μ $
b .Componente sistematico (Predictor Lineal)
\(ni=X'β=β0+β1X1+β2X2+β3X3+β4X4+β5X5\)
c .Funcion de enlace : Distribución:Normal , Función Lineal: identidad
\(E(Y)=g(μ)=1(μi)=ηi=X'β = β0+β1X1+β2X2+β3X3+β4X4+β5X5\)
\(E(Y)=X'β\)
d .Modelo de Regresion Lineal Multiple
\(Y=β0+β1X1+β2X2+β3X3+β4X4+β5X5\)
#Entrada de datos
Datos <- read.csv("MLII_PT_Clase_04_Datos_01.csv",sep = ";")
head(Datos)
## X1_Cobre X2_Zinc X3_Oro X4_Plata X5_Plomo Y_Total
## 1 345620 493408 160 44815 187248 4798673
## 2 331407 479285 206 42553 201191 5014445
## 3 363688 543590 142 46904 213448 4953285
## 4 328020 581753 177 55921 223727 4051263
## 5 370004 548705 197 58973 208485 4863254
## 6 401327 612903 224 64647 240950 4694722
X = model.matrix (Y_Total~ . , Datos) [, -1 ] # separar la ultima columna
head(X)
## X1_Cobre X2_Zinc X3_Oro X4_Plata X5_Plomo
## 1 345620 493408 160 44815 187248
## 2 331407 479285 206 42553 201191
## 3 363688 543590 142 46904 213448
## 4 328020 581753 177 55921 223727
## 5 370004 548705 197 58973 208485
## 6 401327 612903 224 64647 240950
y = Datos$Y_Total
# Ajuste a la regresión lineal múltiple (mínimos cuadrados)
Modelo=lm(Y_Total~ X1_Cobre+X2_Zinc+X3_Oro+X4_Plata+X5_Plomo, Datos)
summary(Modelo) #obtenemos los coef. estimados
##
## Call:
## lm(formula = Y_Total ~ X1_Cobre + X2_Zinc + X3_Oro + X4_Plata +
## X5_Plomo, data = Datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1292889 -422945 75776 459001 1628524
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.812e+06 9.702e+05 4.959 2.08e-05 ***
## X1_Cobre 3.712e+00 7.337e-01 5.059 1.55e-05 ***
## X2_Zinc 1.729e+00 1.230e+00 1.406 0.1692
## X3_Oro -5.132e+00 9.590e+00 -0.535 0.5961
## X4_Plata 1.444e+00 6.365e-01 2.268 0.0300 *
## X5_Plomo -1.330e+01 5.597e+00 -2.377 0.0234 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 702200 on 33 degrees of freedom
## Multiple R-squared: 0.9789, Adjusted R-squared: 0.9757
## F-statistic: 306.8 on 5 and 33 DF, p-value: < 2.2e-16
# Análisis de la multicolinealidad
n=dim(X)[1]
n # cantidad de observaciones
## [1] 39
p=dim(X)[2]
p # cantidad de variables predictoras
## [1] 5
# Examinar matriz de correlaciones
cor(X) #vemos que as correlaciones son altas
## X1_Cobre X2_Zinc X3_Oro X4_Plata X5_Plomo
## X1_Cobre 1.0000000 0.8444156 0.7438040 0.8840808 0.6775012
## X2_Zinc 0.8444156 1.0000000 0.9199822 0.9505124 0.8684625
## X3_Oro 0.7438040 0.9199822 1.0000000 0.9609244 0.8229567
## X4_Plata 0.8840808 0.9505124 0.9609244 1.0000000 0.7987709
## X5_Plomo 0.6775012 0.8684625 0.8229567 0.7987709 1.0000000
Interpretación
Se puede observar que existe una alta correlación significativa entre las variables predictoras Se puede concluir, que existe una multicolinealidad en el modelo de regresión .
#Factores de inflación de variancia (VIF)
1/(1-summary(lm(X1_Cobre~X2_Zinc+X3_Oro+X4_Plata+X5_Plomo,Datos))$ r.squared)
## [1] 15.30551
1/(1-summary(lm(X2_Zinc ~X1_Cobre+X3_Oro+X4_Plata+X5_Plomo,Datos))$ r.squared)
## [1] 16.13134
1/(1-summary(lm(X3_Oro~X1_Cobre+X2_Zinc+X4_Plata+X5_Plomo,Datos))$ r.squared)
## [1] 49.12713
1/(1-summary(lm(X4_Plata~X1_Cobre+X2_Zinc+X3_Oro+X5_Plomo,Datos))$ r.squared)
## [1] 100.0795
1/(1-summary(lm(X5_Plomo~X1_Cobre+X2_Zinc+X3_Oro+X4_Plata,Datos))$ r.squared)
## [1] 5.195703
library(faraway)
vif(Modelo)
## X1_Cobre X2_Zinc X3_Oro X4_Plata X5_Plomo
## 15.305512 16.131344 49.127134 100.079505 5.195703
si el vif > 10 => hay multicolinealidad, la mayoria supera el calor de 10, por lo tanto podemos decir que hay una multicolinalidad alta ntra las v.v predictoras.
Interpretación
El análisis de los factores de inflación de variancia, resultan que los cuatro primeros superan el valor de 10 y sólo el quinto es menor a 10 Se puede concluir, que existe una alta multicolinealidad entre las variable predictoras
# Examinar valores propios
XX=t(X)%*%X
Lambda=eigen(XX)$values; Lambda
## [1] 3.157506e+14 9.414956e+12 2.410785e+12 3.716266e+10 5.406394e+09
# Calcular el índice k
k=max(Lambda)/min(Lambda); k
## [1] 58403.17
#si k>1000 entonces exites multicolinealidad
Lambda
## [1] 3.157506e+14 9.414956e+12 2.410785e+12 3.716266e+10 5.406394e+09
# Calcular el índice k por predictor
for (i in 1:p) {cat("kj: ",i, " = ", max(Lambda)/Lambda[i],"\n") }
## kj: 1 = 1
## kj: 2 = 33.53713
## kj: 3 = 130.9742
## kj: 4 = 8496.448
## kj: 5 = 58403.17
Interpretación
El análisis de los valores propios de la matriz (resultaron con valores altos Se tiene un valor del índice k superior a 1000 lo que indica una severa multicolinealidad Los índices k para cada predictor resultaron los dos últimos mayores a 1000 lo que indica una moderada multicolinealidad.
library(glmnet)
## Loading required package: Matrix
## Loaded glmnet 4.1-7
##### Ajuste a la regresi?n Ridge ####
Modelo_R=glmnet(X, y, alpha=0) #alpha=0 Ridge ; alpha=1 LAsso .................
plot(Modelo_R, xvar="lambda", label=TRUE)
#muestra como al aumenar lambda, los coef de reg tienden a cero
# Estimaciones Ridge para varios valores de lambda
M1<-glmnet(X,y,alpha=0,lambda=0.9)
M2<-glmnet(X,y,alpha=0,lambda=10)
M3<-glmnet(X,y,alpha=0,lambda=100)
M4<-glmnet(X,y,alpha=0,lambda=1000)
M5<-glmnet(X,y,alpha=0,lambda=10000)
cbind(coef(M1),coef(M2),coef(M3),coef(M4),coef(M5))
## 6 x 5 sparse Matrix of class "dgCMatrix"
## s0 s0 s0 s0
## (Intercept) 4.829986e+06 4.829961e+06 4.829943e+06 4.829031e+06
## X1_Cobre 3.772705e+00 3.772835e+00 3.774899e+00 3.792681e+00
## X2_Zinc 1.761267e+00 1.761359e+00 1.762684e+00 1.774369e+00
## X3_Oro -4.212231e+00 -4.210142e+00 -4.177659e+00 -3.895680e+00
## X4_Plata 1.383774e+00 1.383628e+00 1.381410e+00 1.362060e+00
## X5_Plomo -1.357937e+01 -1.357970e+01 -1.358658e+01 -1.364286e+01
## s0
## (Intercept) 4.813067e+06
## X1_Cobre 3.917936e+00
## X2_Zinc 1.860630e+00
## X3_Oro -1.826502e+00
## X4_Plata 1.220047e+00
## X5_Plomo -1.400434e+01
# Nos muestra que a medida que aumenta el lambda los estimadores salen mas pequeños.
# Seleccionando el mejor lambda (óptimo)
set.seed(1230)
# Usando la validaci?n cruzada
cv.Ridge=cv.glmnet(X, y, alpha=0, nfolds=10, type.measure="mse")
#nfolds para indicar la separación, type.measure "el tipo de medida "
plot(cv.Ridge)
cv.Ridge$lambda.min# Lambda que consigue el mínimo test-error
## [1] 429069.1
# Lambda optimo para el test-error
cv.Ridge$lambda.1se
## [1] 622505.8
# Estimaci?n de coeficientes para el lambda óptimo
Modelo_R_Final=glmnet(X, y, alpha=0, lambda= cv.Ridge$lambda.1se) # aqui esta usando el lambda optimo sacado de
coef(Modelo_R_Final)
## 6 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) 3.278525e+06
## X1_Cobre 3.463234e+00
## X2_Zinc 2.179510e+00
## X3_Oro 5.694463e+00
## X4_Plata 7.077771e-01
## X5_Plomo -6.613563e+00
options(scipen=999)
coef(Modelo_R_Final)
## 6 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) 3278525.3177302
## X1_Cobre 3.4632342
## X2_Zinc 2.1795101
## X3_Oro 5.6944632
## X4_Plata 0.7077771
## X5_Plomo -6.6135626
MODELO ESTIMADO POR REGRESION RIDGE : \[ \hat{y_{i}}= 3278525+ 3.463234*X_{1i}+2.179510*X_{2i}+ 5.694463*X_{3i}+0.7077771*X_{4i}-6.613563*X_{5i}\]
coef(Modelo_R_Final)
## 6 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) 3278525.3177302
## X1_Cobre 3.4632342
## X2_Zinc 2.1795101
## X3_Oro 5.6944632
## X4_Plata 0.7077771
## X5_Plomo -6.6135626
coef(Modelo)
## (Intercept) X1_Cobre X2_Zinc X3_Oro X4_Plata
## 4811788.685430 3.712085 1.728900 -5.132357 1.443709
## X5_Plomo
## -13.304929
Modelo_R_Final
##
## Call: glmnet(x = X, y = y, alpha = 0, lambda = cv.Ridge$lambda.1se)
##
## Df %Dev Lambda
## 1 5 96.85 622500
1 - cv.Ridge$cvm/var(y)
## [1] -0.0189896994 -0.0122603384 -0.0099618985 -0.0090251632 -0.0079987987
## [6] -0.0068744097 -0.0056428509 -0.0042941674 -0.0028175323 -0.0012011807
## [11] 0.0005676586 0.0025028340 0.0046193436 0.0069334118 0.0094625885
## [16] 0.0122257107 0.0152431156 0.0185366424 0.0221296845 0.0260472464
## [21] 0.0303159793 0.0349642002 0.0400218901 0.0455206654 0.0514937181
## [26] 0.0579757166 0.0650026625 0.0726116925 0.0808408207 0.0897286104
## [31] 0.0993137690 0.1096346565 0.1207287029 0.1326317278 0.1453771592
## [36] 0.1589951538 0.1735116217 0.1889471661 0.2053159547 0.2226245518
## [41] 0.2408707286 0.2600423945 0.2801162110 0.3010570127 0.3228168371
## [46] 0.3453344619 0.3685352181 0.3923311816 0.4166217932 0.4412949389
## [51] 0.4662285031 0.4912923835 0.5163509245 0.5412657001 0.5658985487
## [56] 0.5901147370 0.6137861173 0.6367941320 0.6590325228 0.6804096167
## [61] 0.7008500801 0.7202973149 0.7387243017 0.7560873460 0.7723840448
## [66] 0.7876286425 0.8018452199 0.8150697592 0.8273478823 0.8387324808
## [71] 0.8492813472 0.8590549081 0.8681141471 0.8765204434 0.8843278787
## [76] 0.8915817575 0.8983413670 0.9046490302 0.9105427254 0.9160553176
## [81] 0.9212145874 0.9260417176 0.9305554455 0.9347734494 0.9387098932
## [86] 0.9423774184 0.9457822503 0.9489342486 0.9518429986 0.9545076373
## [91] 0.9569449961 0.9591642196 0.9611728013 0.9629811745 0.9646007380
## [96] 0.9660423877 0.9673188030 0.9684419230 0.9694230422 0.9702008339
Ejercicio 2
Se tiene información de la producción minera del Perú para cinco productos en el periodo de 2001 2018 Datos en archivo MLG_PT_Semana_ 05 _ 01 csv.
1.Ajuste los datos de la producción minera a una regresión lineal múltiple Aplique los métodos de selección de variables
2. Ajuste los datos de la producción minera a una regresión lineal múltiple Lasso Encuentre el modelo óptimo de regresión Lasso que se ajuste a la producción minera
3. Realice la comparación de los modelos estimados
Datos<-read.table("MLII_PT_Clase_04_Datos_01.csv",header=TRUE,sep=";")
head(Datos)
## X1_Cobre X2_Zinc X3_Oro X4_Plata X5_Plomo Y_Total
## 1 345620 493408 160 44815 187248 4798673
## 2 331407 479285 206 42553 201191 5014445
## 3 363688 543590 142 46904 213448 4953285
## 4 328020 581753 177 55921 223727 4051263
## 5 370004 548705 197 58973 208485 4863254
## 6 401327 612903 224 64647 240950 4694722
str(Datos)
## 'data.frame': 39 obs. of 6 variables:
## $ X1_Cobre: int 345620 331407 363688 328020 370004 401327 399302 406325 316355 368168 ...
## $ X2_Zinc : int 493408 479285 543590 581753 548705 612903 604018 619209 498583 620956 ...
## $ X3_Oro : int 160 206 142 177 197 224 299 287 313 318 ...
## $ X4_Plata: int 44815 42553 46904 55921 58973 64647 64492 64334 53065 62120 ...
## $ X5_Plomo: int 187248 201191 213448 223727 208485 240950 201873 203960 161182 203034 ...
## $ Y_Total : int 4798673 5014445 4953285 4051263 4863254 4694722 4698445 4609905 3831735 4172608 ...
# Ajuste a la regresión lineal múltiple (mínimos cuadrados)
Modelo=lm(Y_Total~ ., Datos)
summary(Modelo)
##
## Call:
## lm(formula = Y_Total ~ ., data = Datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1292889 -422945 75776 459001 1628524
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4811788.6854 970232.0055 4.959 0.0000208 ***
## X1_Cobre 3.7121 0.7337 5.059 0.0000155 ***
## X2_Zinc 1.7289 1.2300 1.406 0.1692
## X3_Oro -5.1324 9.5899 -0.535 0.5961
## X4_Plata 1.4437 0.6365 2.268 0.0300 *
## X5_Plomo -13.3049 5.5974 -2.377 0.0234 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 702200 on 33 degrees of freedom
## Multiple R-squared: 0.9789, Adjusted R-squared: 0.9757
## F-statistic: 306.8 on 5 and 33 DF, p-value: < 0.00000000000000022
R2=summary(Modelo)$r.squared; R2
## [1] 0.9789392
library(leaps)
# Selección de variables: Medidas de bondad de ajuste
Modelo_S<-regsubsets(Y_Total~., data=Datos, nvmax=5) #numero máximo de variables que puedes incorporar en el modelo
names(summary(Modelo_S))# Medidas para la selección de modelos
## [1] "which" "rsq" "rss" "adjr2" "cp" "bic" "outmat" "obj"
summary(Modelo_S)$adjr2 # nos da todos los r2 ajustados (seleccionar el mayor)
## [1] 0.9274212 0.9720049 0.9754244 0.9762571 0.9757482
summary(Modelo_S)$cp # (seleccionar el menor)
## [1] 75.730327 8.556583 4.467214 4.286420 6.000000
options(scipen=999)
# Identificar el modelo con mayor R2
which.max(summary(Modelo_S)$adjr2)
## [1] 4
coef(object=Modelo_S, id=which.max(summary(Modelo_S)$adjr2)) #el mejor modelo es con los 4
## (Intercept) X1_Cobre X2_Zinc X4_Plata X5_Plomo
## 4922573.764230 4.039232 1.804452 1.127270 -14.558157
max(summary(Modelo_S )$adjr2)
## [1] 0.9762571
Modelomayorr2=lm(Y_Total~ X1_Cobre+X2_Zinc+X4_Plata+X5_Plomo, Datos)
summary(Modelomayorr2)$adj.r.squared
## [1] 0.9762571
Interpretación
Seleccionar el mejor modelo usando la medida del R 2 ajustado
MEJOR MODELO USANDO LA MEDIDA DE \(R^2\) AJUSTADO :
\[ \hat{y_{i}}= 4922573.764230+ 4.039232*X_{1i}+1.804452*X_{2i}+ 1.127270*X_{4i}-14.558157*X_{5i}\]
Se identifica el modelo con el índice 4 .
#Selección de variables: Metodos Forward, Backward y Stepwise
# Identificar el modelo con mayor R2 con el m?todo Backward
Modelo_B<-regsubsets(Y_Total~., data=Datos, nvmax=5, method="backward")
coef(object = Modelo_B, id=which.max(summary(Modelo_B)$adjr2))
## (Intercept) X1_Cobre X2_Zinc X4_Plata X5_Plomo
## 4922573.764230 4.039232 1.804452 1.127270 -14.558157
####Identificar el modelo con mayor R2 con el método Forward
Modelo_F<-regsubsets(Y_Total~.,data=Datos, nvmax=5, method="forward")
coef(object = Modelo_F, id=which.max(summary(Modelo_F)$adjr2))
## (Intercept) X1_Cobre X2_Zinc X4_Plata X5_Plomo
## 4922573.764230 4.039232 1.804452 1.127270 -14.558157
##### Ajuste a la regresión Lasso ####
library(glmnet)
X = model.matrix (Y_Total~ . , Datos)[,-1] # separar la última columna
y = Datos$Y_Total
Modelo_L=glmnet(X, y, alpha=1)
# Seleccionando el major lambda (?ptimo)
set.seed(100)
cv.Lasso=cv.glmnet(X, y, alpha=1, nfolds=10, type.measure="mse")
cv.Lasso$lambda.1se
## [1] 218573.7
Modelo_L_Final=glmnet(X, y, alpha=1, lambda= cv.Lasso$lambda.1se)
coef(Modelo_L_Final)
## 6 x 1 sparse Matrix of class "dgCMatrix"
## s0
## (Intercept) 3066219.610251
## X1_Cobre 4.018070
## X2_Zinc .
## X3_Oro .
## X4_Plata 1.064968
## X5_Plomo .
MODELO ESTIMADO POR LASSO: \[ \hat{y_{i}}= 3066219.610251+ 4.018070*X_{1i}+1.064968*X_{4i}\]