/ / aplicando la función en la lista múltiple en R - r, lapply, sapply, mapply

aplicando la función en la lista múltiple en R - r, lapply, sapply, mapply

Tengo una función que me gustaría llamar computeMASE para aplicar a 3 listas diferentes forecast.list,train.list,test.list todos ellos tienen valores comunes (ap,wi). Puedo usar la función individualmente para la lista como se muestra en el código a continuación, pero cuando uso la función lapply y aplique la función para obtener los datos de una vez, no puedo hacerlo. Consulte a continuación un ejemplo reproducible. Déjeme saber cómo resolverlo.

Muchas gracias

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)

Respuestas

1 para la respuesta № 1

El primer argumento de mapply Debería ser una función. Usted puede "curry" el argumento del período

mapply(function(x,y,z) computeMASE(x,y,z,12), forecast.list, train.list, test.list)

o, proporcionalo como otro argumento (con reciclaje implícito)

mapply(computeMASE, forecast.list, train.list, test.list, 12)