灰色系统模型GM(1,1)的R语言实现


1、建模

##建立灰色模型GM(1,1)对应的函数

##x表示原始数据数列,k表示数据个数

gm11<-function(x,k)
{
n<-length(x)
x1<-numeric(n);
for(i in 1:n)   ##一次累加
{
x1[i]<-sum(x[1:i]);
}
b<-numeric(n)
m<-n-1
for(j in 1:m)
{
b[j+1]<-(0.5*x1[j+1]+0.5*x1[j])   ##紧邻均值生成
}
Yn=t(t(x[2:n]))                   ##构造Yn矩阵
B<-matrix(1,nrow=n-1,ncol=2)      
B[,1]<-t(t(-b[2:n]))              ##构造B矩阵
A<-solve(t(B)%*%B)%*%t(B)%*%Yn;   ##使用最小二乘法求得灰参数a,u
a<-A[1];
u<-A[2];
x2<-numeric(k);
x2[1]<-x[1];
for(i in 1:k-1)
{
x2[1+i]=(x[1]-u/a)*exp(-a*i)+u/a;
}
x2=c(0,x2);
y=diff(x2);                     ##累减生成,获得预测数据数列
y
}



##x1原始数据数列,x2是预测数据数列

x1<-x

x2<-gm11(x,length(x))


##检验模型精度

acc<-function(x1,x2)
{
     n<-length(x1);
     sum1=0;
     for(k in 2:n-1)
     {
            sum1<-sum1+(x1[k]-x1[1]);
     }
     s1<-sum1+0.5*(x1[n]-x1[1]);
     sum2=0;
     for(k in 2:n-1)
     {
            sum2<-sum2+(x2[k]-x2[1]);
     }
     s2<-sum2+0.5*(x2[n]-x2[1]);
     abs1<-abs(s1)
     abs2<-abs(s2)
     abs12<-abs(s1-s2)
     ee<-(1+abs1+abs2)/(1+abs1+abs2+abs12)
     ee
}



2、应用:预测2013年和2014年全国规模以上快递企业收入


##x数列是2008年-2012年全国规模以上快递企业收入数据(来源:国家邮政局,单位:亿元)


> x<-c(408.40,479.00,574.60,758.00,1055.30)   
> gm11(x,7)
[1]  408.4000  443.1355  585.3243  773.1370 1021.2131 1348.8894 1781.7069
> x1<-x
> x2<-gm11(x,length(x))
> acc(x1,x2)
[1] 0.9851449



预测结果:预计2013、2014年全国规模以上快递企业收入分别为1349亿元、1782亿元

灰色绝对关联度为0.9851449,即关联度为一级,预测精度为优




你可能感兴趣的:(R语言)