利用MATLAB进行回归分析一、实验目的:1.了解回归分析的基本原理,掌握MATLAB实现的方法;2. 练习用回归分析解决实际问题。
二、实验内容:题目1社会学家认为犯罪与收入低、失业及人口规模有关,对20个城市的犯罪率y(每10万人中犯罪的人数)与年收入低于5000美元家庭的百分比1x、失业率2x和人口总数3x(千人)进行了调查,结果如下表。
(1)若1x~3x中至多只许选择2个变量,最好的模型是什么?(2)包含3个自变量的模型比上面的模型好吗?确定最终模型。
(3)对最终模型观察残差,有无异常点,若有,剔除后如何。
理论分析与程序设计:为了能够有一个较直观的认识,我们可以先分别作出犯罪率y与年收入低于5000美元家庭的百分比1x、失业率2x和人口总数x(千人)之间关系的散点图,根据大致分布粗略估计各因素造3成的影响大小,再通过逐步回归法确定应该选择哪几个自变量作为模型。
编写程序如下:clc;clear all;y=[11.2 13.4 40.7 5.3 24.8 12.7 20.9 35.7 8.7 9.6 14.5 26.9 15.736.2 18.1 28.9 14.9 25.8 21.7 25.7];%犯罪率(人/十万人)x1=[16.5 20.5 26.3 16.5 19.2 16.5 20.2 21.3 17.2 14.3 18.1 23.1 19.124.7 18.6 24.9 17.9 22.4 20.2 16.9];%低收入家庭百分比x2=[6.2 6.4 9.3 5.3 7.3 5.9 6.4 7.6 4.9 6.4 6.0 7.4 5.8 8.6 6.5 8.36.7 8.6 8.4 6.7];%失业率x3=[587 643 635 692 1248 643 1964 1531 713 749 7895 762 2793 741 625 854 716 921 595 3353];%总人口数(千人)figure(1),plot(x1,y,'*');figure(2),plot(x2,y,'*');figure(3),plot(x3,y,'*');X1=[x1',x2',x3'];stepwise(X1,y)运行结果与结论:犯罪率与低收入散点图犯罪率与失业率散点图犯罪率与人口总数散点图低收入与失业率作为自变量低收入与人口总数作为自变量失业率与人口总数作为自变量在图中可以明显看出前两图的线性程度很好,而第三个图的线性程度较差,从这个角度来说我们应该以失业率和低收入为自变量建立模型。
并且我们也可以从相关性角度来选取自变量,可以看出低收入与失业率作为自变量时的RMSE=4.64848;低收入与人口总数作为自变量时的RMSE=5.62245;失业率与人口总数作为自变量时的RMSE=5.04083。
我们看到当低收入与失业率作为自变量时RMSE 最小,因此如果选择两个变量作为自变量的会,它们是最适合的。
并且可以得到三者的关系为:1234.0725 1.22393 4.39894y x x =-++;对同时选取三个自变量的模型分析:如果我们将其三者同时选为自变量,我们发现RMSE=4.58978,比低收入与失业率二者作为自变量时稍微小了一点,不过我们也发现此时的X3系数为0.00076937,几乎为零,是可以忽略的,因此我们仍然选取两个自变量做最终的模型。
关系函数仍为:1234.0725 1.22393 4.39894y x x =-++低收入、失业率与人口总数都作为自变量残差分析:对我们设定的最终模型运用残差分析,编写程序如下:clc;clear all;y=[11.2 13.4 40.7 5.3 24.8 12.7 20.9 35.7 8.7 9.6 14.5 26.9 15.736.2 18.1 28.9 14.9 25.8 21.7 25.7];%犯罪率(人/十万人)x1=[16.5 20.5 26.3 16.5 19.2 16.5 20.2 21.3 17.2 14.3 18.1 23.1 19.124.7 18.6 24.9 17.9 22.4 20.2 16.9];%低收入家庭百分比x2=[6.2 6.4 9.3 5.3 7.3 5.9 6.4 7.6 4.9 6.4 6.0 7.4 5.8 8.6 6.5 8.36.7 8.6 8.4 6.7];%失业率x3=[587 643 635 692 1248 643 1964 1531 713 749 7895 762 2793 741 625 854 716 921 595 3353];%总人口数(千人)n=20;X2=[ones(n,1),x1',x2'];[b,bint,r,rint,s]=regress(y',X2);rcoplot(r,rint)运行结果如下:我们应该剔除第18、20组数据,剔除后,运行源程序得到新的结果如下:这时我们在重复本题开始时的做法,就可以得到最终的关系函数了。
剔除不符数据后再次运行程序得到结果那么最终的函数关系便为:1235.7095 1.60228 3.39259y x x =-++简要分析:从最终得到的结果上来看,失业率与低收入都将导致犯罪的上升。
通过本道例题让我们学会运用逐步回归命令stepwise 来分析多自变量情况下的最优模型问题,得到最优模型后,我们再运用残差法找到不符的数据,将其剔除,这样我们就会得到一个比较科学准确的关系式,这个思路对我们分析回归问题很有效。
题目2一家洗衣粉制造公司新产品实验时,关心洗衣粉泡沫的高度y 与搅拌程度X1和洗衣粉用量X2之间的关系,其中搅拌程度从弱到强分为3表12.30(1)将搅拌程度X1作为普通变量,建立y与X1和X2的回归模型,从残差图上发现问题。
(2)将搅拌程度X1视为没有定量关系的3个水平,用0-1变量表示,建立回归模型,与(1)比较,从残差图上还能发现什么问题。
(3)加入搅拌程度与洗衣粉用量的交互项,看看模型有无改进。
理论分析与程序设计:仿照题目1中的程序,我们对搅拌程度(当成普通变量)与洗衣粉用量建立回归模型,并且进行残差分析。
编写程序如下:clc;clear all;y=[28.1 32.3 34.8 38.2 43.5 65.3 67.7 69.4 72.2 76.9 82.2 85.3 88.190.7 93.6];%洗衣粉泡沫高度x1=[1 1 1 1 1 2 2 2 2 2 3 3 3 3 3];%搅拌程度x2=[6 7 8 9 10 6 7 8 9 10 6 7 8 9 10];%洗衣粉用量figure(1),plot(x1,y,'*');figure(2),plot(x2,y,'*');X1=[x1',x2'];stepwise(X1,y)运行结果如下:搅拌程度与泡沫高度关系洗衣粉用量与泡沫高度的关系我们还可以得到选取不同的变量时RMSE 的大小,为了让RMSE 最小,我们根据“Next step ”的提示,最后得到如下结果:从上图中可以看出当含有x1、x2两项时RMSE 最小,因此该模型建立为:1212.7426.3 3.08667y x x =-++编写程序进行残差分析:clc; clear all ;y=[28.1 32.3 34.8 38.2 43.5 65.3 67.7 69.4 72.2 76.9 82.2 85.3 88.1 90.7 93.6];%洗衣粉泡沫高度x1=[1 1 1 1 1 2 2 2 2 2 3 3 3 3 3]; %搅拌程度x2=[6 7 8 9 10 6 7 8 9 10 6 7 8 9 10]; %洗衣粉用量figure(1),plot(x1,y,'*'); figure(2),plot(x2,y,'*'); X1=[x1',x2']; stepwise(X1,y) n=15;X2=[ones(n,1),x1',x2'];[b,bint,r,rint,s]=regress(y',X2); rcoplot(r,rint)我们得到如下结果:说明中等搅拌程度的残差与其他不同。
将搅拌程度用0-1表示,泡沫高度关系分析:我们不妨设x0与x1共同表示搅拌程度,当(x0,x1)=(0,0)时,代表搅拌程度为1;当(x0,x1)=(0,1)时,代表搅拌程度为2;当(x0,x1)=(1,0)时,代表搅拌程度为3,我们就可以编写如下程序:clc;clear all;y=[28.1 32.3 34.8 38.2 43.5 65.3 67.7 69.4 72.2 76.9 82.2 85.3 88.190.7 93.6];%洗衣粉泡沫高度x0=[0 0 0 0 0 0 0 0 0 0 1 1 1 1 1];x1=[0 0 0 0 0 1 1 1 1 1 0 0 0 0 0];%搅拌程度x2=[6 7 8 9 10 6 7 8 9 10 6 7 8 9 10];%洗衣粉用量figure(1),plot(x0,y,'*');figure(2),plot(x1,y,'*');figure(3),plot(x2,y,'*');X1=[x0',x1',x2'];stepwise(X1,y)n=15;X2=[ones(n,1),x0',x1',x2'];[b,bint,r,rint,s]=regress(y',X2); rcoplot(r,rint)运行结果与分析:Y与x1关系散点图Y与x2关系散点图Y与x3关系散点图将搅拌程度改为0-1后的运行结果可以看出当RMSE 最小时含有x0、x1、x2项,此时的函数关系式为:01210.686752.634.92 3.08667y x x x =+++接下来我们看一下残差分析结果:我们发现第5组数据应该剔除,剔除后再次运行程序,得到如下结果:而这时回归结果显示:这时的函数关系为:01211.6653.18435.504 2.892y x x x =+++将交互项考虑进来分析:改写程序如下:clc;clear all;y=[28.1 32.3 34.8 38.2 43.5 65.3 67.7 69.4 72.2 76.9 82.2 85.3 88.190.7 93.6];%洗衣粉泡沫高度x1=[1 1 1 1 1 2 2 2 2 2 3 3 3 3 3];%搅拌程度x2=[6 7 8 9 10 6 7 8 9 10 6 7 8 9 10];%洗衣粉用量figure(1),plot(x1,y,'*');figure(2),plot(x2,y,'*');X1=[x1',x2',(x1.*x2)'];stepwise(X1,y)n=15;X2=[ones(n,1),x1',x2',(x1.*x2)'];[b,bint,r,rint,s]=regress(y',X2);rcoplot(r,rint)clc;clear all;y=[28.1 32.3 34.8 38.2 43.5 65.3 67.7 69.4 72.2 76.9 82.2 85.3 88.190.7 93.6];%洗衣粉泡沫高度x0=[0 0 0 0 0 0 0 0 0 0 1 1 1 1 1];x1=[0 0 0 0 0 1 1 1 1 1 0 0 0 0 0];%搅拌程度x2=[6 7 8 9 10 6 7 8 9 10 6 7 8 9 10];%洗衣粉用量figure(1),plot(x0,y,'*');figure(2),plot(x1,y,'*');figure(3),plot(x2,y,'*');X1=[x0',x1',x2' ,(x1.*x2)',(x1.*x0)',(x0.*x2)'];stepwise(X1,y)n=15;X2=[ones(n,1),x0',x1',x2' ,(x1.*x2)',(x1.*x0)',(x0.*x2)'];[b,bint,r,rint,s]=regress(y',X2);rcoplot(r,rint)运行程序:将搅拌程度为普通变量的运行结果将搅拌程度改为0-1后的运行结果我们发现对于把搅拌程度当做普通变量时交互项没有对函数起到改进的作用,函数仍为:1212.7426.3 3.08667y x x =-++但当把搅拌程度作为0-1表示时,交互项会改进函数,新函数为0121*212.366752.8839.4833 2.841670.601667y x x x x x =+++-简要分析:其实做这种题的思路都是相同的,只不过由于数据之间的复杂关系,让我们得到结论的难易程度不一。