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)