该博客动机
最近博主有一篇论文一审结果回来了,审稿人要求作者用Diebold-Mariano检验检测方法的有效性,但在网上搜了半天没找到对Diebold-Mariano检验(以下简称DM检验)的能懂的解释,最后还是看英文原文看懂的,因此博主在这里介绍DM检验,并在最后附上博主在github上开源的DM代码链接。
DM检验背景
假设我们有两个模型(模型A和模型B)做一个时间跨度为T(这里假设T=3)的预测任务,根据预测结果得到在该时间范围内的预测结果,然后根据真实值计算预测误差,假设二者误差分别为:
E
a
=
[
3.1
,
4.6
,
3.4
]
E_{a}=[3.1,4.6,3.4]
Ea=[3.1,4.6,3.4] (模型A的误差)
E
b
=
[
2.9
,
4.8
,
3.6
]
E_{b}=[2.9,4.8,3.6]
Eb=[2.9,4.8,3.6] (模型B的误差)
可以看到二者误差相差不大,其中模型A的平均误差为3.70,模型B的平均误差为3.77,那么我们就可以肯定模型A的效果一定比模型B好吗,其实不一定,我们用的测试数据毕竟只是所有可能存在数据中采样出的一小部分,这可能是由于数据采样不够好使得A侥幸表现比B好。
那我们如何确认是不是侥幸,或者有没有可能算出模型A和模型B表现有显著差异(即模型A极大概率比模型B效果好)的概率?DM检验从统计学角度提供了计算方法。
DM检验理论
同样假设模型A和B在时间长度为T的跨度上做预测,假设模型A 和模型B的误差序列为:
E
a
=
[
a
1
,
a
2
,
.
.
.
a
T
]
E_{a}=[a^{1}, a^{2},...a^{T}]
Ea=[a1,a2,...aT]
E
b
=
[
b
1
,
b
2
,
.
.
.
b
T
]
E_{b}=[b^{1}, b^{2},...b^{T}]
Eb=[b1,b2,...bT]
那么我们可以求得二者差值序列为
D
=
[
d
1
,
d
2
,
.
.
.
,
d
T
]
D=[d^{1}, d^{2},...,d^{T}]
D=[d1,d2,...,dT],其中:
d
i
=
a
i
−
b
i
d^{i}=a^{i}-b^{i}
di=ai−bi
然后我们可以求得序列D的均值和标准差,其公式为:
d
m
e
a
n
=
∑
i
=
1
T
d
i
T
d_{mean}=\frac{\sum\limits^{T}_{i=1}d^{i}}{T}
dmean=Ti=1∑Tdi
d
s
t
d
=
∑
i
=
1
T
(
d
i
−
d
m
e
a
n
)
2
T
−
1
d_{std}=\sqrt{\frac{\sum\limits_{i=1}^{T}(d^{i}-d_{mean})^{2}}{T-1}}
dstd=T−1i=1∑T(di−dmean)2
然后可计算出DM统计量为:
D
M
=
d
m
e
a
n
d
s
t
d
DM=\frac{d_{mean}}{d_{std}}
DM=dstddmean
而DM检验理论认为
D
M
DM
DM的分布满足标准正态分布。因此,通过在标准正态分布表中查询
D
M
DM
DM对应的置信度就可以知道模型A和模型B有显著表现差异的置信度。
开源代码
博主用python编程实现了DM检验代码,并已在github上开源,源代码地址为:
https://github.com/Lizhuoling/Diebold-Mariano-test