灰色线性回归组合预测模型及R语言实现

本文详细介绍了灰色线性回归组合模型的构建过程,包括GM(1,1)模型、线性回归模型以及两者的组合模型。通过数据的累加处理、紧邻均值序列计算、参数求解等步骤,建立适用于非负序列的预测模型。模型的精度通过后验差比值和小误差概率进行检验,以确保预测的准确性。同时,给出了R语言实现的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 概述

灰色线性回归组合模型可以改善线性回归模型中不含指数增长及GM(1,1)模型中不含线性因素的状况,

该组合既适合于具有指数增长趋势的序列又适合于具有线性趋势的序列。利用了这两个单一模型的有用信息,克服各自的缺陷,从而提高模型预测的精确度。

2 建模步骤

在这里插入图片描述

2.1 GM(1,1)预测模型的构建

GM(1,1)预测模型的构建详细见:灰色预测 GM(1,1) 模型及R语言实现

若数据序列通过GM(1,1)模型方法的可行性检验

设原始序列 X ( 0 ) = ( x ( 0 ) ( 1 ) , x 0 ( 2 ) , . . . , x 0 ( n ) ) X^{\left( 0 \right)}=\left( x^{\left( 0 \right)}\left( 1 \right) ,x^0\left( 2 \right) ,...,x^0\left( n \right) \right) X(0)=(x(0)(1),x0(2),...,x0(n))满足上述条件,其中 x ( 0 ) ( k ) ≥ 0 x^{\left( 0 \right)}\left( k \right) \ge 0 x(0)(k)0

(1)序列的累加处理
将原始序列进行一次累加生成后处理后,生成 X ( 0 ) X^{\left( 0 \right)} X(0)的1-AGO 序列 (累加生成序列):
X ( 1 ) = ( x ( 1 ) ( 1 ) , x ( 1 ) ( 2 ) , . . . , x ( 1 ) ( n ) ) X^{\left( 1 \right)}=\left( x^{\left( 1 \right)}\left( 1 \right) ,x^{\left( 1 \right)}\left( 2 \right) ,...,x^{\left( 1 \right)}\left( n \right) \right) X(1)=(x(1)(1),x(1)(2),...,x(1)(n))
其中
x ( 1 ) ( k ) = ∑ i = 1 k x ( 0 ) ( i )      k = 1 , 2 , . . . . . . , n x^{\left( 1 \right)}\left( k \right) =\sum\limits_{i=1}^k{x^{\left( 0 \right)}\left( i \right)}\ \ \ \ k=1,2,......,n x(1)(k)=i=1kx(0)(i)    k=1,2,......,n

(2)计算紧邻均值序列 Z ( 1 ) = ( z ( 1 ) ( 2 ) , z ( 1 ) ( 3 ) , . . . , z ( 1 ) ( n ) ) Z^{\left( 1 \right)}=\left( z^{\left( 1 \right)}\left( 2 \right) ,z^{\left( 1 \right)}\left( 3 \right) ,...,z^{\left( 1 \right)}\left( n \right) \right) Z(1)=(z(1)(2),z(1)(3),...,z(1)(n))
其中 z ( 1 ) ( k ) = 1 2 ( x ( 1 ) ( k ) + x ( 1 ) ( k − 1 ) ) z^{\left( 1 \right)}\left( k \right) =\frac{1}{2}\left( x^{\left( 1 \right)}\left( k \right) +x^{\left( 1 \right)}\left( k-1 \right) \right) z(1)(k)=21(x(1)(k)+x(1)(k1))

(3)建立相关模型
建立一阶微分线性方程,即灰色微分方程,得到 GM(1,1)模型的均值形式: x ( 0 ) ( k ) + a z ( 1 ) ( k ) = b x^{\left( 0 \right)}\left( k \right) +az^{\left( 1 \right)}\left( k \right) =b x(0)(k)+az(1)(k)=b

