(ISLR)Experience4:邏輯斯蒂迴歸、LDA、QDA和KNN

1.邏輯斯蒂迴歸

library(ISLR)
attach(Smarket)
glm.fit <- glm(Direction~Lag1 + Lag2 + Lag3 + Lag4 + Lag5 + Volume, data = Smarket,family = binomial)    #family = binomial 說明glm()執行邏輯斯蒂迴歸

train <- (Year < 2005)      #表示2001-2005年之間的觀測,train是個布爾向量
Smarket.2005 <- Smarket[!train,]   #以布爾向量來選擇取或不取該行,以此來選擇2005年的觀測數據

Direction.2005 <- Direction[!train]

#對2005年之前的觀測數據的子集擬合一個邏輯斯蒂迴歸模型。
#得到測試集中每一天的股票市場上漲的預測概率,即2005年的每天
glm.fit <- glm(Direction~Lag1 + Lag2 + Lag3 + Lag4 + Lag5 + Volume, data = Smarket,family = binomial, subset = train)


#type = "response"告訴R只需輸出P(Y=1|X)
#predict()第二個參數必須是dataframe,(Smarket.2005是個矩陣(也是個數據框)),並且該數據框有與當初glm()擬合模型時相同的predict variable
#若dataframe有給定的行標號,則predict()根據數據的行標號,來作爲預測模型的predict variable,輸出結果作爲response variable
#否則,以[1,2,3...,]來作爲predict variable
glm.probs <- predict(glm.fit, Smarket.2005, type = "response")  #對predict()函數的理解

#創建一個由1250個Down元素組成的向量
glm.pred <- rep("Down", 252)
glm.pred[glm.probs > .5] <- "Up"
table(glm.pred, Direction.2005)   #table()函數可以產生混淆矩陣來判斷有多少觀測被正確或錯誤分類

mean(glm.pred == Direction.2005)

# --------------
#以下去除看上去對Direction預測作用較小的變量,只保留Lag1 和 Lag2
glm.fit <- glm(Direction~Lag1 + Lag2, data = Smarket,family = binomial, subset = train)
glm.probs <- predict(glm.fit, Smarket.2005,type = "response")
glm.pred <- rep("Down", 252)

#比較式glm.probs > .5,返回的是布爾向量,根據布爾向量來選擇select集
glm.pred[glm.probs > .5] <- "Up"

#下面的程序是在特定的Lag1和Lag2值下預測投資回報率
sp <- predict(glm.fit, newdata = data.frame(Lag1=c(1.2, 1.5), Lag2=c(1.1, -0.8)), type = "response")

#補:
#summary(glm.fit)     #查看邏輯斯蒂迴歸 的各個信息,尤其參數的p值
# contrasts(Direction)   #表明R創建了一個啞變量

2.線性判別方法

library(ISLR)
attach(Smarket)

train <- (Year < 2005)      #表示2001-2005年之間的觀測,train是個布爾向量
Smarket.2005 <- Smarket[!train,]   #以布爾向量來選擇取或不取該行,以此來選擇2005年的觀測數據

Direction.2005 <- Direction[!train]
lda.fit <- lda(Direction~Lag1 + Lag2, data = Smarket, subset = train)

lda.pred <- predict(lda.fit, Smarket.2005)
lad.class <- lda.pred$class

#print(lda.pred)
lda.pred$posterior[1:20,1]
lad.class[1:20]

3.二次判別方法

  • 二次判別方法 與 線性判別方法 類似,僅是lda()換成qda()

4.KNN

library(class)
attach(Smarket)
train.X <- cbind(Lag1, Lag2)[train, ]
test.X <- cbind(Lag1, Lag2)[!train,]

train.Direction <- Direction[train]

set.seed(1)
knn.pred <- knn(train.X, test.X, train.Direction, k = 3)
table(knn.pred, Direction.2005)
mean(knn.pred == Direction.2005)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章