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;
原文地址:https://www.cnblogs.com/yican/p/4181086.html