Matlab一元非线性回归分析

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('价格');

Matlab一元非线性回归分析_第1张图片

                                         图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)

Matlab一元非线性回归分析_第2张图片

(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('原始数据散点','非线性回归曲线');

Matlab一元非线性回归分析_第3张图片

                                              图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)

Matlab一元非线性回归分析_第4张图片

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('原始数据散点','回归曲线','去除异常值后的回归曲线');

Matlab一元非线性回归分析_第5张图片

                           图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('概率');

Matlab一元非线性回归分析_第6张图片

                                             图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

你可能感兴趣的:(Matlab数据分析)