判别分析——逻辑斯蒂回归
2015-12-07 15:16
357 查看
对股票市场的数据进行分析,预测数据的走向
#股票市场数据 library(ISLR) #ISLR库的股票市场数据的数值 names(Smarket) #汇总数据 summary(Smarket) #判断相关性散点图 pairs(Smarket) #计算所有定量预测变量两两之间相关系数的矩阵 cor(Smarket[,-9]) #Volume与Year强相关 attach(Smarket) plot(Volume)
接下来预测Direction(up or down)
#逻辑斯蒂回归,属于二项分布族的类别 glm.fit <- glm(Direction~Lag1+Lag2+Lag3+Lag4+Lag5+Volume,data=Smarket,family=binomial) summary(glm.fit) #p值大于0.05,所以没有充分的理由表明Direction和Lag1之间有确切的联系 #提取模型系数 coef(glm.fit) #提取模型系数及其推断情况 summary(glm.fit)$coef #提取p值 summary(glm.fit)$coef[,4] #predict(type="response")预测市场上涨的概率P(Y=1|X),即对数发生比.可看帮助文档。 如果没有提供数据集给predict函数,默认使用训练数据的拟合逻辑斯蒂回归模型的概率 glm.probs <- predict(glm.fit,type="response") glm.probs[1:4] #这里给出前四个预测概率 #创建一个哑变量,factor contrasts(Direction) #根据预测市场上涨概率比0.5大还是小,判断预测的结果 glm.pre<- rep("Down",1250) glm.pre[glm.probs>.5] <- "Up" #产生混淆矩阵来判断有多少观测被正确或错误分类 table(glm.pre,Direction) Direction glm.pre Down Up Down 145 141 Up 457 507 #计算正确预测的比例 正确预测的比例: (145+507)/1250 mean(glm.pre==Direction) [1] 0.5216 总结:以上数据为用训练拟合模型的数据来做预测,测试错误率为1-52.16%=47.8%, 而训练数据集偏向于低估测试错误率。
接下来改变预测数据集,用2001-2004年的数据做训练,2005年数据做预测
#测试数据集 test <- Smarket[Year>2004,] dim(test) Direction.test <- test$Direction #根据subset参数对2005年之前的数据拟合一个逻辑斯蒂回归模型 glm.fit <- glm(Direction~Lag1+Lag2+Lag3+Lag4+Lag5+Volume,data=Smarket,family = binomial,subset=(Year<2005)) summary(glm.fit1) #subset是一个逻辑值,用于挑选观测数据集的子集,即训练数据集 #得到测试集2005年每一天的股票上涨预测概率 glm.probs <- predict(glm.fit,type="response",test) table(glm.probs,Direction.test) #glm.probs是一个数值向量,将它转化成因子类型,可以用列联表统计 glm.pred <- rep("Down",252) glm.pred[glm.probs > .5] <- "Up" table(glm.pred,Direction.test) Direction.test glm.pred Down Up Down 77 97 Up 34 44 #预测正确率 mean(glm.pred==Direction.test) [1] 0.4801587
总结:测试错误率更高了,而在实际生活中,人们一般很少用前几日的投资回报率来预测未来市场的表现。
优化模型:由逻辑斯蒂回归模型的p值,Lag1和Lag2两个预测变量的p值稍小,所以去除与响应变量无关的预测变量,
只用Lag1和Lag2两个预测变量。
glm.fit <- glm(Direction~Lag1+Lag2,data=Smarket,family=binomial,subset = (Year<2005)) summary(glm.fit) glm.probs <- predict(glm.fit,test,type="response") glm.pred <- rep("Down",252) glm.pred[glm.probs > 0.5] <- "Up" table(glm.pred,Direction.test) Direction.test glm.pred Down Up Down 35 35 Up 76 106 #预测正确率 mean(glm.pred==Direction.test) 106/(106+76)#预测市场上涨的正确率58% 35/(35+35)#预测市场下跌的正确率50%
相关文章推荐
- excel怎么固定第一行
- 外部中断(红外通信)
- org.hibernate.transaction.JDBCTransaction cannot be cast to javax.transaction.Transaction
- rhel 6.5 安装yum源
- 地表最强! Unity 5.x 插件合集专用贴 - 更新日期 2015.12.06
- Picasso图片下载缓存库的使用心得
- TF10187:Could not open document XXX.dbmdl
- VisualSVN Server添加svn项目
- IOS应用安全(五):高级Runtime分析和操作
- oracle 自增ID
- CSS中zoom和scale的区别
- Jenkins中Jelly基础、超链接、国际化
- Xml解析
- 动态引用APK文件
- orocos 的数据表示(模板template): DataObject (还有一条主线为 DataSource)
- 【SSH项目实战】国税协同平台-34.quartz&CronTrigger
- iOS开发者的福利 — — iOS9+Xcode7免越狱免证书直接调试
- dubbo,zookeeper,spring 案列
- EC读书笔记系列之20:条款53、54、55
- Oracle 12C -- Unified Auditing Policy