मेरे पास एक ऐसा कार्य है जिसे मैं बुलाऊंगा computeMASE
3 अलग-अलग सूचियों पर लागू करने के लिए forecast.list,train.list,test.list
उनमें से सभी के पास सामान्य मूल्य हैं (ap
,wi
)। मैं नीचे दिए गए कोड में दिखाए गए अनुसार सूची में व्यक्तिगत रूप से फ़ंक्शन का उपयोग कर सकता हूं, लेकिन जब मैं इसका उपयोग करता हूं lapply
और एक ही समय में डेटा प्राप्त करने के लिए फ़ंक्शन को लागू करें, मैं ऐसा करने में असमर्थ हूं। कृपया पुन: उत्पन्न उदाहरण के लिए नीचे देखें। कृपया मुझे यह हल करने के बारे में बताएं।
बहुत धन्यवाद
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)
उत्तर:
उत्तर № 1 के लिए 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)