定义自定义错误度量(sMAPE)函数

问题描述 投票:0回答:2

我在R中定义了一个自定义sMAPE(对称平均绝对百分比误差)函数。我想在代码中添加一个异常,其中实际值和预测值都为零。

以下是示例数据:

实际预测 0 0 2 1 1 0 2 4 2 1 1 3

代码如下所示:

sMAAPE <- function(actual, predicted){
if (actual == 0 & predicted == 0){
    return(0)
       }
else {
  output<- mean(abs(actual-predicted)/(abs(actual)+abs(predicted)))
  return(output)
    }
  }

正如我所提到的,我想添加一个异常,即实际和预测都为0的任何地方,我的错误将为零。我的代码的问题是,当它在第一次观察中遇到实际和预测为0时,它将平均误差设为零,但实际上我想要所有错误的意思。

有人可以帮我这个吗?

r
2个回答
1
投票

在评论问题中应用@ akrun的建议。我想这就是你需要的。

# Create a dataset    
Actual <- c(0,2,1,2,2,1)
Predicted <- c(0,1,0,4,1,3)
df <- data.frame(cbind(Actual, Predicted))
df


sMAAPE <- function(actual, predicted){
     output<- ifelse(actual == 0 & predicted == 0,0, # If actual and predicted are 0, error is 0 
     abs(actual- predicted)/(abs(actual)+abs(predicted))) # otherwise your function
     return(mean(output)) # Return mean of all errors
}

输出:

> sMAAPE(df$Actual, df$Predicted)
[1] 0.4166667

这是以下矢量[1] 0 0.3333333 1.0000000 0.3333333 0.3333333 0.5000000的平均值

您可以将na.rm = T添加到平均函数,以便它也可以处理NA。


0
投票

问题是actual == 0 & predicted == 0是一个逻辑向量,而如果你把一个逻辑向量作为if句子的条件,那么只会判断第一个元素。

在条件中使用sum(abs(actual))+sum(abs(predicted)) == 0

© www.soinside.com 2019 - 2024. All rights reserved.