rm(list=ls())
library(ISLR)
library(MASS)
library(class)

attach(Weekly)
summary(Weekly)

### a ###
pairs(Weekly)
cor(Weekly[, -9])

### b ###
glm.fit <- glm(Direction ~ Lag1 + Lag2 + Lag3 + Lag4 + Lag5 + Volume, data = Weekly, 
              family = binomial)
summary(glm.fit)

### c ###
glm.probs <- predict(glm.fit, type = "response")
glm.pred <- rep("Down", length(glm.probs))
glm.pred[glm.probs > 0.5] <- "Up"
table(glm.pred, Direction)

### d ###
train <- (Year < 2009)
glm.fit <- glm(Direction ~ Lag2, data = Weekly[train, ], family = binomial)
glm.probs <- predict(glm.fit, Weekly[!train, ], type = "response")
glm.pred <- rep("Down", length(glm.probs))
glm.pred[glm.probs > 0.5] <- "Up"
table(glm.pred, Direction[!train])
mean(glm.pred == Direction[!train])

### e ###
lda.fit <- lda(Direction ~ Lag2, data = Weekly[train, ])
lda.pred <- predict(lda.fit, Weekly[!train, ])
table(lda.pred$class, Direction[!train])
mean(lda.pred$class == Direction[!train])

### f ###
qda.fit <- qda(Direction ~ Lag2, data = Weekly[train, ])
qda.pred <- predict(qda.fit, Weekly[!train, ])
table(qda.pred$class, Direction[!train])
mean(qda.pred$class == Direction[!train])
  
### g ###
knn.pred <- knn(as.matrix(Lag2[train], ncol = 1), as.matrix(Lag2[!train], ncol = 1),
                Direction[train], k = 1)
table(knn.pred, Direction[!train])
mean(knn.pred == Direction[!train])

### h ###
# Logistic regression and LDA have the same miss-classification error, smaller than the other.

### i ###
# Logistic regression with interaction
glm.fit <- glm(Direction ~ Lag2*Lag1, data = Weekly[train, ], family = binomial)
glm.probs <- predict(glm.fit, Weekly[!train, ], type = "response")
glm.pred <- rep("Down", length(glm.probs))
glm.pred[glm.probs > 0.5] <- "Up"
table(glm.pred, Direction[!train])
mean(glm.pred == Direction[!train])

# LDA with Lag2 interaction with Lag1
lda.fit <- lda(Direction ~ Lag2*Lag1, data = Weekly[train, ])
lda.pred <- predict(lda.fit, Weekly[!train, ])
table(lda.pred$class, Direction[!train])
mean(lda.pred$class == Direction[!train])

# QDA with Lag2^2
qda.fit <- qda(Direction ~ Lag2 + I(Lag2^2), data = Weekly[train, ])
qda.pred <- predict(qda.fit, Weekly[!train, ])
table(qda.pred$class, Direction[!train])
mean(qda.pred$class == Direction[!train])

# KNN k = 10
knn.pred <- knn(as.matrix(Lag2[train], ncol = 1), as.matrix(Lag2[!train], ncol = 1),
                Direction[train], k = 10)
table(knn.pred, Direction[!train])
mean(knn.pred == Direction[!train])

# KNN k = 100
knn.pred <- knn(as.matrix(Lag2[train], ncol = 1), as.matrix(Lag2[!train], ncol = 1),
                Direction[train], k = 100)
table(knn.pred, Direction[!train])
mean(knn.pred == Direction[!train])
