2016-03-11 8 views
0

У меня есть функция, которую я бы назвал computeMASE для применения к 3 различным спискам forecast.list,train.list,test.list Все они имеют общие значения (ap, wi). Я могу использовать эту функцию отдельно в списке, как показано в приведенном ниже коде, но когда я использую lapply и применяю функцию для получения данных сразу, я не могу это сделать. Ниже приведен пример воспроизводимого примера. Пожалуйста, дайте мне знать, как это решить.применение функции по нескольким спискам в R

Большое спасибо

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) 
+0

Что вы пытаетесь сделать именно? Замените две строки 'k.ap <- ...' и 'k.wi <- ...' одним вызовом функции с более высоким порядком? –

+1

Как и в 'mapply (function (x, y, z) computeMASE (x, y, z, 12), forecast.list, train.list, test.list)'? –

+0

@ A.Webb, это именно то, что я искал, можете ли вы разместить это как ответ, чтобы я мог его принять? спасибо – forecaster

ответ

1

Первый аргумент mapply должен быть функцией. Вы можете «Карри» период аргумент

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

или предоставить его в качестве еще одного аргумента (с неявной рециклинга)

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

 Смежные вопросы

  • Нет связанных вопросов^_^