通过 GM(1,1) 模型相应的白化微分方程:
dx ( 1 ) d t + a x ( 1 ) = b \frac{\text{dx}^{\left( 1 \right)}}{dt}+ax^{\left( 1 \right)}=b dtdx(1)+ax(1)=b

其中 a 表示发展系数,反映了 x ^ ( 1 ) \hat{x}^{\left( 1 \right)} x^(1) x ^ ( 0 ) \hat{x}^{\left( 0 \right)} x^(0) 的发展态势; b 表示灰色作用量,或者内生控制灰数,是从行为序列中挖掘出来的数据,反映的是数据变化的关系,其确切内涵是灰的。

(4)计算 a、b
a ^ \hat{a} a^ 为待估参数向量,令 a ^ = [ a b ] \hat{a}=\left[ \begin{array}{c} \text{a}\\ b\\ \end{array} \right] a^=[ab],利用最小二乘法求解,可得:
a ^ = ( B T B ) − 1 B T Y \hat{a}=\left( B^TB \right) ^{-1}B^TY a^=(BTB)1BTY其中B、Y 分别为
B = [ − z ( 1 ) ( 2 ) 1 − z ( 1 ) ( 3 ) 1 ⋮ ⋮ − z ( 1 ) ( n ) 1 ] ,Y = [ x ( 0 ) ( 2 ) x ( 0 ) ( 3 ) ⋮ x ( 0 ) ( n ) ] \text{B}=\left[ \begin{matrix} -z^{\left( 1 \right)}\left( 2 \right)& 1\\ -z^{\left( 1 \right)}\left( 3 \right)& 1\\ \vdots& \vdots\\ -z^{\left( 1 \right)}\left( n \right)& 1\\ \end{matrix} \right] \text{,Y}=\left[ \begin{array}{c} x^{\left( 0 \right)}\left( 2 \right)\\ x^{\left( 0 \right)}\left( 3 \right)\\ \vdots\\ x^{\left( 0 \right)}\left( \text{n} \right)\\ \end{array} \right] B=z(1)(2)z(1)(3)z(1)(n)111Y=x(0)(2)x(0)(3)x(0)(n)

