多元线性回归是指在一个多维特征空间中,通过线性模型来拟合输入特征与输出之间的关系。多元线性回归的数学表达式为:
y = β0 + β1x1 + β2x2 + … + βnxn + ε
其中,y为输出变量,x1, x2, …, xn为输入变量,β0, β1, β2, …, βn为回归系数,ε为误差项。通过最小化误差项的平方和来确定回归系数的值,通常使用最小二乘法来求解。
多元线性回归可以用于解决多个自变量对因变量的影响问题,它可以用于预测和建立变量之间的关系模型。多元线性回归还可以用于探索不同自变量对因变量的影响程度,并进行变量选择和模型优化。
多元线性回归的优点包括简单易用、计算速度快、可解释性强等,但也存在一些限制,如对数据的线性关系假设、对误差项的独立性和同方差性假设等。此外,多元线性回归还可能受到共线性、过拟合等问题的影响。
为了确保多元线性回归的结果可靠,通常需要进行模型的诊断和评估,如检验回归系数的显著性、检验模型的拟合优度、检验残差的正态性等。
MATLAB的代码实现如下:
clc
clear
close all
%% 导入数据
load('APA.mat')
load('DOP_ann_100_interp2.mat')
load('excess_phosphate_upper_100.mat')
load('average_PAR_in_mld.mat')
load('chlor_a_ann_interp2.mat')
%% 将二维数据转变为一维
Y=APA_upper_100(:)
x1=average_PAR_in_mld(:)
x2=chlor_a_ann_interp2(:)
x3=DOP_ann_100_interp2(:)
x4=excess_phosphate_upper_100(:)
%% 提取非缺失值
nanid=~isnan(Y)
Y=Y(nanid)
x1=x1(nanid)
x2=x2(nanid)
x3=x3(nanid)
x4=x4(nanid)
x=[x1 x2 x3 x4]
y=Y
%% 建立回归模型
X = [ones(size(x1)) x1 x2 x3 x4 x1.*x2 x1.*x1];%构造自变量矩阵
[b,bint,r,rint,stats] = regress(y,X) %进行回归求解
YFIT = b(1) + b(2)*x1 + b(3)*x2 +b(4)*x3+b(5)*x4 +b(6)*x1.*x2+b(7)*x1.*x1;%自定义回归方程
n=1:1:604
plot(n,y,'-','linewidth',1.2)
hold on
plot(n,YFIT,'--','linewidth',1.2)
legend('真实值','预测值')
s=xlswrite('result.xlsx',YFIT);%将预测值写入excel
function [ b, bint, r, rint, stats ] = Multiple_linear_regression( X,y,alpha )
%Multiple_linear_regression 多元线性回归
%对于输入数据(必须是去除量纲之后的数据)进行多元线性回归处理
% 输入变量
% X:由自变量组成的矩阵(第一列必须全为1)
% y:因变量(列向量)
% alpha:显著性水平(缺省时默认为0.05)
% 若X中两个原本全为变量,需第一列加上1,作为最后常数项的系数预测
% 输出变量
% b为线性回归模型Y = X*B回归系数(即斜率参数)第一个是常数项系数
% bint为b的置信区间(按行显示)
% r为残差(实际值与拟合值的差)
% rint为残差的置信区间
% stats包含如下四个统计量
% R^2统计量(越接近1,变量的线性相关性越强,说明模型有效)
% F统计量
% F(1,n-2)分布大于F的概率p值(显著性水平,判断原始假设是否正确的重要证据)
% 剩余方差s^2(主要用来比较模型是否有改进,越小则模型精度越高)
X = [ones(size(y)),X];
[b, bint, r, rint, stats] = regress(y,X,alpha);
if stats(3)<0.01
disp('F(1,n-2)分布大于F的概率p值为:');
disp( stats(3) );
disp('p值很小(P<0.001),说明拟合模型有效');
else
disp('p值较大(P>0.001),说明拟合模型效果不好');
end
%% 画出拟合效果图
figure
y_fitting = X*b;
t = 1:length(y);
plot(t,y_fitting,'r-',t,y,'b-',t,abs(y_fitting-y),'k-');
legend({'红——拟合值','蓝——实际值','黑——误差值'},'fontsize',12,'Location','NorthWest');
xlabel('点的序号','fontsize',12);
ylabel('y对应的值','fontsize',12);
set(gca, 'XGrid','on'); % X轴的网格
set(gca, 'YGrid','on'); % Y轴的网格
end