1. 利用matlab进行趋势面分析并绘图
%% 方法1 仅二次趋势面模型
clc;clear;
num = xlsread("G:\Data\灾损曲线\趋势面分析-数据.xlsx",'B21:N37');
volume = num(:,1);
magnitude = num(:,3);
pop = num(:,8);
gdp = num(:,13);
% 绘制三维散点图
scatter3(volume, magnitude, gdp,'filled')
hold on;
% 估计模型,得到估计参数
v2 = volume.^2;
m2 = magnitude.^2;
vm = volume.*magnitude;
X = [ones(length(volume),1) volume magnitude v2 vm m2];
[b,bint,r,rint,stats] = regress(gdp,X,95);
% 生成格点经纬度,计算预测值
xfit = min(volume):0.1:max(volume);
yfit = min(magnitude):0.1:max(magnitude);
[XFIT,YFIT]= meshgrid (xfit,yfit);
ZFIT = b(1) + b(2) * XFIT + b(3) * YFIT + b(4) * XFIT.^2 + b(5) * XFIT .* YFIT + b(6) * YFIT.^2;
% 绘制拟合曲面
mesh(XFIT,YFIT,ZFIT);
clc;clear;
num = xlsread("G:\Data\灾损曲线\趋势面分析-数据.xlsx",'B21:N37');
volume = num(:,1);
magnitude = num(:,3);
pop = num(:,8);
gdp = num(:,13);
% 绘制三维散点图
scatter3(volume, magnitude, gdp,'filled')
hold on;
% 估计模型,得到估计参数
v2 = volume.^2;
m2 = magnitude.^2;
vm = volume.*magnitude;
X = [ones(length(volume),1) volume magnitude v2 vm m2];
[b,bint,r,rint,stats] = regress(gdp,X,95);
% 生成格点经纬度,计算预测值
xfit = min(volume):0.1:max(volume);
yfit = min(magnitude):0.1:max(magnitude);
[XFIT,YFIT]= meshgrid (xfit,yfit);
ZFIT = b(1) + b(2) * XFIT + b(3) * YFIT + b(4) * XFIT.^2 + b(5) * XFIT .* YFIT + b(6) * YFIT.^2;
% 绘制拟合曲面
mesh(XFIT,YFIT,ZFIT);
%% 方法2 一次、二次及三次趋势面模型
% 文件信息读入
clc;clear;
num = xlsread("G:\Data\灾损曲线\趋势面分析-数据.xlsx",'B21:N37');
volume = num(:,1);
magnitude = num(:,3);
pop = num(:,8);
gdp = num(:,13);
opoX=num(:,1);
opoY=num(:,3);
oPH=num(:,13);
% oOM=info(:,4);
% oTN=info(:,5);
%{
% 2S法计算异常值
mPH=mean(oPH);
sPH=std(oPH);
num2=find(oPH>(mPH+2*sPH)|oPH<(mPH-2*sPH));
% 异常值剔除
PH=oPH;
for i=1:length(num2)
n=num2(i,1);
PH(n,:)=[0];
end
PH(all(PH==0,2),:)=[];
poX=opoX;
for i=1:length(num2)
n=num2(i,1);
poX(n,:)=[0];
end
poX(all(poX==0,2),:)=[];
poY=opoY;
for i=1:length(num2)
n=num2(i,1);
poY(n,:)=[0];
end
poY(all(poY==0,2),:)=[];
%}
cpoX = opoX;
cpoY = opoY;
cPH = oPH;
% 最小二乘法求解预处理
inva1=[ones(size(cpoX)),cpoX,cpoY]; %一次拟合求解
inva2=[ones(size(cpoX)),cpoX.^2,cpoY.^2,cpoX.*cpoY,cpoX,cpoY]; % 二次拟合求解
inva3=[ones(size(cpoX)),cpoX.^3,cpoY.^3,(cpoX.^2).*cpoY,cpoX.*(cpoY.^2),cpoX.^2,cpoY.^2,cpoX.*cpoY,cpoX,cpoY]; % 三次拟合求解
% 最小二乘法求解
[coef1,bint1,r1,rint1,stats1]=regress(cPH,inva1);
[coef2,bint2,r2,rint2,stats2]=regress(cPH,inva2);
[coef3,bint3,r3,rint3,stats3]=regress(cPH,inva3);
% 趋势面法效果图绘制准备
npoX=min(cpoX):0.1:max(cpoX);
npoY=min(cpoY):0.1:max(cpoY);
[mnpX,mnpY]=meshgrid(npoX,npoY);
% 趋势面法插值
pPH1=coef1(1,:)+coef1(2,:)*mnpX+coef1(3,:)*mnpY;
pPH2=coef2(1,:)+coef2(2,:)*mnpX.^2+coef2(3,:)*mnpY.^2+coef2(4,:)*mnpX.*mnpY+coef2(5,:)*mnpX+coef2(6,:)*mnpY;
pPH3=coef3(1,:)+coef3(2,:)*mnpX.^3+coef3(3,:)*mnpY.^3+coef3(4,:)*(mnpX.^2).*mnpY+coef3(5,:)*mnpX.*(mnpY.^2)+coef3(6,:)*mnpX.^2+coef3(7,:)*mnpY.^2+coef3(8,:)*mnpX.*mnpY+coef3(9,:)*mnpX+coef3(10,:)*mnpY;
% 趋势面法效果图绘制
figure();
subplot(1,3,1);
scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');
hold on;
mesh(mnpX,mnpY,pPH1);
colormap(jet);
colorbar;
xlabel('暴雨量(mm)'); % 为X轴加标签
ylabel('暴雨强度(mm/d)'); % 为Y轴加标签
zlabel('直接经济损失(亿元)'); % 为z轴加标签
title('一次趋势面模型');
subplot(1,3,2);
scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');
hold on;
mesh(mnpX,mnpY,pPH2);
colormap(jet);
colorbar;
xlabel('暴雨量(mm)'); % 为X轴加标签
ylabel('暴雨强度(mm/d)'); % 为Y轴加标签
zlabel('直接经济损失(亿元)'); % 为z轴加标签
title('二次趋势面模型');
subplot(1,3,3);
scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');
colormap(jet);
colorbar;
hold on;
mesh(mnpX,mnpY,pPH3);
colormap(jet);
colorbar;
xlabel('暴雨量(mm)'); % 为X轴加标签
ylabel('暴雨强度(mm/d)'); % 为Y轴加标签
zlabel('直接经济损失(亿元)'); % 为z轴加标签
title('三次趋势面模型');
clc;clear;
num = xlsread("G:\Data\灾损曲线\趋势面分析-数据.xlsx",'B21:N37');
volume = num(:,1);
magnitude = num(:,3);
pop = num(:,8);
gdp = num(:,13);
opoX=num(:,1);
opoY=num(:,3);
oPH=num(:,8);
% oOM=info(:,4);
% oTN=info(:,5);
%{
% 2S法计算异常值
mPH=mean(oPH);
sPH=std(oPH);
num2=find(oPH>(mPH+2*sPH)|oPH<(mPH-2*sPH));
% 异常值剔除
PH=oPH;
for i=1:length(num2)
n=num2(i,1);
PH(n,:)=[0];
end
PH(all(PH==0,2),:)=[];
poX=opoX;
for i=1:length(num2)
n=num2(i,1);
poX(n,:)=[0];
end
poX(all(poX==0,2),:)=[];
poY=opoY;
for i=1:length(num2)
n=num2(i,1);
poY(n,:)=[0];
end
poY(all(poY==0,2),:)=[];
%}
cpoX = opoX;
cpoY = opoY;
cPH = oPH;
% 最小二乘法求解预处理
inva1=[ones(size(cpoX)),cpoX,cpoY]; %一次拟合求解
inva2=[ones(size(cpoX)),cpoX.^2,cpoY.^2,cpoX.*cpoY,cpoX,cpoY]; % 二次拟合求解
inva3=[ones(size(cpoX)),cpoX.^3,cpoY.^3,(cpoX.^2).*cpoY,cpoX.*(cpoY.^2),cpoX.^2,cpoY.^2,cpoX.*cpoY,cpoX,cpoY]; % 三次拟合求解
% 最小二乘法求解
[coef1,bint1,r1,rint1,stats1]=regress(cPH,inva1);
[coef2,bint2,r2,rint2,stats2]=regress(cPH,inva2);
[coef3,bint3,r3,rint3,stats3]=regress(cPH,inva3);
% 趋势面法效果图绘制准备
npoX=min(cpoX):0.1:max(cpoX);
npoY=min(cpoY):0.1:max(cpoY);
[mnpX,mnpY]=meshgrid(npoX,npoY);
% 趋势面法插值
pPH1=coef1(1,:)+coef1(2,:)*mnpX+coef1(3,:)*mnpY;
pPH2=coef2(1,:)+coef2(2,:)*mnpX.^2+coef2(3,:)*mnpY.^2+coef2(4,:)*mnpX.*mnpY+coef2(5,:)*mnpX+coef2(6,:)*mnpY;
pPH3=coef3(1,:)+coef3(2,:)*mnpX.^3+coef3(3,:)*mnpY.^3+coef3(4,:)*(mnpX.^2).*mnpY+coef3(5,:)*mnpX.*(mnpY.^2)+coef3(6,:)*mnpX.^2+coef3(7,:)*mnpY.^2+coef3(8,:)*mnpX.*mnpY+coef3(9,:)*mnpX+coef3(10,:)*mnpY;
% 趋势面法效果图绘制
figure();
subplot(1,3,1);
scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');
hold on;
mesh(mnpX,mnpY,pPH1);
colormap(jet);
colorbar;
xlabel('暴雨量(mm)'); % 为X轴加标签
ylabel('暴雨强度(mm/d)'); % 为Y轴加标签
zlabel('受灾人口(万人)'); % 为z轴加标签
title('一次趋势面模型');
subplot(1,3,2);
scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');
hold on;
mesh(mnpX,mnpY,pPH2);
colormap(jet);
colorbar;
xlabel('暴雨量(mm)'); % 为X轴加标签
ylabel('暴雨强度(mm/d)'); % 为Y轴加标签
zlabel('受灾人口(万人)'); % 为z轴加标签
title('二次趋势面模型');
subplot(1,3,3);
scatter3(cpoX,cpoY,cPH,'MarkerEdgeColor','k');
colormap(jet);
colorbar;
hold on;
mesh(mnpX,mnpY,pPH3);
colormap(jet);
colorbar;
xlabel('暴雨量(mm)'); % 为X轴加标签
ylabel('暴雨强度(mm/d)'); % 为Y轴加标签
zlabel('受灾人口(万人)'); % 为z轴加标签
title('三次趋势面模型');
2. 三种模型精度检验
% 验证集筛选
PH = oPH;
poX = opoX;
poY = opoY;
very=[randperm(length(PH),floor(length(PH)*0.2))]';
% 验证集剔除
cPH=PH;
vPH=zeros(length(very),1);
vpoX=vPH;
vpoY=vPH;
for i=1:length(very)
m=very(i,1);
vPH(i,:)=cPH(m,:);
cPH(m,:)=[0];
end
cPH(all(cPH==0,2),:)=[];
cpoX=poX;
for i=1:length(very)
m=very(i,1);
vpoX(i,:)=cpoX(m,:);
cpoX(m,:)=[0];
end
cpoX(all(cpoX==0,2),:)=[];
cpoY=poY;
for i=1:length(very)
m=very(i,1);
vpoY(i,:)=cpoY(m,:);
cpoY(m,:)=[0];
end
cpoY(all(cpoY==0,2),:)=[];
% 趋势面法精度对比
vpPH1=coef1(1,:)+coef1(2,:)*vpoX+coef1(3,:)*vpoY;
MEERan1=mean(vPH-vpPH1);
MEERan11=mean(abs(vpPH1-vPH));
RMSEan1=sqrt(sum(vpPH1-vPH).^2/length(vPH));
COCOan1=corrcoef(vpPH1,vPH);
vpPH2=coef2(1,:)+coef2(2,:)*vpoX.^2+coef2(3,:)*vpoY.^2+coef2(4,:)*vpoX.*vpoY+coef2(5,:)*vpoX+coef2(6,:)*vpoY;
MEERan2=mean(vPH-vpPH2);
MEERan21=mean(abs(vpPH2-vPH));
RMSEan2=sqrt(sum(vpPH2-vPH).^2/length(vPH));
COCOan2=corrcoef(vpPH2,vPH);
vpPH3=coef3(1,:)+coef3(2,:)*vpoX.^3+coef3(3,:)*vpoY.^3+coef3(4,:)*(vpoX.^2).*vpoY+coef3(5,:)*vpoX.*(vpoY.^2)+coef3(6,:)*vpoX.^2+coef3(7,:)*vpoY.^2+coef3(8,:)*vpoX.*vpoY+coef3(9,:)*vpoX+coef3(10,:)*vpoY;
MEERan3=mean(vPH-vpPH3);
MEERan31=mean(abs(vpPH3-vPH));
RMSEan3=sqrt(sum(vpPH3-vPH).^2/length(vPH));
COCOan3=corrcoef(vpPH3,vPH);
% 验证集筛选
PH = oPH;
poX = opoX;
poY = opoY;
very=[randperm(length(PH),floor(length(PH)*0.2))]';
% 验证集剔除
cPH=PH;
vPH=zeros(length(very),1);
vpoX=vPH;
vpoY=vPH;
for i=1:length(very)
m=very(i,1);
vPH(i,:)=cPH(m,:);
cPH(m,:)=[0];
end
cPH(all(cPH==0,2),:)=[];
cpoX=poX;
for i=1:length(very)
m=very(i,1);
vpoX(i,:)=cpoX(m,:);
cpoX(m,:)=[0];
end
cpoX(all(cpoX==0,2),:)=[];
cpoY=poY;
for i=1:length(very)
m=very(i,1);
vpoY(i,:)=cpoY(m,:);
cpoY(m,:)=[0];
end
cpoY(all(cpoY==0,2),:)=[];
% 趋势面法精度对比
vpPH1=coef1(1,:)+coef1(2,:)*vpoX+coef1(3,:)*vpoY;
MEERan1=mean(vPH-vpPH1);
MEERan11=mean(abs(vpPH1-vPH));
RMSEan1=sqrt(sum(vpPH1-vPH).^2/length(vPH));
COCOan1=corrcoef(vpPH1,vPH);
vpPH2=coef2(1,:)+coef2(2,:)*vpoX.^2+coef2(3,:)*vpoY.^2+coef2(4,:)*vpoX.*vpoY+coef2(5,:)*vpoX+coef2(6,:)*vpoY;
MEERan2=mean(vPH-vpPH2);
MEERan21=mean(abs(vpPH2-vPH));
RMSEan2=sqrt(sum(vpPH2-vPH).^2/length(vPH));
COCOan2=corrcoef(vpPH2,vPH);
vpPH3=coef3(1,:)+coef3(2,:)*vpoX.^3+coef3(3,:)*vpoY.^3+coef3(4,:)*(vpoX.^2).*vpoY+coef3(5,:)*vpoX.*(vpoY.^2)+coef3(6,:)*vpoX.^2+coef3(7,:)*vpoY.^2+coef3(8,:)*vpoX.*vpoY+coef3(9,:)*vpoX+coef3(10,:)*vpoY;
MEERan3=mean(vPH-vpPH3);
MEERan31=mean(abs(vpPH3-vPH));
RMSEan3=sqrt(sum(vpPH3-vPH).^2/length(vPH));
COCOan3=corrcoef(vpPH3,vPH);
3. 储存趋势面结果
% 趋势面法导出ASCII
save G:\Data\灾损曲线\liner_shp.txt pPH1 -ASCII;
save G:\Data\灾损曲线\Quadratic_shp.txt pPH2 -ASCII;
save G:\Data\灾损曲线\Cubic_shp.txt pPH3 -ASCII;
4. 结果记录
(1)直接经济损失拟合
RMSEan1=37.10 % 一次模型
MEERan11=21.5907
RMSEan2=34.80 % 二次模型
MEERan21=20.0930
RMSEan3=63.77 % 三次模型
MEERan31=36.8192
回归系数:
一次:coef1 = [-88.5130 2.1612 0.2825]
y = A+Bx+Cy
二次:coef2 = [2241.2 0.034084 1.7247 0.064554 -3.7023 -124.28]
y = A+Bx2+Cy2+Dxy+Ex+Fy
三次:coef3=[66267 -0.0042412 -1.8165 0.054876 0.18461 -1.16 185.76 -19.209 403.54 -6147.9]
y = A+Bx3+Cy3+Dx2y+Exy2+Fx2+Gy2+Hxy+Ix+Jy
(2)受灾人口拟合
RMSEan1=13.7724 % 一次模型
MEERan11=49.6338
RMSEan2=2.4228 % 二次模型
MEERan21=21.2086
RMSEan3=6.5534 % 三次模型
MEERan31=8.5753
回归系数:
一次:coef1 = [-74.208 2.6432 0.97359]
y = A+Bx+Cy
二次:coef2 = [1038 0.11192 1.1631 -0.44552 6.6042 -63.551]
y = A+Bx2+Cy2+Dxy+Ex+Fy
三次:coef3=[-32935 0.0021481 -0.77281 -0.11804 1.6544 3.98 20.577 -105.1 1650.5 1173.7]
y = A+Bx3+Cy3+Dx2y+Exy2+Fx2+Gy2+Hxy+Ix+Jy
(3)农作物受灾面积拟合
RMSEan1=15.2809 % 一次模型
MEERan11=14.2062
RMSEan2=13.5684 % 二次模型
MEERan21=7.8337
RMSEan3=6.5534 % 三次模型
MEERan31=3.8697
回归系数:
一次:coef1 = [-93.278 1.2344 1.9453]
y = A+Bx+Cy
二次:coef2 = [1842.9 0.028401 1.5173 -0.017423 -1.0754 -104.62]
y = A+Bx2+Cy2+Dxy+Ex+Fy
三次:coef3=[-20685 -0.0012011 0.24522 -0.012544 0.27819 0.66217 -35.113 -18.195 283.95 1525.8]
y = A+Bx3+Cy3+Dx2y+Exy2+Fx2+Gy2+Hxy+Ix+Jy
二次拟合模型最好