一元线性回归
一、采用最小二乘回归
二、采用LinearModel.fit函数进行线性回归
三、采用regress函数进行回归
一元非线性回归
一、对数形式
二、指数形式
多元回归
逐步回归
Logistic回归
根据回归方法中因变量个数和回归函数类型(线性和非线性)进行分类:
一元线性回归、一元非线性回归、多元回归
两种特殊的回归方式:
逐步回归:在回归过程中可以调整变量数量的回归方法。
Logistic回归:以指数结构函数作为回归模型的回归方法。
首先从图形判断数据呈线性还是非线性。
代码如下:
%% 一元线性回归实例
%% 输入数据
clc, clear all, close all
x=[23.80,27.60,31.60,32.40,33.70,34.90,43.20,52.80,63.80,73.40];
y=[41.4,51.8,61.70,67.90,68.70,77.50,95.90,137.40,155.0,175.0];
% 绘制散点图,判断是否具有线性关系
figure
plot(x,y,'r*') %作散点图
xlabel('x(职工工资总额)','fontsize', 12) %横坐标名
ylabel('y(商品零售总额)', 'fontsize',12) %纵坐标名
set(gca,'linewidth',2);
运行结果:可以看出大近似呈线性。
最小二乘法原理:
最小二乘法的目的是通过将样本点拟合为一条直线,进而进行一定的分析和预测,假设这些样本点坐标为(xi,yi),红线的长度就是点到直线的距离di,由于距离有正有负,我们把计算对象变为距离的平方di^2(平方和最小即距离和最小),假设直线方程为y=bx+a,利用偏导数求极值,最后的计算公式为:
代码如下:
% 采用最小二乘拟合
Lxx=sum((x-mean(x)).^2);
Lxy=sum((x-mean(x)).*(y-mean(y)));
b1=Lxy/Lxx;
b0=mean(y)-b1*mean(x);
y1=b1*x+b0;
hold on % 添加新绘图时保留当前绘图
plot(x, y1,'linewidth',2);
运行结果:
代码如下:
%% 采用LinearModel.fit函数进行回归
m2 = LinearModel.fit(x,y) % 创建线性回归模型,X、Y是对应数据
运行结果:
意义及用法:
注:t统计量用来模型中关于参数的单个假设进行检验的一种统计量。一般的t统计量写成t=(估计值-假设值)/标准误,当假设值为0时,便得到通常的t统计量。我们一般用t统计量针对单侧或双侧对立假设做检验。例如:假设H0:a=1,H1:a>1,我们计算t统计量,如果t>c,我们就拒绝H0,接受H1,此时我们便说在适当的显著性水平上,a统计显著地大于1.
补充:模型的其他统计量如下:
代码如下:
%% 采用regress函数进行回归
Y=y';
X=[ones(size(x,2),1),x'];
% size(x,2)获取x中第二维度的长度
% ones生成全部为1的数组
[b, bint, r, rint, s] = regress(Y, X)
% regress(Y, X,alpha)alpha为显著水平,默认0.05
% 多元线性回归
% [输出 置信区间 残差 残差的置信区间 stats]
% stats其中包含R^2统计量、F统计量及其p值(F(1,n-2)分布大于F的概率)以及剩余方差s^2。
% 矩阵X必须包含一个由 1 组成的列,以便软件正确计算模型统计量。
% 残差:实际观察值与估计值(拟合值)之间的差
% 置信区间:误差范围
运行结果:
意义及用法:
首先从图形判断数据呈线性还是非线性。
代码如下:
%% 一元非线性回归实例
%% 输入数据
clc, clear all, close all
x=[1.5, 4.5, 7.5,10.5,13.5,16.5,19.5,22.5,25.5];
y=[7.0,4.8,3.6,3.1,2.7,2.5,2.4,2.3,2.2];
plot(x,y,'*','linewidth',2);
set(gca,'linewidth',2);
xlabel('销售额x/万元','fontsize', 12)
ylabel('流通费率y/%', 'fontsize',12)
运行结果:近似为对数关系或指数关系
代码如下:
%% 对数形式
m1 = @(b,x) b(1) + b(2)*log(x);
% @是定义句柄的运算符,如:f=@(x)acos(x) 相当于建立了一个函数文件
nonlinfit1 = fitnlm(x,y,m1,[0.01;0.01])
% 将m1指定的模型拟合到表或数据集数组中的变量,并返回非线性模型nonlinfit1
% 使用从[0.01;0.01]中的初始值开始的迭代过程估计模型系数
b=nonlinfit1.Coefficients.Estimate;
% 把非线性模型中估计的系数储存到b中
Y1=b(1,1)+b(2,1)*log(x);
hold on
plot(x,Y1,'--k','linewidth',2)
运行结果:
代码如下:
%% 指数形式拟合
m2 = 'y ~ b1*x^b2';% 函数模型
nonlinfit2 = fitnlm(x,y,m2,[1;1])
b1=nonlinfit2.Coefficients.Estimate(1,1);
b2=nonlinfit2.Coefficients.Estimate(2,1);
Y2=b1*x.^b2;
hold on
plot(x,Y2,'r','linewidth',2)
legend('原始数据','a+b*lnx','a*x^b')
运行结果:
分析:对数形式的决定系数为0.973,指数形势的决定系数为0.993,优于前者。
首先从图形判断数据呈线性还是非线性。
代码如下:
%% 作出因变量Y与各自变量的样本散点图
% x1,x2,x3,Y的数据
x1=[3.5 5.3 5.1 5.8 4.2 6.0 6.8 5.5 3.1 7.2 4.5 4.9 8.0 6.5 6.5 3.7 6.2 7.0 4.0 4.5 5.9 5.6 4.8 3.9];
x2=[9 20 18 33 31 13 25 30 5 47 25 11 23 35 39 21 7 40 35 23 33 27 34 15];
x3=[6.1 6.4 7.4 6.7 7.5 5.9 6.0 4.0 5.8 8.3 5.0 6.4 7.6 7.0 5.0 4.0 5.5 7.0 6.0 3.5 4.9 4.3 8.0 5.0];
Y=[33.2 40.3 38.7 46.8 41.4 37.5 39.0 40.7 30.1 52.9 38.2 31.8 43.3 44.1 42.5 33.6 34.2 48.0 38.0 35.9 40.4 36.8 45.2 35.1];
% 绘图,三幅图横向并排
subplot(1,3,1),plot(x1,Y,'g*')
subplot(1,3,2),plot(x2,Y,'k+')
subplot(1,3,3),plot(x3,Y,'ro')
运行结果:大致分布在一条直线旁边,可采用线性回归
下面进行多元线性回归
代码如下:
%% 进行多元线性回归
n = 24; m = 3; % 每个变量均有24个数据,共有3个变量
X = [ones(n,1),x1',x2',x3'];
[b,bint,r,rint,s]=regress(Y',X,0.05)
% 0.05为预定显著水平,判断因变量y与自变量之间是否具有显著的线性相关关系需要用到。
运行结果:
分析:得到初步回归方程为 y=18.0157+1.0817x1+0.3212x2+1.2835x3
逐步回归是多元线性回归和多元多项式回归的结合,可以自动使方程的因子设置最合理。
代码如下 :
%% 逐步回归
X=[7,26,6,60;1,29,15,52;11,56,8,20;11,31,8,47;7,52,6,33;11,55,9,22;3,71,17,6;1,31,22,44;2,54,18,22;21,47,4,26;1,40,23,34;11,66,9,12]; %自变量数据
Y=[78.5,74.3,104.3,87.6,95.9,109.2,102.7,72.5,93.1,115.9,83.8,113.3]; %因变量数据
stepwise(X,Y,[1,2,3,4],0.05,0.10)
% in=[1,2,3,4]表示X1、X2、X3、X4均保留在模型中
% stepwise(X,y,inmodel,penter,premove)还为F统计量的p值指定初始模型(inmodel)和入口(penter)和出口(premove)容差
% inmodel要么是长度等于X的列数的逻辑向量,要么是索引向量,取值范围从1到X的列数。penter的值必须小于或等于premove
% penter为引入变量时设定的最大p值,缺省时为0.05 premove为是移出变量时设定的p值,缺省时为0.10
运行结果:
分析:[1.476,0.6867,0,0]
蓝色行显示变量 X1、X2、X3、X4 均保留在模型中,窗口的右侧按钮上方提示:移除X4,单击下一步按钮,剔除的变量 X3 所对应的行用红色表示,同时又得到提示:移除X3,单击下一步按钮,这样一直重复操作,直到 “下一步” 按钮变灰,表明逐步回归结束,此时得到的模型即为逐步回归最终的结果。
以指数结构函数作为回归模型的回归方法
代码如下:
%% 导入数据
clc,clear,close all
X0 = xlsread('logistic_ex1.xlsx','A2:C21'); % 前20家企业的三项评价指标值,即回归模型的输入
Y0 = xlsread('logistic_ex1.xlsx','D2:D21'); % 前20家企业的评估结果,即回归模型的输出
X1 = xlsread('logistic_ex1.xlsx','A2:C26'); % 预测数据输入
%% 逻辑函数
GM = fitglm(X0,Y0,'Distribution','binomial');
% 创建广义线性回归模型,分布选择'binomial',连接函数为:f(μ) = log(μ/(1–μ))
Y1 = predict(GM,X1);
% 预测使用测量的输入输出数据计算已识别模型的K步提前输出
%% 模型的评估
N0 = 1:size(Y0,1); % N0 = [1,2,3,4,……,20]
N1 = 1:size(Y1,1); % N1 = [1,2,3,4,……,25]
plot(N0',Y0,'-kd');
% N0'指的是对N0'进行转置,N0'和Y0的形式相同,该行代码绘制的是前20家企业的评估结果
% plot()中的参数'-kd'的解析:-代表直线,k代表黑色,d代表菱形符号
hold on;
scatter(N1',Y1,'b');
% 绘制散点图
% N1'指的是对N1'进行转置,N1'和Y1的形式相同
xlabel('企业编号');
ylabel('输出值');
运行结果: