zoukankan      html  css  js  c++  java
  • 判别分析——逻辑斯蒂回归

    对股票市场的数据进行分析,预测数据的走向

    #股票市场数据
    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%
        
    
    
  • 相关阅读:
    点到圆的切点
    两圆交点
    问n条平行于x,y的直线交点个数
    凸包与直线的关系
    Kuangbin的计算几何模板
    最大空凸包
    树链剖分模板题
    笔记1
    面试题2
    python utf-8 转码问题
  • 原文地址:https://www.cnblogs.com/hsyjgao/p/5026133.html
Copyright © 2011-2022 走看看