4 摘要
本文要描述的是使用线形回归的方法,采用SAS这个经济分析工具做取数据预测,可能采用到的有SQLSERVER2000数据库,
5 关键词
2.1
回归分析:回归分析是将统计规则应用到两组成员中来确定其中一组影响另一组的程度。回归的目的是根据以前的经验提高我们预测从属变量下一次出现的能力。回归分析同时还是出现在一个公式中的两个变量的数学关系。其中一个变量可以通过我们以知的另一个变量来预测。将要被预测的变量称为从属变量(dependent variable),以知信息变量称为独立变量(independent variable)。变量之间的关系可以是线性的或是曲线的。
相关性:检验与之相关的程度。
斜率:一个完成回归等式的必要参数。
截距:一个完成回归的另一个必要参数。
残值:表示对y的预测值和y实际值之差,这种差异是由于画直线的需要而对y的值做的近似,该参数有助于计算预测方差。
X的方差:利用该值结合残值有助于计算预测方差。
置性度:用来创建回归线的实例数。
线形回归:如果在回归分析中函数的关系可以用在图象上的直线描述(在一个普通的X-Y坐标系中)或用一个简单的数学形式y=mx+b来表示。
6 问题定义
高速公路的营运收入与本地经济的发展密切相连,公司的重大决策之前,非常需要作出公司的预算估测。本地的GDP12和公司年数据比较如下:
本地的GDP(亿元) |
公司的营运收入(亿元) |
1300 |
480 |
1700 |
540 |
1880 |
551 |
1900 |
600 |
2000 |
660 |
2300 |
1500 |
2450 |
1080 |
2525 |
900 |
2870 |
1200 |
2890 |
1200 |
3500 |
1680 |
4100 |
1710 |
7 相关性分析
高速公路的营运收入和本地的经济发展之间存在着某种关系的想法听起来也是非常合理的。首先要做的事情是建立营运收入和本地GDP年增长量之间关联。这种关联,或者称为相关,用一个-1到1之间的数来表示。越接近1,相关性越高。因此,经济发展得越快,相应公司的营运收入也增长的快;越接近-1,则负的相关越高。如果存在负相关,那么经济发展越快,则收入越少。如果相关数为0,说明两者之间没有关系。现定这个系数为相关系数。
计算相关系数的公式如下(即x值和y值的方差被x和y的标准方差的乘积除):
r=cov(xy)/std(x)*std(y)
计算方差的公式如下:
cov(xy)=
计算标准方差的公式如下:
代入所有值可以得到以下结果:
r=295701/(759.75*436.02)=89%
8 回归线
在该分析中,独立变量是每年本地的GDP变化量。假设该值(x值)不受其他变量的影响。其表被转换成图形如下:
回归将在图中寻找尽可能靠近所有点的直线和该直线的斜率及截距。
如果a=截距,b=斜率,描述线形回归的公式如下:
y=bx+a
如果能计算a值和b值,那么给定当地的GDP(x值),就能得到想要预测的公司的营运收入(y值)。
9 斜率公式
计算斜率的公式为:
将数字代入上面公式得到下面结果:
b=[(12*33194100)-(29425*12090)]/(12*79079225)-29425
b=0.512
10 截距计算公式
a=1007.50-(0.512*2452.08)
代入公式的数:
a=-248
11 利用回归分析作预测
假设已经从别的渠道得到五年经济增长的预测,代入公式得出预测的营运收入:如表表示如下:
值得注意的是,这些预测是建立在现有的公司制度上的,如果公司制度管理有重大改变,那么预测就会有风险,
例如,公司最近有扩宽八车道的计划,将对预测值有很大的影响。
回归线的斜率和截距并不能说明图象的点与回归线的吻合程度。尽管相关系数可以反映各成员之间的关系,但是
需要一个公式来确定准确性:
12 使用SAS创建回归模型
SAS的强大功能是有很多强大的统计函数,,在处理回归分析中,是一个很强的工具。SAS提供下列函数完成下面计算
DATA abc;
1300 480
1700 540
1880 551
1900 600
2000 660
2300 1500
2450 1080
2525 900
2870 1200
2890 1200
3500 1680
4100 1710
;
OPTIONS LS=64 PS=12;
PROC PLOT;
INPUT x y;
CARDS;
RUN;
PROC CORR;
VAR x y;
RUN;
PROC REG;
MODEL y=x / R CLI CLM;
PLOT (U95. L95. P.)*x='-'
y*x='o' / OVERLAY;
OUTPUT OUT=aaa P=yhat R=yresid;
RUN;
PROC PLOT DATA=aaa;
PLOT yresid*yhat='R';
RUN;
运行后得到的结果是:
13 在关系数据库中应用回归
为了使回归分析的结果更有价值,我们把该算法应用到一个表中,使用sql语句从表中得到需要的变量的值是非常复杂的
下面的代码将演示如何利用sql来计算出回归系数:
set nocount on
create table tdist(df int,dist float)
insert into tdist value ()
insert into tdist value ()
insert into tdist value ()
insert into tdist value ()
go
create procedure usp_MakeElectricBillPrediction
@gdp float
as
declare @x float
declare @y float
declare @avgx float
declare @avgy float
declare @xy float
declare @x2 float
declare @y2 float
declare @support int
declare @dist float
declare @correlation float
declare @determination float
declare @slope float
declare @intercept float
declare @sx float
declare @sy float
declare @sxy float
declare @prediction float
select
@x=sum([gdp]),
@y=sum([income]),
@avgx=avg([gdp]),
@avgy=avg([income]),
@xy=sum([gdp]*[income]),
@x2=sum(square([gdp])),
@y2=sum(square([income]),
@suport=count(1)as suport
from gdpincome
set @slope=((@support*@xy)-(@x*@y))
/((@support*@x2-square(@x))
set @intercept=((@y/@support)-(@slope*@(@x/@support))
set @sxy=((@xy/@support)-(@avgx*@avgy)
set @sx=sqrt(abs(@x2/@support)-square(@avgx))
set @sy=sqrt(abs(@y2/@support)-square(@avgy))
set @correlation=@sxy/(@sx*@xy)
set @determination=square(@correlation)
if @dist is null
begin
select @dist =max(dist) from tdist
end
set @prediction=@intercept+(@gdp*@slpe)
select
@errx=sum(x-avgx)as err,
@erry=sum(y-avgy)as erry,
@residual=sum(square(y-(intercept*(slope*x)))
from gdpincome
set @error=(@tdist*@residual)*(square(@prediction-@avgx)/@errx)+1+(1/@support)
select
@correlation as correlation,
@support as support,
@slope as slope,
@intercept as intercept,
@prediction as income,
@error as plusorminus
这样回归分析就用sqlserver用户定义的函数,临时表,和游标完成,同样可以考虑创建一个COM+的中间层组件来计算
并返回斜率、截距和相关性。数据的问题留给组件,这样就不会占用和降低用在数据库引擎上的CPU周期,以保证起返回
查询需要的动力。
14使用表
把前一段计算出的内容存储在表中,其表结构如下:
create table regressionmodel(
id int,
correlation float,
slope float,
intercept float,
residual float,
errx float,
support int
)
一旦完成了回归计算,所有的数字都被嵌入模型中,随后的预测将简单地从表中查询值来构建生成预测的公式,下面是查询的示例:
select intercept*(slope*1500) as prediction
from regressionmodel
where id=10