Я ищу помощь для оптимизации моего кода, чтобы избавиться от циклов и увеличить вычислительную скорость. Я довольно новичок в этой области и до Р. Я запускаю компонентные градиенты, повышающие регрессию, на линейной модели временных рядов с вращающимся окном. Я использую коэффициенты из регрессии y на X для каждого окна, чтобы предсказать следующее наблюдение y из окна. (Позже я оценить точность прогноза)Альтернатива For-Loop: Как использовать окно для прокатки в R?
Моих данные 1560 различных временные рядов (в том числе лагов серии) первоначально с около 540 наблюдений (Фрейм данных размерности 540x1560)
Я посмотрел в rollapply
но не смог это работать. Особенно я не знаю, как предсказать yhat для каждого окна (каждая итерация).
#Define windows size
w=100
##Starting Loop, rolling the window by one observation per iteration
#Predicting the next dependent variable y_hat(w+i) with the data from the "pseudo" most recent observation
for (i in 1:(nrow(df_all)-w)){
glm1 <- glmboost(fm, data=df_all[i:(w-1+i), ], center=TRUE, control=boost_control(mstop = 100, trace=TRUE))
ls_yhat[[i]] <- predict(glm1, newdata = df_all[w-1+i,])
}
Любые советы, оцененные (требуется навсегда для работы на моем ноутбуке)!
PS: Я также изучаю использование multicore
или parallel
пакетов. Особенно b/c я буду использовать кросс-валидацию для критерия остановки позже. Но я только начинаю изучать это. Тем не менее, любые советы по этому поводу тоже оценены!
Edit: Минимальный рабочий пример использования Bulit-в данных (не временных рядов, хотя):
library("mboost") ## load package
data("bodyfat", package = "TH.data") ## load data
##Initializing List for coefficients DFs
ls_yhat <- list()
#Define windows size
w=30
##Starting Loop, rolling the window by one observation per iteration
##Predicting the next dependent variable y_hat(w+i) with the data from the "pseudo" most recent observation
for (i in 1:(nrow(bodyfat)-w)){
glm1 <- glmboost(DEXfat~., data=bodyfat[i:(w-1+i), ], center=TRUE, control=boost_control(mstop = 15, trace=TRUE))
ls_yhat[[i]] <- predict(glm1, newdata = bodyfat[(w-1+i),])
i
}
Не уверен, возможно ли это, но вы посмотрели на apply()? –
Было бы очень полезно, если бы вы могли предоставить данные через 'dput' или использовать встроенный набор данных для вашего примера, чтобы мы могли воспроизвести это. –
Просто fyi, ваше наблюдение «из окна» на самом деле находится в наборе учебных материалов для каждой итерации. Ваш текущий код, скорее всего, неверно указан. Все применяемое семейство - это еще одна форма цикла. «glmboost», скорее всего, является узким местом, поскольку размер вашего набора данных на самом деле является незначительным в великой схеме вещей. Вы можете распараллелить свой цикл с помощью 'package: foreach' или' parallel :: mclapply'. – Vlo