あなたが探しているのは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 の方が優れていますが、2 番目の例では 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)))