Mám funkciu, ktorú by som rád povolal computeMASE
uplatňovať na 3 rôzne zoznamy forecast.list,train.list,test.list
všetky majú spoločné hodnoty (ap
,wi
). Môžem túto funkciu použiť samostatne do zoznamu, ako je uvedené v nižšie uvedenom kóde, ale keď používam lapply
a použiť funkciu na získanie dát naraz, nemôžem robiť.Pozrite sa nižšie na reprodukovateľný príklad.Prosím, dajte mi vedieť, ako to vyriešiť.
Veľká vďaka
library("forecast")
## Forecast Function
for.x <- function(x){
fc <- forecast(ets(x),h=18)$mean
return(fc)
}
## MASE Function
computeMASE <- function(forecast,train,test,period){
# forecast - forecasted values
# train - data used for forecasting .. used to find scaling factor
# test - actual data used for finding MASE.. same length as forecast
# period - in case of seasonal data.. if not, use 1
forecast <- as.vector(forecast)
train <- as.vector(train)
test <- as.vector(test)
n <- length(train)
scalingFactor <- sum(abs(train[(period+1):n] - train[1:(n-period)])) / (n-period)
et <- abs(test-forecast)
qt <- et/scalingFactor
meanMASE <- mean(qt)
return(meanMASE)
}
## Prepare Data
train.list <- list(ap = ts(AirPassengers[1:(length(AirPassengers)-18)],start=start(AirPassengers),frequency=12),
wi = ts(wineind[1:(length(wineind)-18)],end=end(wineind),frequency=12))
test.list <- list(ap = ts(AirPassengers[(length(AirPassengers)-17):length(AirPassengers)],end=end(AirPassengers),frequency=12),
wi = ts(wineind[(length(wineind)-17):length(wineind)],end=end(wineind),frequency=12))
## Create Forecast
forecast.list <- lapply(train.list,for.x)
## Compute MASE for each list in the forecast
k.ap <- computeMASE(forecast.list$ap,train.list$ap,test.list$ap,12)
k.wi <- computeMASE(forecast.list$wi,train.list$wi,test.list$wi,12)
## How to apply compute MASE to all the elements in the list,? below does not work
mapply(computeMASE(X,Y,Z,12),X=forecast.list,Y=train.list,Z=test.list)
odpovede:
1 pre odpoveď č. 1Prvý argument spoločnosti mapply
by mala byť funkcia. Môžete "kariet" argument periodu
mapply(function(x,y,z) computeMASE(x,y,z,12), forecast.list, train.list, test.list)
alebo ho poskytnite ako ďalší argument (s implicitnou recykláciou)
mapply(computeMASE, forecast.list, train.list, test.list, 12)