Matlab一元非线性回归分析的分析步骤与一元线性回归分析的步骤类似:
大体分为以下几步:
(1)绘制x,y的散点图,分析散点图的走势;
(2)根据散点图的走势,确定回归方程的具体形式,特别是参数个数的设定和设定初始值;
(3)调用NonLinearModel的fit方法进行模型拟合;
(4)模型改进,去除异常值的操作;
(5)进行残差分析,验证模型。
下面以某商品的数量与定价为例,进行实例展示;
(1)绘制x,y的散点图,分析散点图的走势;
[data,y0]=xlsread('C:\Users\箫韵\Desktop\Matlab数理与统计分析\exdata\test1',3);
x=data(:,2);%提取列数据自变量数据
y=data(:,3);%提取列数据因变量数据
figure;
plot(x,y,'ko');%绘制散点图
xlabel('数量');
ylabel('价格');
图1 散点图
(2)根据散点图的走势,确定回归方程的具体形式,特别是参数个数的设定和设定初始值;
%建立一元非线性回归方程
% yi=f(xi;b1,b2)+ai
% ai~N(0,aa^2),i=1,2,..n
price=@(beta,x)beta(1)./(1-beta(2)*x);%根据散点图趋势建立方程f(x)=b1./(1-b2*x),方程形式并不唯一。
beta0=[120,0.008];%beta0为b1,b2的初始值。根据x的取值范围,x在22与40之间,y>0,故需b2<0.25。
%根据y值是84到280的不等分布,主要集中在110到130,故b1取值120较合适,根据方程,b2取0.008即可。
opt=statset;%创建结构体变量类
opt.Robust='on';%开启回归稳健性方法
nlm1=NonLinearModel.fit(x,y,price,beta0,'Options',opt);
%y=41.459./(1-0.02213*x)
(3)调用NonLinearModel的fit方法进行模型拟合;
xnew=linspace(20,40,50)';%取50个x的值在20到40之间
ynew=nlm1.predict(xnew);%进行ynew预测
figure;
plot(x,y,'ko');
hold on;
plot(xnew,ynew,'linewidth',2.5);
xlabel('数量');
ylabel('价格');
legend('原始数据散点','非线性回归曲线');
图2模型拟合效果
(4)模型改进,去除异常值的操作;
异常值的诊断。NonlinearModel类对象的Residuals属性值中有标准化残差和学生化残差值。这里通过学生化残差查询异常值
Res2=nlm1.Residuals;
Res_Stu2=Res2.Studentized;
id2=find(abs(Res_Stu2)>2);
%properties(nlm1);%可以查询nlm1的属性
%去除异常值重新构建回归模型
nlm2=NonLinearModel.fit(x,y,price,beta0,'Exclude',id2,'options',opt);
%y=41.394./(1-0.22195*x)
xnew=linspace(20,40,50)';
y1=nlm1.predict(xnew);
y2=nlm2.predict(xnew);
figure;
plot(x,y,'ko');
hold on;
plot(xnew,y1,'r--','linewidth',2);
plot(xnew,y2,'b.','linewidth',2);
xlabel('数量');
ylabel('价格');
legend('原始数据散点','回归曲线','去除异常值后的回归曲线');
图3 去除异常值与未去除异常值的拟合对比
(5)进行残差分析,验证模型。
调用的是NonLinearModel类中的plotResiduals方法。残差分析有比较多的方法,这里以残差直方图和残差正态概率图为例。
%回归诊断
figure;
subplot(1,2,1);
nlm1.plotResiduals('histogram');
title('(a)残差直方图');
xlabel('残差r');
ylabel('f(r)');
subplot(1,2,2);
nlm1.plotResiduals('probability');
title('(b)残差正态概率图');
xlabel('残差');
ylabel('概率');
图4残差直方图和残差正态概率图
原始数据
order
数量
价格
1
25
89
2
28
108
3
26
115
4
23
99
5
26
109
6
32
124
7
35
210
8
30
126
9
34
132
10
29
110
11
33
135
12
36
226
13
34
136
14
36
220
15
36
208
16
30
125
17
32
146
18
30
129
19
35
140
20
29
116
21
31
123
22
32
126
23
28
135
24
36
208
25
40
240
26
28
125
27
29
113
28
36
208
29
32
135
30
38
267
31
40
225
32
38
278
33
28
118
34
32
124
35
34
146
36
36
208
37
30
111
38
29
115
39
36
208
40
29
123
41
25
110
42
29
135
43
26
123
44
23
99
45
26
125
36
35
180
37
35
178
38
35
175
39
35
176
40
35
180
41
35
178
42
34
175
43
35
168
44
35
167
45
34
179
43
31
129
44
31
121
45
31
125