Estadísticas descriptivas de la muestra

Muestra

Podemos observar que Smarket es una base de datos con 9 variables y 1,250 datos.

Las variables de la base de datos son:

  • Year
  • Lag1
  • Lag2
  • Lag3
  • Lag4
  • Lag5
  • Volume
  • Today
  • Direction
## [1] "Year"      "Lag1"      "Lag2"      "Lag3"      "Lag4"      "Lag5"     
## [7] "Volume"    "Today"     "Direction"
## [1] 1250    9

Estadísticas descriptivas de la muestra

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  
##            
##            
##            
## 

Matriz de correlación

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.”

Logistic Regression

Logistic Regression

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.

Probar los coeficientes estimados en una base de datos diferente la utilizada para las estimaciones.

En ocasiones tendremos dos bases de datos, o una base de datos estará dividada en dos:

  • Submuestra para la estimación de los coeficientes.
  • Submuestra para evaluar las estimaciones de los coeficientes.

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

Linear Discriminal Analysis

Linear Discriminal Analysis

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.

Quadratic Discriminant Analysis

Quadratic Discriminant Analysis

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