Опитвам се да прогнозирам почасовите посещения в спешната болница. За няколко часа действителната стойност е 0 и това е истински проблем, когато изчислявам MAPE за всеки модел. Видях този въпрос, където се предлага използването на MASE (средно абсолютно мащабирано грешка), която също е метрика, дадена от функцията точност (прогнозен пакет). В моя случай обаче това не е възможно, защото 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
. Трябва да приложа това условие към всяка стойност на всяка прогноза (в случай, че имам няколко модела) и то трябва да върне средната стойност на всеки модел. Опитвам се да получа същия изход, както ако прилагах функцията за точност без никакви промени, това е, че имам нужда от ciblle с 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