SAS学习系列25非线性回归.docx
《SAS学习系列25非线性回归.docx》由会员分享,可在线阅读,更多相关《SAS学习系列25非线性回归.docx(17页珍藏版)》请在冰豆网上搜索。
SAS学习系列25非线性回归
SAS学习系列25.-非线性回归
LT
datanew1;
setexam25_1;
v=log(y);
run;
procsgplotdata=new1;
scatterx=xy=v;
title'变量代换后数据';
run;
procregdata=new1;
varxv;
modelv=x;
printcli;
title'残差图';
plotresidual.*predicted.;
run;
datanew2;
setexam25_1;
y1=14530.28*exp(-4.73895*x);
run;
procgplotdata=new2;
ploty*x=1y1*x=2/overlay;
symbolv=doti=nonecv=red;
symbol2i=smcolor=blue;
title'指数回归图';
run;
运行结果:
程序说明:
(1)调整后的R2=0.9831,说明拟合程度很好;F检验的P值=0.0001<α=0.05,拒绝原假设,故直线回归的斜率不为0;
(2)将线性回归系数代入,得到原回归方程
y=14530.28*e−4.73895x
(3)残差图趋势,符合残差随机正态分布的假设(不带其它明显趋势)。
二、多项式回归
一般函数都可用多项式来逼近,故多项式回归分析可用来处理相当广泛的非线性问题。
对观测数据(xt,yt),t=1,…,N.多项式回归模型为:
令
则模型可写为:
Y=XB+ε
当X列满秩时,用最小二乘估计
可求得其多项式回归方程。
但由于
的计算既复杂又不稳定,故一般采用正交多项式法来进行多项式回归。
多项式模型可以直接应用GLM(广义线性模型)求解。
例2重庆市种畜场奶牛群1—12月份(x1),产犊母牛平均产奶量(y)
的资料如程序数据步中,试对该资料配置一个合适的回归方程。
代码:
dataexam25_2;
inputx1y@@;
x2=x1*x1;
datalines;
13833.43
73476.76
23811.58
83466.22
33769.47
93395.42
43565.74
103807.08
53481.99
113817.03
63372.82
123884.52
;
run;
procsgplotdata=exam25_2;
scatterx=x1y=y;
title'原始数据散点图';
run;
procregdata=exam25_2;
modely=x1x2;
run;
运行结果:
程序说明:
(1)观察数据的散点图,更适合二次多项式拟合,也可以测试几种不同次数的多项式拟合选择其中最优的;
(2)将回归系数代入多项式方程得到:
y=4117.20136-204.93668x1+15.78570x12
三、不能变换为线性的非线性回归
该类非线性回归分析就是利用最小二乘准则来估计回归系数β,使得残差平方和最小。
一般来用数值迭代法来进行,先选定回归系数的初值β0,按照给定的步长和搜索方向逐步迭代,直到残差平方和达到最小。
有5种常用的非线性回归迭代方法:
高斯-牛顿法(Gauss-Newton)、最速下降法(梯度法)、牛顿法(Newton)、麦夸特法(Marquardt)、正割法(DUD)。
高斯-牛顿法在初值选取适当,且可逆时非常有效,但在其他情形,其求解较为困难,对此,Marguardt对其中的正则系数阵作适当修正,得到了改进算法。
(二)PROCNLIN过程步
对于不能线性化的非线性模型。
其估计不能直接运用经典的最小二乘法,而需要运用其他估计方法,如加权最小二乘法、直接搜索法、直接最优法与Taylor级数展开法进行线性逼近。
此时,可以利用NLIN过程步实现相应的计算,它是采用最小误差平方法及迭代推测法来建立一个非线性模型,估计参数默认采用高斯-牛顿迭代法。
NLIN过程不保证一定可以算出符合最小误差平方法之标准的参数估计值。
基本语法:
PROCNLINdata=数据集可选项>;
PARMS参数名=数值;
MODEL因变量=表达式可选项>;
;>
说明:
(1)NLIN的可选项包括:
outest=输出数据集——输出每步迭代的结果;
best=n——只输出最好的n组残差平方和;
method=gauss|marquardt|newton|gradient|dud|——设定参数估计的迭代方法,默认为gauss(没有der.语句);
(2)PARMS语句指定参数并赋值,一般包括参数名、初始值(GridSearch可以帮助选择合适的初始值)、迭代准则;例如:
parmsb0=0b1=1to10b2=1to10by2b3=1,10,100;
(3)bounds语句用于设定参数的约束,主要是不等式约束,约束间用逗号分隔。
例如,boundsa<=20,b>30,1<=c<=10;
(4)der.语句用于计算模型关于各参数的偏导数,相应格式为:
一阶偏导数:
der.参数名=表达式;
二阶偏导数:
der.参数名.参数名=表达式;
例如,对于模型modely=b0*(1-exp(-b1*x));二阶偏导数表达式:
der.b0.b1=x*exp(-b1*x);
例3根据对已有数据的XY散点图的观察和分析,发现Y随X增长趋势是减缓的,并且Y趋向一个极限值,我们认为用负指数增长曲线来拟合模型较为合适。
代码:
dataexpd;
inputxy@@;
datalines;
0200.570300.720400.810500.870600.910700.94
0800.950900.971000.981100.991201.001300.99
1400.991501.001601.001700.991801.001901.00
2000.992101.00
;
procnlindata=expdbest=10method=gauss;
parmsb0=0to2by0.5b1=0.01to0.09by0.01;
modely=b0*(1-exp(-b1*x));
der.b0=1-exp(-b1*x);
der.b1=b0*x*exp(-b1*x);
outputout=expoutp=ygs;
run;
goptionsreset=globalgunit=pctcback=whiteborder
htitle=6htext=3ftext=swissbcolors=(back);
procgplotdata=expout;
ploty*xygs*x/haxis=axis1vaxis=axis2overlay;
symbol1i=nonev=pluscv=redh=2.5w=2;
symbol2i=joinv=nonel=1h=2.5w=2;
axis1order=20to210by10;
axis2order=0.5to1.1by0.05;
title1'y=b0*(1-exp(-b1*x)';
title2'procnlinmethod=gauss';
run;
运行结果:
程序说明:
(1)parms语句设置了初始值网格值为b0取0,0.5,1,1.5,2共5个值,b1取0.01,0.02,…,0.09共9个值,所有可能组合为5×9=45,选项best=10要求输出残差平方和最小的前10种组合;
(2)最好的迭代初始值为b0=1.0000,b1=0.0400,此时回归模型残差为ESS=0.00140;从该迭代初始值开始经过4次迭代误差平方和的变化就满足收敛准则(ESS值几乎不变),停止迭代;
(3)高斯-牛顿迭代算法要求给出模型
对参数b0和b1的一阶偏导数表达式:
der.语句用来表示上面两个一阶偏导数表达式;
(4)output语句输出一个新数据集expout,包括原数据集和非线性回归模型的预测值ygs;gplot过程的主要作用是绘制输出数据集expout中的原始数据的散点图及回归曲线的平滑线;
(5)方差分析表,给出了回归平方和为17.6717,残差平方和为0.000577,总平方和为17.6723.
(6)参数估计表,给出了b0和b1的渐近估计值,得到的非线性回归模型为
y=1.0000000*[1-exp(0.5558957x)]
同时还给出b0和b1参数估计的渐近有效标准差和渐近95%置信区间。