实际问题中,变量之间常常不是直线。这时,通常是选配一条比较接近的曲线,通过变量替换把非线性方程加以线性化,然后按照线性回归的方 法进行拟合。
#常见的可转化一元线性回归的模型#
- 倒幂函数曲线型
令, 则得. - 双曲线型
令, 则得. - 幂函数曲线型
令, 则得. - 指数曲线型
令, 则得. - 倒指数曲线型
令, 则得.
综上所述,许多曲线都可以通过变换化为直线,于是可以按直线拟合的方法来处理。对变换后的数据进行线性回归分析,之后将得到的结果再代回原方程。因而,回归分析是对变换后的数据进行的,所得结果仅对变换后的数据来说是最佳拟合,当再变换回原数据坐标时,所得的回归曲线严格地说并不是最佳拟合,不过,其拟合程度通常是令人满意的。
#一元多项式回归模型#
不是所有的一元非线性函数都能转换成一元线性方程,但任何复杂的一元连续函数都可用高阶多项式近似表示,因此对于那些较难直线化的一元函数,可用下式来拟合。
分析
如果令,则上式可以转化为多元线性方程。
这样就可以用多元线性回归分析求出系数。(求解方法是最小二乘法)
虽然多项式的阶数越高,回归方程与实际数据拟合程度越高,但阶数越高,回归计算过程中的舍入误差的积累也越大,所以当阶数过高时,回归方程的精确度反而会降低,甚至得不到合理的结果。故一般取。
下面我们看一个例子。
已知某种半成品在生产过程中的废品率与它的某种化学成分有关,试验数据如下表所示。试根据散点图特点选配一条合适的拟合曲线关系。
| | 34 | 36 | 37 | 38 | 39 | 39 | 39 | 40 | 40 | 41 | 42 | 43 | 43 | 45 | 47 | 48 |
| ------------- |:-------------? -----?
| | 1.30 | 1.00 | 0.73 | 0.90 | 0.81 | 0.70 | 0.60 | 0.50 | 0.44 | 0.56 | 0.30 | 0.42 | 0.35 | 0.40 | 0.41 | 0.60 |
解:二次多项式回归模型为
令,则上式可以转化为二元线性方程:
##参数估计:选用最小二乘法##
根据表中数据,得
由程序求得
所以回归方程为
##方差分析表及相关性检验##
假设
由方差检验,及程序求得
由于,说明回归方程在水平上是高度显著的。
下面是求解的一些统计量:
拟合的图像如下图所示。
显然,从拟合的图像可以看出,拟合的效果比较好。
##Matlab代码
clear all;
clc
X1=[34;36;37;38;39;39;39;40;40;41;42;43;43;45;47;48];
x1=X1;
x2=X1.*X1;
X=[ones([size(X1,1),1]),x1,x2];
Y=[1.30;1.00;0.73;0.90;0.81;0.70;0.60;0.50;0.44;0.56;0.30;0.42;0.35;0.40;0.41;0.60];
beta=inv((X'*X))*X'*Y; %回归系数
disp('偏回归系数');
disp(beta);
%回归分析
z1=X;
z1(:,1)=[];
n=size(Y,1); %观察单位数
m=size(X,2);
p=m-1; %自变量个数
alpha=0.05;
yhat=X*beta;
%方差分析表(F检验)
SSR=(yhat-mean(Y))'*(yhat-mean(Y)); %回归平方和
SSE=(yhat-Y)'*(yhat-Y); %残差平方和
SST=(Y-mean(Y))'*(Y-mean(Y)); %总平方和
Fb=(SSR/(m-1))/(SSE/(n-m)); %显著性检验的统计量
Fa=finv(1-0.01,2,13);
Falpha=2*(1-fcdf(abs(Fb),m-1,n-m)); %P值
table1=cell(4,7); %创建元胞
table1(1,:)={'模型','偏差平方和','自由度','均方','F值','Fa','F.Sig'};
table1(2,1:7)={'回归',SSR,m-1,SSR/(m-1),Fb,Fa,Falpha};
table1(3,1:7)={'残差',SSE,n-m,SSE/(n-m),[],[],[]};
table1(4,1:3)={'总和',SST,n-1};
%决定系数检验
R2=SSR/SST; %决定系数
R=sqrt(R2); %复相关系数
disp('复相关系数');
disp(R);
Sy=sqrt(SSE/(n-m)); %剩余标准差
disp('估计的标准误差');
disp(Sy);
disp('方差分析表');
disp(table1);
xl=min(X1);xr=max(X1);
xx=linspace(xl,xr,1000);
yy=polyval(fliplr(beta'),xx);
plot(X1,Y,'k*',xx,yy,'-k');