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

时间:2019-01-03 09:26:07

标签: r

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

以下是示例数据:

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

3

代码如下所示:

get meals(): FormArray { return this.form.get('meals') as FormArray; }

正如我提到的,我想添加一个例外,即实际和预测均为0时,我的错误将为零。我的代码的问题在于,当它在第一次观察中遇到的实际值和预测值都为0时,它给出的平均误差为零,但实际上我希望所有误差的均值。

有人可以帮我吗?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

问题在于actual == 0 & predicted == 0是逻辑向量,而如果将逻辑向量作为if语句的条件,则只会判断第一个元素。

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