/ / použitie funkcie cez viacnásobný zoznam v R - r, lapply, sapply, mapply

použitie funkcie cez viacnásobný zoznam v R - r, lapply, sapply, mapply

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ď č. 1

Prvý 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)