(ISLR)Experience4:逻辑斯蒂回归、LDA、QDA和KNN

0.股票市场数据

library(ISLR)
summary(Smarket)

  • pairs(Smarket) #显示两两变量之间的散点图
  • cor(Smarket) #计算所有预测变量相关系数的矩阵.若接近于零,则说明无关。

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值