您可能正在寻找的是MAPE(平均绝对百分比误差)。它相对于其他精度度量(MSE、MPE、RMSE、MAE 等)的优势在于 MAPE 不依赖于电平,它测量的是绝对误差,并且具有明确的含义。您可以使用包forecast
来获取其中一些措施:
library(forecast)
data <- data.frame(y = rnorm(100), x = rnorm(100))
model <- lm(y ~ x, data)
accuracy(model)
# ME RMSE MAE MPE MAPE
# 5.455773e-18 1.019446e+00 7.957585e-01 1.198441e+02 1.205495e+02
accuracy(model)["MAPE"]
# MAPE
# 120.5495
或者
mape <- function(f, x) mean(abs(1 - f / x) * 100)
mape(fitted(model), data$y)
# [1] 120.5495
另一方面,看起来MPE(平均百分比误差)更适合显示数据以预测线为中心的程度,例如让预测为p <- rep(2, 20)
和数据,y <- rep(c(3,1), 10)
然后是。MPE = 0
MAPE = 100%
所以你应该决定你真正想要展示什么,MAPE 作为准确度的衡量标准更好,但对你来说,第二个例子 MPE 可能是更好的选择。
更新:如果它确实以您要检查的内容为中心,您应该查看没有任何平方、绝对值等的对误差求和的度量。也就是说,您可能还想查看 ME(平均误差),其中比 MPE 简单一点,但有不同的解释。这是一个与您的第一个示例有些相似的示例:
mpe <- function(f, x) mean((1 - f / x) * 100)
mape <- function(f, x) mean(abs(1 - f / x) * 100)
me <- function(f, x) mean(x - f)
set.seed(20130130)
y1 <- rnorm(1000, mean = 10, sd = 1.5) * (1:1000) / 300
y2 <- rnorm(1000, mean = 10, sd = 1.7) * (1:1000) / 250
pr <- (1:1000) / 30
data <- data.frame(y = c(y1, y2),
x = 1:1000,
prediction = rep(pr, 2),
id = rep(1:2, each = 1000))
results <- data.frame(MAPE = c(mape(pr, y1), mape(pr, y2)),
MPE = c(mpe(pr, y1), mpe(pr, y2)),
ME = c(me(pr, y1), me(pr, y2)),
id = 1:2)
results <- round(results, 2)
ggplot(data, aes(x, y)) + geom_line() + theme_bw() +
facet_wrap(~ id) + geom_line(aes(y = prediction), colour = "red") +
theme(strip.background = element_blank()) + labs(y = NULL, x = NULL) +
geom_text(data = results, x = 150, y = 50, aes(label = paste("MAPE:", MAPE))) +
geom_text(data = results, x = 150, y = 45, aes(label = paste("MPE:", MPE))) +
geom_text(data = results, x = 150, y = 40, aes(label = paste("ME:", ME)))