Podemos observar que Smarket es una base de datos con 9 variables y 1,250 datos.
Las variables de la base de datos son:
## [1] "Year" "Lag1" "Lag2" "Lag3" "Lag4" "Lag5"
## [7] "Volume" "Today" "Direction"
## [1] 1250 9
Algunas estadísticas descriptivas son las siguientes:
## Year Lag1 Lag2 Lag3
## Min. :2001 Min. :-4.922000 Min. :-4.922000 Min. :-4.922000
## 1st Qu.:2002 1st Qu.:-0.639500 1st Qu.:-0.639500 1st Qu.:-0.640000
## Median :2003 Median : 0.039000 Median : 0.039000 Median : 0.038500
## Mean :2003 Mean : 0.003834 Mean : 0.003919 Mean : 0.001716
## 3rd Qu.:2004 3rd Qu.: 0.596750 3rd Qu.: 0.596750 3rd Qu.: 0.596750
## Max. :2005 Max. : 5.733000 Max. : 5.733000 Max. : 5.733000
## Lag4 Lag5 Volume Today
## Min. :-4.922000 Min. :-4.92200 Min. :0.3561 Min. :-4.922000
## 1st Qu.:-0.640000 1st Qu.:-0.64000 1st Qu.:1.2574 1st Qu.:-0.639500
## Median : 0.038500 Median : 0.03850 Median :1.4229 Median : 0.038500
## Mean : 0.001636 Mean : 0.00561 Mean :1.4783 Mean : 0.003138
## 3rd Qu.: 0.596750 3rd Qu.: 0.59700 3rd Qu.:1.6417 3rd Qu.: 0.596750
## Max. : 5.733000 Max. : 5.73300 Max. :3.1525 Max. : 5.733000
## Direction
## Down:602
## Up :648
##
##
##
##
La matriz de correlación entre las variables es la siguiente:
## Year Lag1 Lag2 Lag3 Lag4
## Year 1.00000000 0.029699649 0.030596422 0.033194581 0.035688718
## Lag1 0.02969965 1.000000000 -0.026294328 -0.010803402 -0.002985911
## Lag2 0.03059642 -0.026294328 1.000000000 -0.025896670 -0.010853533
## Lag3 0.03319458 -0.010803402 -0.025896670 1.000000000 -0.024051036
## Lag4 0.03568872 -0.002985911 -0.010853533 -0.024051036 1.000000000
## Lag5 0.02978799 -0.005674606 -0.003557949 -0.018808338 -0.027083641
## Volume 0.53900647 0.040909908 -0.043383215 -0.041823686 -0.048414246
## Today 0.03009523 -0.026155045 -0.010250033 -0.002447647 -0.006899527
## Lag5 Volume Today
## Year 0.029787995 0.53900647 0.030095229
## Lag1 -0.005674606 0.04090991 -0.026155045
## Lag2 -0.003557949 -0.04338321 -0.010250033
## Lag3 -0.018808338 -0.04182369 -0.002447647
## Lag4 -0.027083641 -0.04841425 -0.006899527
## Lag5 1.000000000 -0.02200231 -0.034860083
## Volume -0.022002315 1.00000000 0.014591823
## Today -0.034860083 0.01459182 1.000000000
Podemos observar que solo las variables Year y Volume muestran un nivel de correlación significativo, 0.5390.
Info de la función attach(). “The database is attached to the R search path. This means that the database is searched by R when evaluating a variable, so objects in the database can be accessed by simply giving their names.”
Para utilizar la regresión logística es necesario utilizar la función glm() de la siguiente forma:
\[ glm(Y - X_1~ + ~X_2 ~+ ... + ~ X_n,~ data = base~de~datos,~ family = binomial)\]
Vamos a correr la regresión utilizando todos los rezagos y el volumen.
logit.1 <- glm(Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 + Volume, data = Smarket, family=binomial)
summary(logit.1)
##
## Call:
## glm(formula = Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 +
## Volume, family = binomial, data = Smarket)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.446 -1.203 1.065 1.145 1.326
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.126000 0.240736 -0.523 0.601
## Lag1 -0.073074 0.050167 -1.457 0.145
## Lag2 -0.042301 0.050086 -0.845 0.398
## Lag3 0.011085 0.049939 0.222 0.824
## Lag4 0.009359 0.049974 0.187 0.851
## Lag5 0.010313 0.049511 0.208 0.835
## Volume 0.135441 0.158360 0.855 0.392
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1731.2 on 1249 degrees of freedom
## Residual deviance: 1727.6 on 1243 degrees of freedom
## AIC: 1741.6
##
## Number of Fisher Scoring iterations: 3
Una vez que tenemos los coeficientes de la regresión, podemos ordenar a R que calcule la probabilidad de cada una de las observaciones.
Si al momento de utilizar la función predict() no se define una base de datos, las probabilidades son calculadas para la base de datos que se utilizó para el cálculo de los coeficientes.
\[predict(modelo,~ type~=~"response") \]
Para poder interpretar las probabilidades de forma correcta, es necesario recordar cómo están codificadas la variable dependiente cualitativa. Esto lo podemos observar usando el comando constrasts()
contrasts(Direction)
## Up
## Down 0
## Up 1
En este caso, las probabilidades que vayamos a calcular serán para que la cotización de la acción suba.
Ahora si, calculemos las probabilidades.
logit1.predict <- predict(logit.1, type="response")
logit1.predict[1:5]
## 1 2 3 4 5
## 0.5070841 0.4814679 0.4811388 0.5152224 0.5107812
Para realizar la clasificación, debemos asignar un valor a los probabilidades calculadas. Para esto, vamos a crear un vector lleno con la palabra “Down”,usando la función rep().
logit1.class = rep("Down", length(Direction))
Ahora si, ya que tenemos un vector con 1,250 observaciones con la palabra “Down”, es necesario definir un criterio para ver que observaciones, con base en una probabilidad serán “Up”.
En este caso, usaremos una probabilidad de 0.50, todas aquellas observaciones que tengan una probabilidad mayor a 0.50, les asignaremos el valor de “Up”.
logit1.class[logit1.predict >= 0.50] = "Up"
Al hacer esto, ya realizamos la clasificación del movimiento en función de la probailidades calculadas y el criterio utilizado
logit1.predict[1:5]
## 1 2 3 4 5
## 0.5070841 0.4814679 0.4811388 0.5152224 0.5107812
logit1.class[1:5]
## [1] "Up" "Down" "Down" "Up" "Up"
Dada la clasificación que realizamos, es importante genera una confusion matrix para poder calcular cuántas predicciones fueron correctas.
table(logit1.class, Direction)
## Direction
## logit1.class Down Up
## Down 145 141
## Up 457 507
Para conocer el porcentaje de acierto de nuestras prediciones, podemos sacar la proporción de clasificación correcta.
mean(logit1.class==Direction)
## [1] 0.5216
En este caso, tenemos un porcentaje de asignación correcta igual al 52.16%.
Podemos revisar otros modelos con diferentes variables independientes y hacer todo el proceso para conocer el porcentaje de predicción exitosa. Los pasos serían los mismos.
En ocasiones tendremos dos bases de datos, o una base de datos estará dividada en dos:
En nuestra base de datos inicial tenemos observaciones desde el 2001 hasta el 2005. Dividiremos la muestra en dos periodos de tiempo diferente, del 2001 al 2004, la utilizaremos para realizar las estimaciones de los coeficientes ; y las observaciones del 2005 las utilizaremos para evaluar la predicción usando los coeficientes estimados.
Primero vamos a crear un vector con booleano, donde queremos que las observaciones que son anteriores al 2005 tengan un valor de “TRUE”, mientras que las observaciones del 2005 sean "FALSE.
train = (Year<2005)
head(train)
## [1] TRUE TRUE TRUE TRUE TRUE TRUE
tail(train)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE
Necesitamos las observaciones del 2005, aquellas que tienen un valor de FALSE. Para extraer una submuestra usaremos basededatos[criterio]
Smarket.2005 = Smarket[!train,]
Se generó una base de datos nueva, Smarket.2005, al usar[] primero van renglones u observaciones; y después las variables o columnas. Al usar [!train,] le estamos indicando que queremos solo las observaciones que son falsas en train (las del 2005), con todas las variables.
## Year Lag1 Lag2 Lag3 Lag4 Lag5 Volume Today Direction
## 999 2005 -0.134 0.008 -0.007 0.715 -0.431 0.7869 -0.812 Down
## 1000 2005 -0.812 -0.134 0.008 -0.007 0.715 1.5108 -1.167 Down
## 1001 2005 -1.167 -0.812 -0.134 0.008 -0.007 1.7210 -0.363 Down
## 1002 2005 -0.363 -1.167 -0.812 -0.134 0.008 1.7389 0.351 Up
## 1003 2005 0.351 -0.363 -1.167 -0.812 -0.134 1.5691 -0.143 Down
## 1004 2005 -0.143 0.351 -0.363 -1.167 -0.812 1.4779 0.342 Up
## [1] 252 9
Un criterio similar usaremos para encontrar la submuestra del 2001 al 2004.
Smarket.2001 =Smarket[train,]
head(Smarket.2001)
## Year Lag1 Lag2 Lag3 Lag4 Lag5 Volume Today Direction
## 1 2001 0.381 -0.192 -2.624 -1.055 5.010 1.1913 0.959 Up
## 2 2001 0.959 0.381 -0.192 -2.624 -1.055 1.2965 1.032 Up
## 3 2001 1.032 0.959 0.381 -0.192 -2.624 1.4112 -0.623 Down
## 4 2001 -0.623 1.032 0.959 0.381 -0.192 1.2760 0.614 Up
## 5 2001 0.614 -0.623 1.032 0.959 0.381 1.2057 0.213 Up
## 6 2001 0.213 0.614 -0.623 1.032 0.959 1.3491 1.392 Up
dim(Smarket.2001)
## [1] 998 9
Ya teniendo las dos submuestras, primero vamos a estimar los coeficientes de nuestro modelo logit
logit.train1 <- glm(Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 + Volume, data = Smarket.2001, family=binomial)
summary(logit.train1)
##
## Call:
## glm(formula = Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 +
## Volume, family = binomial, data = Smarket.2001)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.302 -1.190 1.079 1.160 1.350
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.191213 0.333690 0.573 0.567
## Lag1 -0.054178 0.051785 -1.046 0.295
## Lag2 -0.045805 0.051797 -0.884 0.377
## Lag3 0.007200 0.051644 0.139 0.889
## Lag4 0.006441 0.051706 0.125 0.901
## Lag5 -0.004223 0.051138 -0.083 0.934
## Volume -0.116257 0.239618 -0.485 0.628
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1383.3 on 997 degrees of freedom
## Residual deviance: 1381.1 on 991 degrees of freedom
## AIC: 1395.1
##
## Number of Fisher Scoring iterations: 3
Y ahora vamos a realizar la predicción con base en las estimaciones realizadas. El primer paso era calcular las probabilidades, solo tenemos que asegurarnos de usar la otra submuestra.
logit.probtrain1 <- predict(logit.train1, Smarket.2005, type="response")
logit.probtrain1[1:5]
## 999 1000 1001 1002 1003
## 0.5282195 0.5156688 0.5226521 0.5138543 0.4983345
Con base en las probabilidades, realizaremos la clasificación
logit1.trainclass <- rep("Down", length(Smarket.2005))
logit1.trainclass[logit.probtrain1 >0.52] = "Up"
logit.probtrain1[1:5]
## 999 1000 1001 1002 1003
## 0.5282195 0.5156688 0.5226521 0.5138543 0.4983345
logit1.trainclass[1:5]
## [1] "Up" "Down" "Up" "Down" "Down"
Y una vez realizada la clasificación, podemos ver la certeza de las predicciones. Podemos usar la confusion matrix y calcular el porcentaje de acierto.
table(logit1.trainclass,Smarket.2005$Direction )
##
## logit1.trainclass Down Up
## Down 4 3
## Up 4 0
Para realizar el LDA es necesario cargar la library(MASS). Ubna vez hecho esto, hay que usar la función lda(), con una sintaxis muy similar a la de la región logaritmica, con excepción que aquí no es necesario definir una familia.
library(MASS)
lda.1 <- lda(Direction ~ Lag1 + Lag2, data=Smarket.2001)
lda.1
## Call:
## lda(Direction ~ Lag1 + Lag2, data = Smarket.2001)
##
## Prior probabilities of groups:
## Down Up
## 0.491984 0.508016
##
## Group means:
## Lag1 Lag2
## Down 0.04279022 0.03389409
## Up -0.03954635 -0.03132544
##
## Coefficients of linear discriminants:
## LD1
## Lag1 -0.6420190
## Lag2 -0.5135293
Con base en los resultados de la corrida, encontramos que el porcentaje de observaciones donde la cotización bajó fue el 49.1984%, mientras que el restante fue a la alza, 50.8016%.
La función plot() nos ayuda a graficar los linear discriminants obtenidos de calcular los coeficientes de la LDA, \[-0.641 * Lag_1 - 0.514 * Lag_2\] para cada una de las observaciones.
plot(lda.1)
Ahora veremos cuál fue la efectividad de las predicciones con base en las coeficientes estimados, en la submuestra del 2005.
Para analizar la efectividad de nuestras predicciones utilizaremos la función predict(), que arroja 3 elementos, la que nos va interesar es la sección class,
Primero se le dará la instrucción que realice las predicciones, usando los coeficientes estimados del periodo del 2001 al 2004, y después extraer únicamente los resultados de la predicción, al cual le asginaremos un nombre.
lda1.predict=predict(lda.1, Smarket.2005)
lda1.class <- lda1.predict$class
Una vez hecho esto, podemos hacer nuestra confusion matrix y ver la efectividad obtenida.
table(lda1.class, Smarket.2005$Direction)
##
## lda1.class Down Up
## Down 35 35
## Up 76 106
mean(lda1.class==Smarket.2005$Direction)
## [1] 0.5595238
Como podemos observar, tenemos una efectividad del 55.95% en la predicción de los movimientos de las acciones.
Para realizar el DQA también se tiene que habilitar la library(MASS), y usar la función qda() la sintaxis utilizada es la misma que en el caso de la LDA.
library(MASS)
qda.1 <- qda(Direction ~ Lag1 + Lag2, data=Smarket.2001)
qda.1
## Call:
## qda(Direction ~ Lag1 + Lag2, data = Smarket.2001)
##
## Prior probabilities of groups:
## Down Up
## 0.491984 0.508016
##
## Group means:
## Lag1 Lag2
## Down 0.04279022 0.03389409
## Up -0.03954635 -0.03132544
Para realizar las predicciones, la sintaxis también es similar al de LDA.
qda1.predict=predict(qda.1, Smarket.2005)
qda1.class <- qda1.predict$class
table(qda1.class, Smarket.2005$Direction)
##
## qda1.class Down Up
## Down 30 20
## Up 81 121
mean(qda1.class==Smarket.2005$Direction)
## [1] 0.5992063