Я пытаюсь прогнозировать почасовые визиты в больницу ЭД. В течение нескольких часов фактическое значение равно 0, и это реальная проблема, когда я вычисляю MAPE для каждой модели. Я видел этот вопрос , где предлагается использовать MASE (средняя абсолютная масштабная ошибка), которая также является метри c, определяемой точностью функции (пакет прогноза). Однако в моем случае это невозможно, потому что MASE выдает NaN.
Итак, я пытаюсь изменить исходный код функции MAPE и использую только те функции, которые мне нужны для моего проекта: Сначала я попробовал это код для MAPE, но он не работает, поскольку .resid
и .actual
являются векторами.
root_squared_error <- function(.resid, na.rm = TRUE, ...){sqrt(MSE(.resid, na.rm = na.rm))}
Mean_Abs_error <- function(.resid, na.rm = TRUE, ...){ mean(abs(.resid), na.rm = na.rm)}
Mean_Abs_percentage_error <- function(.resid, .actual, na.rm = TRUE, ...){
if(.resid == 0){
if(.actual == 0){
mean(abs(0), na.rm = na.rm)
} else{
mean(abs(100), na.rm = na.rm)
}
}
mean(abs(.resid / .actual * 100), na.rm = na.rm)
}
> accuracy(demand_fc_test,test, measures = list(RMSE = root_squared_error, MAE = Mean_Abs_error, MAPE = Mean_Abs_percentage_error))
# A tibble: 6 x 6
.model MTS .type RMSE MAE MAPE
<chr> <chr> <chr> <dbl> <dbl> <dbl>
1 Benchmark Blue Test 0.459 0.192 Inf
2 Benchmark Green Test 3.07 2.16 Inf
3 Benchmark Orange Test 0.579 0.280 Inf
4 Benchmark Red Test 0.0673 0.00453 100
5 Benchmark White Test 0.229 0.0516 Inf
6 Benchmark Yellow Test 2.38 1.74 Inf
Warning messages:
1: In if (.resid == 0) { :
the condition has length > 1 and only the first element will be used
Это сообщение об ошибке появляется 10 раз. После некоторых исследований я увидел примеры, когда функция ifelse
решала подобные проблемы. Тем не менее, это не совсем работает, потому что он рассчитывает каждую ошибку для каждого значения и не представляет сводную таблицу.
Mean_Abs_percentage_error <- function(.resid, .actual, na.rm = TRUE, ...){
ifelse(.resid == 0,
ifelse(.actual == 0, 0, 100),
abs(.resid / .actual * 100)
)}
> accuracy(demand_fc_test,test,
+ measures = list(RMSE = root_squared_error, MAE = Mean_Abs_error, MAPE = Mean_Abs_percentage_error))
# A tibble: 13,248 x 6
.model MTS .type RMSE MAE MAPE
<chr> <chr> <chr> <dbl> <dbl> <dbl>
1 Benchmark Blue Test 0.459 0.192 0
2 Benchmark Blue Test 0.459 0.192 0
3 Benchmark Blue Test 0.459 0.192 0
4 Benchmark Blue Test 0.459 0.192 0
5 Benchmark Blue Test 0.459 0.192 0
6 Benchmark Blue Test 0.459 0.192 0
7 Benchmark Blue Test 0.459 0.192 0
8 Benchmark Blue Test 0.459 0.192 0
9 Benchmark Blue Test 0.459 0.192 0
10 Benchmark Blue Test 0.459 0.192 0
# ... with 13,238 more rows
Я думаю, что проблема в том, как я использую функцию ifelse
, Мне нужно применить это условие к каждому значению каждого прогноза (в случае, если у меня есть несколько моделей), и оно должно возвращать среднее значение каждой модели. Я пытаюсь получить тот же вывод, как если бы я применял функцию точности без каких-либо изменений, то есть мне нужна циблле с n строками и 6 столбцами, где n - количество моделей.
Любые предложения о том, как решить мою проблему? Заранее спасибо.
Пример моих данных:
library(fpp3)
library(fasster)
> dados
# A tsibble: 140,400 x 7 [1h] <UTC>
# Key: MTS [6]
Date Weekday MTS Demand Temperature DaysToHoliday DaysAfterHoliday
<dttm> <int> <chr> <int> <dbl> <int> <int>
1 2017-05-01 00:00:00 1 Blue 0 11.4 0 0
2 2017-05-01 01:00:00 1 Blue 0 11.2 0 0
3 2017-05-01 02:00:00 1 Blue 1 11.2 0 0
4 2017-05-01 03:00:00 1 Blue 0 10.9 0 0
5 2017-05-01 04:00:00 1 Blue 1 10.9 0 0