我在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时,它将平均误差设为零,但实际上我想要所有错误的意思。
有人可以帮我这个吗?
在评论问题中应用@ 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。
问题是actual == 0 & predicted == 0
是一个逻辑向量,而如果你把一个逻辑向量作为if句子的条件,那么只会判断第一个元素。
在条件中使用sum(abs(actual))+sum(abs(predicted)) == 0
。