2014-12-06 5 views
1

У меня есть список с несколькими элементами, мне нужно применить функцию ets из прогноза, используя два элемента из каждого списка.R программирование как применять отдельные элементы в списке к функции

Ниже приведен список dat.list каждый список имеет временные ряды называется z и lam

## Create Dummy list 
##Time series -> z, lambda - > lam 
z <- ts(matrix(rnorm(30,10,10), 100, 3), start = c(1961, 1), frequency = 12) 
lam <- 0.8 
ap <- list(z=z,lam=lam) 


z <- ts(matrix(rnorm(30,10,10), 100, 3), start = c(1971, 1), frequency = 12) 
lam <- 0.5 
zp <- list(z=z,lam=lam) 

dat.list <- list(ap=ap,zp=zp) 

Теперь мне нужно принимать каждый раз серию z и принимать lam и применять его с ets функции от forecast пакета. Я использовал следующий код.

library("forecast") 
library("plyr") 
ets.f <- function(x) { 
     forecast(ets(x$z, lambda = x$lam),h=12)$mean ## I need to apply lambda from list lam 
    } 

    ens.f <- function(x){ 
     mm <- llply(x,ets.f) 
     tq <- matrix(unlist(mm), ncol = 12, byrow = TRUE) 
     tq 
    } 

    fore <- llply(dat.list, ens.f) 

При запуске программы я получаю следующее сообщение об ошибке "Error in x$z : $ operator is invalid for atomic vectors".

Я не уверен, как применять отдельные элементы списка и применять его к функции. Любая помощь будет принята с благодарностью.

спасибо

Кроме того, я также пытался отделить z и lam в списке и застрял на том, как применить это. Я также использую код ниже. Большое спасибо.

ts.l <- lapply(dat.list,'[[','z') 
lam.l <- lapply(dat.list,'[[','lam') 

ответ

1

Может быть, это помогает:

lapply(dat.list, function(x) matrix(unlist(lapply(x$z, 
      function(y) forecast(ets(y, lambda=x$lam), 
         h=12)$mean)), ncol=12, byrow=TRUE)) 
+0

Благодаря @akrun, это именно то, что я хотел. – forecaster

+0

@forecaster Нет проблем. Рад, что это помогло. – akrun

+0

привет @akrun, так как у меня много тысяч матриц, я собираюсь запустить его параллельно. Было бы здорово, если бы вы могли изменить приведенный выше код, чтобы перейти от lapply к parLapply, используя пакет 'snow' в обоих экземплярах. Я мог бы также задать отдельные вопросы. Many Thanks – forecaster