如何计算 DRPS (Discrete Rank Probability Score)
How to calculated DRPS (Discrete Rank Probability Score)
我正在努力复制论文中的评分规则 Forecasting the intermittent demand for slow-moving inventories: A modelling approach
论文对评分规则的描述如下:
这是我的尝试
y <- rpois(n = 100, lambda = 10) # forecasted distribution
x <- 10 # actual value
drps_score <- function(x = value, y = q){
# x = actual value (single observation); y = quantile forecasted value (vector)
Fy = ecdf(y) # cdf function
indicator <- ifelse(y - x > 0, 1, 0) # Heaviside
score <- sum((indicator - Fy(y))^2)
return(score)
}
> drps_score(x = x, y = y)
[1] 53.028
在我提供一个 0 向量之前,这似乎工作得很好:
y <- rep(x = 0, 100)
> drps_score(x = x, y = y)
[1] 0
我知道他们在本文中使用的一种方法是 0s 预测,他们的结果没有显示 DRPS 为 0。这让我觉得计算不对。
我认为这里有一些问题。
首先,我认为您没有在评分函数中计算正确的总和。该分数要求您对 y 的所有可能值(即所有正整数)求和,而不是对 y 的所有预测样本求和。
其次,我不认为上面的定义给出了期望的结果,当 y=x 时 \hat F (y) 定义为 0 那么你不会得到零分的预测有一个点质量为真值。 (是的,我是说 source 是“错误的”,或者至少有一个没有给出预期结果的定义。)这是一个 re-formulated 我认为可以解决这两个问题的函数:
x <- 10 # actual value
drps_score <- function(x = value, y = q, nsum=100){
# x = actual value (single observation); y = quantile forecasted value (vector)
Fy = ecdf(y) # cdf function
ysum <- 0:nsum
indicator <- ifelse(ysum - x >= 0, 1, 0) # Heaviside
score <- sum((indicator - Fy(ysum))^2)
return(score)
}
> drps_score(x = x, y = rpois(n = 1000, lambda = 8))
[1] 1.248676
> drps_score(x = x, y = rpois(n = 1000, lambda = 9))
[1] 0.878183
> drps_score(x = x, y = rpois(n = 1000, lambda = 10))
[1] 0.692667
> drps_score(x = x, y = rep(10, 100))
[1] 0
> drps_score(x = x, y = rpois(n = 1000, lambda = 11))
[1] 0.883333
以上显示以真实值 (lambda=10) 为中心的分布对于非点质量的分布得分最低。
我正在努力复制论文中的评分规则 Forecasting the intermittent demand for slow-moving inventories: A modelling approach
论文对评分规则的描述如下:
这是我的尝试
y <- rpois(n = 100, lambda = 10) # forecasted distribution
x <- 10 # actual value
drps_score <- function(x = value, y = q){
# x = actual value (single observation); y = quantile forecasted value (vector)
Fy = ecdf(y) # cdf function
indicator <- ifelse(y - x > 0, 1, 0) # Heaviside
score <- sum((indicator - Fy(y))^2)
return(score)
}
> drps_score(x = x, y = y)
[1] 53.028
在我提供一个 0 向量之前,这似乎工作得很好:
y <- rep(x = 0, 100)
> drps_score(x = x, y = y)
[1] 0
我知道他们在本文中使用的一种方法是 0s 预测,他们的结果没有显示 DRPS 为 0。这让我觉得计算不对。
我认为这里有一些问题。
首先,我认为您没有在评分函数中计算正确的总和。该分数要求您对 y 的所有可能值(即所有正整数)求和,而不是对 y 的所有预测样本求和。
其次,我不认为上面的定义给出了期望的结果,当 y=x 时 \hat F (y) 定义为 0 那么你不会得到零分的预测有一个点质量为真值。 (是的,我是说 source 是“错误的”,或者至少有一个没有给出预期结果的定义。)这是一个 re-formulated 我认为可以解决这两个问题的函数:
x <- 10 # actual value
drps_score <- function(x = value, y = q, nsum=100){
# x = actual value (single observation); y = quantile forecasted value (vector)
Fy = ecdf(y) # cdf function
ysum <- 0:nsum
indicator <- ifelse(ysum - x >= 0, 1, 0) # Heaviside
score <- sum((indicator - Fy(ysum))^2)
return(score)
}
> drps_score(x = x, y = rpois(n = 1000, lambda = 8))
[1] 1.248676
> drps_score(x = x, y = rpois(n = 1000, lambda = 9))
[1] 0.878183
> drps_score(x = x, y = rpois(n = 1000, lambda = 10))
[1] 0.692667
> drps_score(x = x, y = rep(10, 100))
[1] 0
> drps_score(x = x, y = rpois(n = 1000, lambda = 11))
[1] 0.883333
以上显示以真实值 (lambda=10) 为中心的分布对于非点质量的分布得分最低。