【数学建模】regress()函数进行回归分析| 美国人口预测

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

这两周学校对研究生进行数学建模培训…虽然我在本科时参加过,但是matlab使用的经验过于生疏,所以新开几贴用来记录学到的数学编程知识。


提示:以下是本篇文章正文内容,下面案例可供参考

一、前提知识

提示:以下是预备知识,大佬可跳过

1.如何写入一个矩阵,例:

x=[1,2;4,5;7,8]  %表示一个3*2矩阵

2.获取矩阵的维度信息,例:

x=[1,2;4,5;7,8]  %表示一个3*2矩阵
d=size(x)

最后结果:
在这里插入图片描述

当然也可以使用size(x,1),size(x,2),用以获取矩形第1维度或第2维度的信息

x=[1,2;4,5;7,8]  %表示一个3*2矩阵
d=size(x,1)  %获取矩形第一个维度的信息,这里是长,返回3

3.生成全一矩阵ones()。
具体用法如下:

x=ones(3) %生成3*3矩阵
x=ones(31) %生成3*1矩阵

二、regress()函数进行回归分析

2.1.regress函数定义

首先,什么是回归分析。百度定义如下:在统计学中,回归分析(regression analysis)指的是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。回归分析按照涉及的变量的多少,分为一元回归和多元回归分析;按照因变量的多少,可分为简单回归分析和多重回归分析;按照自变量和因变量之间的关系类型,可分为线性回归分析和非线性回归分析。

其实简单的说,可以如此理解:给了你一组自变量的数据(有可能是多个未知数,如X1,X2…0),然后给了你一组因变量,同时给了你一个自变量和因变量之间的函数关系,例如: y = a + b x y=a+bx y=a+bx;此时就需要你使用regress()函数求解出各变量的系数。

看例子就明白regress函数如何使用了。
提示:以下代码是用的最多的一个版本

[b,BINT,R,RINT,STATS] = regress(Y,X)

函数功能解释:
1)在使用regress函数时,Y和X一定要是列向量,在导入的时候一定要转为列向量(很多题一般给的数据都是行向量)
2)参数b就是求出的对应参数值
3)其他先不管(偷懒)

2.2.经典例子——美国人口预测

首先看第一个经典例子,美国人口的估计的问题。

1790-1980年间美国每隔10年的人口记录如下表所示。

在这里插入图片描述

1.试用以上数据建立马尔萨斯(Malthus)人口指数增长模型,并对接下来的每隔十年预测五次人口数量,并查阅实际数据进行比对分析。
2.如果数据不相符,再对以上模型进行改进,寻找更为合适的模型进行预测,并对两次预测结果进行对比分析。(阻滞增长模型)

2.3.问题一解答

代码如下(示例):

x=[3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,...
106.5,123.2,131.7,150.7,179.3,204.0,226.5]';
n=20;
xx=x(1:n);%1790年到1980年数据  %得到一组纵坐标数据
t=[ones(n,1),(1790:10:1980)'];
y=log(xx(1:n));
[b,bint,r,rint,stats]=regress(y,t);
RR=stats(1);%复相关系数
F=stats(2);%F统计量值
prob=stats(3); % 概率
x0=exp(b(1)); %参数x0; 
r=b(2); %参数r
py=x0*exp(r*t(:,2)); %预测数据
err=xx-py;
rmse=sqrt(sum(err.^2)/n); %均方误差根
plot(1790:10:1980,xx,'*',1790:10:1980,py); %作对比图  %同时画两张图,其中第一个为*
xlabel('年份');
ylabel('人数(百万人)');

代码如下(示例):这道题使用的马尔萨斯模型解题,原理如下图:

在这里插入图片描述

由上图可知,我们这次回归分析主要是估计参数a和r的值,从 y=a+rt可以看出,构成的“基”是1和t,所以regress(y,t)中的t应该就有两部分组成:

t=[ones(n,1),(1790:10:1980)'];

并且注意那一票,表明矩阵已经转置。
通过回归分析即可得到参数a和r的值。最后马尔萨斯公式为
在这里插入图片描述
拟合数据与真实数据进行对比:
在这里插入图片描述
可以看出在1860年后数据出现明显偏差。

2.4.问题二解答

相似的方法完成第二题,不过这里不是regress函数,而是nlinfit函数(regress进行线性回归分析,nlinfit进行非线性回归分析)
在这里插入图片描述

%美国人口模型,阻滞型增长模型
x=[3.9,5.3,7.2,9.6,12.9,17.1,23.2,31.4,38.6,50.2,62.9,76.0,92.0,...
106.5,123.2,131.7,150.7,179.3,204.0,226.5]';
n=length(x);
y=x(1:n);%1790年到1980年数据
t=(1:n)';
beta0=[5.3,0.22,400]; %[x0,r,xm]
[beta,R,J]=nlinfit(t,y,'logisfun',beta0);
%R为残差,beta为待求参数
py=beta(3)./(1+(beta(3)/beta(1)-1)*exp(-beta(2)*t));%预测各年人口
p21=beta(3)./(1+(beta(3)/beta(1)-1)*exp(-beta(2)*21));
p22=beta(3)./(1+(beta(3)/beta(1)-1)*exp(-beta(2)*22));
p23=beta(3)./(1+(beta(3)/beta(1)-1)*exp(-beta(2)*23));
p24=beta(3)./(1+(beta(3)/beta(1)-1)*exp(-beta(2)*24));
p25=beta(3)./(1+(beta(3)/beta(1)-1)*exp(-beta(2)*25));
rmse=sqrt(sum(R.^2)/n); %均方误差根
plot(1790:10:1980,y,'*',1790:10:1980,py); %作对比图
xlabel('年份');
ylabel('人数(百万人)');
function yt=logfun(beta,x)
yt=beta(3)./(1+(beta(3)./beta(1)-1).*exp(-beta(2)*x));

在这里插入图片描述

拟合数据与真实数据进行对比:
在这里插入图片描述
从图上可以看出误差较小。

  • 1
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值