• sas回归分析


    数据预处理->数据探索->模型选择->残差检验、共线性争端,强影响点判断->模型修正(否->模型选择,是->模型预测)

    一:数据预处理

    二:数据探索

    看y是否服从正态分布(PP图)

    proc univariate data=reg.b_fitness;
        var Runtime -- Performance;
        histogram Runtime -- Performance / normal;  /*主要从统计指标上面看*/
        probplot Runtime -- Performance /normal (mu=est sigma=est color=red w=2);/*主要从图形来看*/
    run;

    看x的离散程度(散点图)

    看y与x的相关系数(散点图,R^2)

    proc gplot data=reg.b_fitness;
        plot Oxygen_Consumption *(Run_Pulse 
       Rest_Pulse 
       Maximum_Pulse 
       Performance 
       Runtime 
       Age 
       Weight 
    );
    symbol v=dot color=red;
    run;
    quit;
    
    proc corr data=reg.b_fitness;
        var Run_Pulse Rest_Pulse Maximum_Pulse Performance Runtime Age Weight;
        with Oxygen_Consumption;
    run;

    三:模型选择

    CP法(全模型法)

    功能:在特定的模型大小范围内,找出指定的最佳模型(具有最小CP)

    BEST=N 表示在不同的变量个数组成的模型中,选择N个最好的模型,所有组合数为[2^(变量个数)-1]

    在由1个自变量组成的模型中选N个最好的

    在由2个自变量组成的模型中选N个最好的

    。。。。。。。。。。。

    在由M(总共变量的个数)个自变量组成的模型中选N个最好的

    总共会选M*N个模型

    这里统计量为Cp,建议是Cp<=p  ,p是所有变量个数加1

    逐步法

    向前回归法

    特点:和变量进入的顺序有很大关系,如果第一个进来的变量的解释效应过大,很可能造成后进的变量进不来模型

    引入第一个变量进入方程,对整个方程进行F检验,并对单个回归系数进行T检验,计算残差平方和Se1,如果通过检验则保留,否则剔除

    引入第二个变量进入方程,对整个方程进行F检验,并对单个回归系数进行T检验,计算残差平方和Se2,那么Se1>Se2,称Se1-Se2为第二个变量的偏回归平方和,如果该值明显偏大,则保留,说明其对因变量有影响,否则剔除。

    。。。。

    直到引入所有变量

    向后回归法

    特点:和向前一样,和变量的离开顺序有关

    和向前回归相反,首先引入所有变量,然后再一个一个的根据(偏回归平方和)删除不显著的变量

    逐步回归法

    综合向前和向后的特性

    引入变量时需要利用(偏回归平方和)进行显著性检验

    当方程加入变量后,又要对原有的老变量利用(偏回归平方和)进行检验,一旦某变量不显著则要进行删除。

    直到所有老变量不能被删除,新变量不能被加入为止

    proc reg data=reg.b_fitness;
        title 'full model';
        reg_full: model Oxygen_Consumption = Performance  Runtime Age Weight Run_Pulse Rest_Pulse  Maximum_Pulse
                        /selection=rsquare adjrsq cp best=4;
        /*选择adjrsq高的模型 且cp<=p的模型,根据需求多选几组*/
        title 'step model';
        forward:   model Oxygen_Consumption = Performance  Runtime Age Weight Run_Pulse Rest_Pulse  Maximum_Pulse
                        /selection=forward;
        backward:  model Oxygen_Consumption = Performance  Runtime Age Weight Run_Pulse Rest_Pulse  Maximum_Pulse
                        /selection=backward;
        stepwise:  model Oxygen_Consumption = Performance  Runtime Age Weight Run_Pulse Rest_Pulse  Maximum_Pulse
                        /selection=stepwise;
    run;

    四:模型诊断

    1:残差检验

    方法:主要就是看图,如果基本上是带状,说明就是正态分布了,其他奇怪的形状就要再做考虑了

    学生化残差(Student residual):残差除以标准误

    1.1:如果是小样本,该值在-2~+2之间。

    1.2:如果是大样本,该值在-3~+3之间。

    2:强影响点判断

    可以根据如下四个统计量

    2.1:学生化残差(Student residual也叫标准化残差近似服从~N(0,1)),当残差过大,表明样本点到拟合之前的铅直距离比较大,即为异常点(大小标准同上),这是针对于响应变量

    2.2:pii针对自变量,pii过大,表明xi与x的矩阵距离过远,一般设定阈值0.2进行筛选

    2.3:Cook's D:衡量第i个观测被删除后,对回归估计系数的影响度

    2.4:RStudent residual:不含该观测所拟合模型给出的学生化残差

    2.5:DFFITS:衡量第i个观测被删除后,对应预测值的标准化影响度

    3:共线性诊断

    方差膨胀因子:VIF

    VIF>3表明有共线性,共线性变量时成对出现,若有,要根据需求选择去除一个。

    /*残差分析*/
        proc reg data=reg.b_fitness;
        model Oxygen_Consumption = Runtime  Age Run_Pulse Maximum_Pulse;
        plot r.*(p. Runtime  Age Run_Pulse Maximum_Pulse);/*假定中残差与预测变量和响应变量(拟合值)都是独立的*/
        plot student. *obs.;/*如果观测的顺序很重要,这个是很必要的,例如按时间或空间顺序得到的观测*/
        plot nqq.*student.;
        symbol v=dot color=red;
    run;
    quit;
    
    /*强影响点判断*/
    proc reg data=reg.b_fitness;
       PREDICT: model oxygen_consumption
                          = runtime age run_pulse maximum_pulse
                          / r influence;
       id name;
       output out=ck4outliers 
              rstudent=rstud dffits=dfits cookd=cooksd;
       title;
    run;
    quit;
    
    /*  set the values of these macro variables, */
    /*  based on your data and model.            */
    %let numparms = 5;  /* # of predictor variables + 1 */ 
    %let numobs = 31;   /* # of observations */
    %let idvars = name; /* relevant identification variable(s) */
    /*EM模块中的程序*/
    data influential;
      set ck4outliers; 
        
       cutdifts = 2*(sqrt(&numparms/&numobs));
       cutcookd = 4/&numobs;
    
       rstud_i = (abs(rstud)>3);
       dfits_i = (abs(dfits)>cutdifts);
       cookd_i = (cooksd>cutcookd);
       sum_i = rstud_i + dfits_i + cookd_i;
       if sum_i > 0;
    run;
    
    /****3.共线性诊断***/
    
    proc reg data=reg.b_fitness;
       FULLMODL: model oxygen_consumption
                             =  runtime age 
                               run_pulse  maximum_pulse 
                             / vif collin collinoint; /*vif成对出现,vif>2即认为有共线性*/
       title 'Collinearity -- Full Model';
    run;
    quit;

    五:模型修正

    如果有强影响点或共线性,则去除,然后再进行模型选择->三种诊断,再一步步修正,直到所有不好的东西都不出现

    六:进行预测

    data need_prediction;
        input Performance @@;
    datalines;
    0 6 6 9 12
    ;
    run;
    
    data pre_now;
        set reg.b_fitness need_prediction;
    run;
    
    proc reg data=pre_now;
        model Oxygen_Consumption = Performance / p;   /*表示输出自变量对应的预测值*/
        id performance;
        output out=me p=ic r=ocr; /*out=数据集   p=因变量的预测值   r=残差*/
    run;
    quit;
  • 相关阅读:
    Linux系统下/tmp目录文件重启后自动删除,不重启自动删除10天前的/TMP的文件(转)
    Docker 镜像加速器
    RabbitMQ集群和高可用配置
    k8s如何管理Pod(rc、rs、deployment)
    微信开放平台开发(1) 语义理解
    微信开放平台开发(2) 微信登录
    微信电话
    微信支付开发(1) 微信支付URL配置
    微信支付开发(2) 微信支付账号体系
    微信支付开发(3) JS API支付
  • 原文地址:https://www.cnblogs.com/yican/p/4181086.html
Copyright © 2020-2023  润新知