2016-09-09 2 views
2

Я ищу помощь для оптимизации моего кода, чтобы избавиться от циклов и увеличить вычислительную скорость. Я довольно новичок в этой области и до Р. Я запускаю компонентные градиенты, повышающие регрессию, на линейной модели временных рядов с вращающимся окном. Я использую коэффициенты из регрессии 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 
} 
+0

Не уверен, возможно ли это, но вы посмотрели на apply()? –

+1

Было бы очень полезно, если бы вы могли предоставить данные через 'dput' или использовать встроенный набор данных для вашего примера, чтобы мы могли воспроизвести это. –

+1

Просто fyi, ваше наблюдение «из окна» на самом деле находится в наборе учебных материалов для каждой итерации. Ваш текущий код, скорее всего, неверно указан. Все применяемое семейство - это еще одна форма цикла. «glmboost», скорее всего, является узким местом, поскольку размер вашего набора данных на самом деле является незначительным в великой схеме вещей. Вы можете распараллелить свой цикл с помощью 'package: foreach' или' parallel :: mclapply'. – Vlo

ответ

0

Как Vlo справедливо mentionend, узким местом является повышение alogrithm. Я использовал package:foreach и doParallel, что более чем вдвое сократило время работы. Я хотел поделиться своим решением.

library("mboost") ## load package 
data("bodyfat", package = "TH.data") ## load data 
library("foreach") 
library("doParallel") 

##Register backend for parallel execution 
registerDoParallel() 

##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 
ls_yhat <- foreach (i = 1:(nrow(bodyfat)-w), .packages='mboost') %dopar%{ 
    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),]) 
} 
Смежные вопросы