首页 > 代码库 > sas回归分析

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;

 

sas回归分析