Ошибка при создании списка линейных моделей временных рядов с циклом

У меня есть следующий набор данных (код требует пакета forecast для вызова tslm.

x <- rnorm(11, mean = 534, sd = 79)
y <- rnorm(9, mean = 800, sd = 56)
p <- list(x, y) 
tsl <- list(); ts_trend <- list()


for(i in seq_along(p)) {

    tsl[[i]] <- ts(p[[i]], start = c(2018, 1), frequency = 52)
}

    for(i in seq_along(tsl)) {

ts_trend[[i]] <- tslm(tsl[[i]] ~ trend)

}

При запуске выдает ошибку

Error in tsl[[i]] : subscript out of bounds

Подстрочный индекс, насколько мне известно, явно не выходит за рамки допустимого. Я использую ту же ссылку в предыдущем цикле без ошибок.

Понятия не имею, как это исправить. Что мне не хватает?


person Todd Shannon    schedule 11.08.2018    source источник
comment
У вас есть две for петли. Думаю, вложенные не нужны. for(i in seq_along(tsl)) ts_trend[[i]] <- tslm(tsl[[i]] ~ trend)   -  person akrun    schedule 11.08.2018
comment
Фактически вы можете объединить оба в один for цикл. Что такое тренд?   -  person Parfait    schedule 11.08.2018
comment
извините @akrun, это была опечатка, которую я исправил. Тренд @Parfait является аргументом только для вызова tslm. Вы можете вызвать trend, и коэффициент будет линейным трендом для объекта временного ряда. Вы также можете построить call tslm(x ~ trend + season), и сезон будет произведен как коэффициенты сезонности, так и тренд.   -  person Todd Shannon    schedule 11.08.2018


Ответы (1)


Мы можем использовать lapply, и это сработает

ts_trendN <- lapply(tsl, function(x) tslm(x ~ trend))

Причина, по которой цикл for не работает, зависит от среды, в которой рассчитывается trend. Мы можем создать новую среду, и она будет работать нормально

for(i in seq_along(tsl)) {
   ev1 <- new.env()
   ev1$tsl1 <- tsl[[i]]

    ts_trend[[i]] <- tslm(ev1$tsl1 ~ trend)


   }

Возможна некоторая разница в атрибутах. Выход модели такой же

library(broom)
identical(tidy(ts_trendN[[1]]), tidy(ts_trend[[1]]))
#[1] TRUE
person akrun    schedule 11.08.2018
comment
Ааааахххх ... Должно быть, я запускал отладчик 10 раз и выяснил, где произошла ошибка, но не понял природу вызова. Это великолепно ... спасибо! eval (mf, parent.frame ()) Вызов parent.frame() ссылается на глобальную среду, но я действительно не знаю, что это влияет на вызов, который я делал напрямую. Есть какие-нибудь советы о том, как узнать больше об экологических проблемах и вызовах функций? - person Todd Shannon; 11.08.2018