(5)建立 GM(1,1) 的时间响应式,即预测模型
{ x ^ ( 1 ) ( k + 1 ) = ( x ( 0 ) ( 1 ) − b a ) e − a k + b a , k = 1 , 2 ⋯   , n x ^ ( 0 ) ( k + 1 ) = x ^ ( 1 ) ( k + 1 ) − x ^ ( 1 ) ( k ) \left\{ \begin{array}{l} \hat{x}^{\left( 1 \right)}\left( k+1 \right) =\left( x^{\left( 0 \right)}\left( 1 \right) -\frac{b}{a} \right) e^{-ak}+\frac{b}{a},\text{k}=1,2\cdots ,\text{n}\\ \\ \hat{x}^{\left( 0 \right)}\left( k+1 \right) =\hat{x}^{\left( 1 \right)}\left( k+1 \right) -\hat{x}^{\left( 1 \right)}\left( k \right)\\ \end{array} \right. x^(1)(k+1)=(x(0)(1)ab)eak+ab,k=1,2,nx^(0)(k+1)=x^(1)(k+1)x^(1)(k)


这里GM(1,1)时间响应式
x ^ ( 1 ) ( k + 1 ) = ( x ( 0 ) ( 1 ) − b a ) e − a k + b a , k = 1 , 2 ⋯   , n \hat{x}^{\left( 1 \right)}\left( k+1 \right) =\left( x^{\left( 0 \right)}\left( 1 \right) -\frac{b}{a} \right) e^{-ak}+\frac{b}{a},\text{k}=1,2\cdots ,\text{n} x^(1)(k+1)=(x(0)(1)ab)eak+ab,k=1,2,n可以写成:
x ^ ( 1 ) ( k + 1 ) = c 1 e v k + c 2 \hat{x}^{\left( 1 \right)}\left( k+1 \right) =c_1e^{vk}+c_2 x^(1)(k+1)=c1evk+c2

v , c 1 , c 2 v,c_1,c_2 v,c1,c2为待定系数

2.2 线性回归模型

回归预测法,是根据自变量与因变量的回归方程进行因果推算的一种方法。

线性回归模型我也做过总结:[线性模型总结] 线性回归+方差分析+协方差分析+混合效应+面板数据模型

简单线性回归方程:

y = a x + b y=ax+b y=ax+b

2.3 灰色线性回归组合预测模型建立

由于 X ( 0 ) X^{\left( 0 \right)} X(0) 是非负序列,故 X ( 1 ) X^{\left( 1 \right)} X(1) 是递增序列,而常见的增长方程是线性方程及指数方程:

( 线 性 回 归 方 程 : y = a x + b 指 数 方 程 : y = a e x \left( \begin{array}{l} 线性回归方程\text{:}y=ax+b\\ \\ 指数方程\text{:}y=ae^x\\ \end{array} \right. 线y=ax+by=aex

用这两个增长方程的和来拟合累加生成序列 X ( 1 ) ( k ) X^{\left( 1 \right)}\left( k \right) X(1)(k),从而,灰色线回归组合模型可写成:

x ^ ( 1 ) ( k ) = c 1 e v k + c 2 k + c 3 \hat{x}^{\left( 1 \right)}\left( k \right) =c_1e^{vk}+c_2k+c_3 x^(1)(k)=c1evk+c2k+c3

上式中 v 、 c 1 、 c 2 、 c 3 v\text{、}c_1\text{、}c_2\text{、}c_3 vc1c2c3为待定系数。


3 模型未知参数求解

该模型,需要先确定待识别参数 v v v


Z ( k ) = X ( 1 ) ( k + 1 ) − X ( 1 ) ( k ) = c 1 e v k ( e v − 1 ) + c 2 Z\left( k \right) =X^{\left( 1 \right)}\left( k+1 \right) -X^{\left( 1 \right)}\left( k \right) =c_1e^{vk}\left( e^v-1 \right) +c_2 Z(k)=X(1)(k+1)X(1)(k)=c1evk(ev1)+c2

这里, k = 1 , 2 , ⋯   , n − 1 k=1,2,\cdots ,n-1 k=1,2,,n1


Y m ( k ) = Z ( k + m ) − Z ( k ) = c 1 e v k ( e v m − 1 ) ( e v − 1 ) Y_m\left( k \right) =Z\left( k+m \right) -Z\left( k \right) =c_1e^{vk}\left( e^{vm}-1 \right) \left( e^v-1 \right) Ym(k)=Z(k+m)Z(k)=c1evk(evm1)(ev1)这里,m 为辅助参数, m = 1 , 2 , ⋯   , n − 3 ; k = 1 , 2 , ⋯   , n − m − 2 m=1,2,\cdots ,n-3;k=1,2,\cdots ,n-m-2 m=1,2,,n3;k=1,2,,nm2

得到
e v = Y m ( k + 1 ) Y m ( k ) e^v=\frac{Y_m\left( k+1 \right)}{Y_m\left( k \right)} ev=Ym(k)Ym(k+1)

从而,可以得到灰色线性回归组合预测模型中的参数 v v v 的拟合值,记为 v ^ m ( k ) \hat{v}_m\left( k \right) v^m(k):

v m ( k ) = ln ⁡ Y m ( k + 1 ) Y m ( k ) v_m\left( k \right) =\ln \frac{Y_m\left( k+1 \right)}{Y_m\left( k \right)} vm(k)=lnYm(k)Ym(k+1)

考虑到 Y m ( k ) Y_m\left( k \right) Ym(k)中的数据均是时间序列依次累加后的预测值 X ^ ( 1 ) ( k ) \hat{X}^{\left( 1 \right)}\left( k \right) X^(1)(k),为便于拟合参数 v v v,将 X ^ ( 1 ) ( k ) \hat{X}^{\left( 1 \right)}\left( k \right) X^(1)(k)全部换成 X ( 1 ) ( k ) X^{\left( 1 \right)}\left( k \right) X(1)(k)

即可得出拟合值 v ^ m ( k ) \hat{v}_m\left( k \right) v^m(k),考虑到 m m m 取不同的值,得到的 v ^ m ( k ) \hat{v}_m\left( k \right) v^m(k)也不同,因此,可以分别取 m = 1 , 2 , ⋯   , n − 3 m=1,2,\cdots ,n-3 m=1,2,,n3

以所有 m m m 对应的 v ^ m ( k ) \hat{v}_m\left( k \right) v^m(k) 值的算数平均值作为参数 v v v 的估计值 v ^ \hat{v} v^


对于m=1, 有
( Y 1 ( k ) = Z ( k + 1 ) − Z ( k )       k = 1 , 2 , ⋯   , n − 2 v 1 ( k ) = ln ⁡ Y 1 ( k + 1 ) Y 1 ( k )      k = 1 , 2 , ⋯   , n − 3 \left( \begin{array}{l} Y_1\left( k \right) =Z\left( k+1 \right) -Z\left( k \right)  \ \ \ k=1,2,\cdots ,n-2\\ \\ v_1\left( k \right) =\ln \frac{Y_1\left( k+1 \right)}{Y_1\left( k \right)} \ \ k=1,2,\cdots ,n-3\\ \end{array} \right. Y1(k)=Z(k+1)Z(k)   k=1,2,,n2v1(k)=lnY1(k)Y1(k+1)  k=1,2,,n3

对于m=2, 有

( Y 2 ( k ) = Z ( k + 2 ) − Z ( k )       k = 1 , 2 , ⋯   , n − 3 v 2 ( k ) = ln ⁡ Y 2 ( k + 1 ) Y 2 ( k )      k = 1 , 2 , ⋯   , n − 4 \left( \begin{array}{l} Y_2\left( k \right) =Z\left( k+2 \right) -Z\left( k \right)  \ \ \ k=1,2,\cdots ,n-3\\ \\ v_2\left( k \right) =\ln \frac{Y_2\left( k+1 \right)}{Y_2\left( k \right)} \ \ k=1,2,\cdots ,n-4\\ \end{array} \right. Y2(k)=Z(k+2)Z(k)   k=1,2,,n3v2(k)=lnY2(k)Y2(k+1)  k=1,2,,n4

对于m=n-3, 有
( Y n − 3 ( k ) = Z ( k + n − 3 ) − Z ( k )       k = 1 , 2 v n − 3 ( k ) = ln ⁡ Y n − 3 ( k + 1 ) Y n − 3 ( k )      k = 1 \left( \begin{array}{l} Y_{n-3}\left( k \right) =Z\left( k+n-3 \right) -Z\left( k \right)  \ \ \ k=1,2\\ \\ v_{n-3}\left( k \right) =\ln \frac{Y_{n-3}\left( k+1 \right)}{Y_{n-3}\left( k \right)} \ \ k=1\\ \end{array} \right. Yn3(k)=Z(k+n3)Z(k)   k=1,2vn3(k)=lnYn3(k)Yn3(k+1)  k=1


以上计算 v ^ m ( k ) \hat{v}_m\left( k \right) v^m(k) 的个数为
( n − 3 ) + ( n − 4 ) + ⋯ + 2 + 1 = ( n − 2 ) ( n − 3 ) / 2 \left( n-3 \right) +\left( n-4 \right) +\cdots +2+1=\left( n-2 \right) \left( n-3 \right) /2 (n3)+(n4)++2+1=(n2)(n3)/2
计算其平均值,则有

v ^ = ∑ m = 1 n − 3 ∑ k = 1 n − m − 2 v m ( k ) ( n − 2 ) ( n − 3 ) / 2 \hat{v}=\frac{\sum_{m=1}^{n-3}{\sum_{k=1}^{n-m-2}{v_m\left( k \right)}}}{\left( n-2 \right) \left( n-3 \right) /2} v^=(n2)(n3)/2m=1n3k=1nm2vm(k)

得到 v ^ \hat{v} v^ 后,则
X ^ ( 1 ) ( k ) = c 1 e v ^ k + c 2 k + c 3 \hat{X}^{\left( 1 \right)}\left( k \right) =c_1e^{\hat{v}k}+c_2k+c_3 X^(1)(k)=c1ev^k+c2k+c3


下面估计 参数 c 1 、 c 2 、 c 3 c_1\text{、}c_2\text{、}c_3 c1c2c3

可使用最小二乘法求得参数估计值 c ^ 1 、 c ^ 2 、 c ^ 3 \hat{c}_1\text{、}\hat{c}_2\text{、}\hat{c}_3 c^1c^2c^3,计算过程如下:

c = [ c 1 c 2 c 3 ] = ( A T A ) − 1 A T X ( 1 ) \boldsymbol{c}=\left[ \begin{array}{c} c_1\\ c_2\\ c_3\\ \end{array} \right] =\left( \boldsymbol{A}^T\boldsymbol{A} \right) ^{-1}\boldsymbol{A}^T\boldsymbol{X}^{\left( 1 \right)} c=c1c2c3=(ATA)1ATX(1)

式中,

A = [ e v ^ 1 1 e 2 v ^ 2 1 ⋮ ⋮ ⋮ e n v ^ n 1 ] , X ( 1 ) = [ X ( 1 ) ( 1 ) X ( 1 ) ( 2 ) ⋮ X ( 1 ) ( n ) ] \boldsymbol{A}=\left[ \begin{matrix} e^{\hat{v}}& 1& 1\\ e^{2\hat{v}}& 2& 1\\ \vdots& \vdots& \vdots\\ e^{n\hat{v}}& n& 1\\ \end{matrix} \right] \text{,}\boldsymbol{X}^{\left( 1 \right)}=\left[ \begin{array}{c} X^{\left( 1 \right)}\left( 1 \right)\\ X^{\left( 1 \right)}\left( 2 \right)\\ \vdots\\ X^{\left( 1 \right)}\left( n \right)\\ \end{array} \right] A=ev^e2v^env^12n111X(1)=X(1)(1)X(1)(2)X(1)(n)

从而得到生成序列的预测值为:

X ^ ( 1 ) ( k ) = c ^ 1 e v ^ k + c ^ 2 k + c ^ 3 \hat{X}^{\left( 1 \right)}\left( k \right) =\hat{c}_1e^{\hat{v}k}+\hat{c}_2k+\hat{c}_3 X^(1)(k)=c^1ev^k+c^2k+c^3

对上式作一次累减可得原序列的预测值 X ^ ( 0 ) \hat{X}^{\left( 0 \right)} X^(0)
X ^ ( 0 ) ( k + 1 ) = X ^ ( 1 ) ( k + 1 ) − X ^ ( 1 ) ( k ) \hat{X}^{\left( 0 \right)}\left( k+1 \right) =\hat{X}^{\left( 1 \right)}\left( k+1 \right) -\hat{X}^{\left( 1 \right)}\left( k \right) X^(0)(k+1)=X^(1)(k+1)X^(1)(k)


综上,对于该模型,

  • c ^ 2 \hat{c}_2 c^2 ,则模型为GM(1,1)模型;
  • c ^ 1 \hat{c}_1 c^1 ,则模型为线性回归模型。

4 预测模型精度检验

检验灰色预测模型效果主要包括三种方法:残差检验、关联度检验和后验差检验方法,以此来检验模型的准确性。

这里给出后验差检验的步骤 ,其余检验步骤在前面的链接中有提到:

原始序列的均值
x ˉ ( 0 ) = 1 n ∑ k = 1 n x ( 0 ) ( k ) \bar{x}^{\left( 0 \right)}=\frac{1}{n}\sum_{k=1}^n{x^{\left( 0 \right)}\left( k \right)} xˉ(0)=n1k=1nx(0)(k)

计算的原始序列的标准差:
S 1 = ∑ [ x ( 0 ) ( k ) − x ˉ ( 0 ) ] 2 n − 1 S_1=\sqrt{\frac{\sum{\left[ x^{\left( 0 \right)}\left( k \right) -\bar{x}^{\left( 0 \right)} \right]}^2}{n-1}} S1=n1[x(0)(k)xˉ(0)]2

残差序列的均值:
Δ ( 0 ) = 1 n ∑ k = 1 n [ x ( 0 ) ( k ) − x ^ ( 0 ) ( k ) ] \varDelta ^{\left( 0 \right)}=\frac{1}{n}\sum_{k=1}^n{\left[ x^{\left( 0 \right)}\left( k \right) -\hat{x}^{\left( 0 \right)}\left( k \right) \right]} Δ(0)=n1k=1n[x(0)(k)x^(0)(k)]
计算绝对误差序列的标准差:
S 2 = ∑ [ Δ ( 0 ) ( k ) − Δ ( 0 ) ] 2 n − 1 S_2=\sqrt{\frac{\sum{\left[ \Delta ^{\left( 0 \right)}\left( k \right) -\Delta ^{\left( 0 \right)} \right]}^2}{n-1}} S2=n1[Δ(0)(k)Δ(0)]2
计算后验差比值为::
C = S 2 S 1 C=\frac{S_2}{S_1} C=S1S2
计算小误差概率:
P = p { ∣ Δ ( 0 ) ( k ) − Δ ( 0 ) ∣ < 0.6745 S 1 } P=p\left\{ \left| \Delta ^{\left( 0 \right)}\left( k \right) -\Delta ^{\left( 0 \right)} \right|<0.6745S_1 \right\} P=p{Δ(0)(k)Δ(0)<0.6745S1}

GM(1,1) 通常用后验差检验方法来评价预测结果的好坏,主要根据其中的后验差比值(C)和小误差概率(P)这两个数值来检验模型。根据 C 和 P 的大小可以将灰色模型的预测精度分为以下几个等级,如下表

后验差比值 C小误差概率 P预测精度等级
<0.35>0.95好(一级)
<0.50>0.80较好(二级)
<0.65>0.70合格(三级)
>=0.65<=0.65不合格 (四级)

通过以上检验,如果模型的后验差比、小误差概率都在允许范围内,则说明建立的模型可行,否则,应对残差进行GM(1,1)建模修正

5 R语言实现

GM(1,1)建模

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
}
x<-c(408.40,479.00,574.60,758.00,1055.30)   
gm11(x,length(x))

灰色线性回归组合预测模型

x <- c(1618,1674,1728,1753,1775,1785,1797,1815)
n<-length(x)
x1<-numeric(n);
for(i in 1:n)   ##一次累加
{
x1[i]<-sum(x[1:i]);
}
z = diff(x1) # 
m = n-3
v_m = c()
for(i in 1:m){
y=c()
for(j in 1:(n-i-1)){
y = c(y,z[j+i]-z[j])
}
for(k in 1:(n-i-2)){
v_m = c(v_m,log(y[k+1]/y[k]))
}
}
v = sum(v_m)/length(v_m)
v
A = matrix(c(exp(seq(1,n)*v),seq(1,n),rep(1,n)),nrow = n, ncol = 3)
c<-solve(t(A)%*%A)%*%t(A)%*%x1;
c

# 拟合
x_1 = c()
for(i in 1:n){ 
x_1 = c(x_1,c[1]*exp(v*i)+c[2]*i+c[3])
}
x_0 = c(x_1[1],diff(x_1))
x_0
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值