R Ошибка памяти Windows и возможное улучшение кода

#r #xts

#r #xts

Вопрос:

Я пытаюсь подогнать модель eGARCH на расширяющейся основе, используя пакет rugarch. У меня есть 6 столбцов данных, и я пытаюсь изменить параметры ~ 6000 для каждого столбца. Если я запускаю следующий код, я получаю сообщение об ошибке в Windows во 2-м столбце (это означает, что я успешно прошел весь первый внутренний цикл). Используя gc() в цикле и удаляя установленный объект, я увеличил время, необходимое для устранения ошибки памяти. Кроме того, этот процесс в целом занимает очень много времени, и мне интересно, есть ли способ улучшить его с моей стороны. Сам пакет, похоже, написан довольно эффективно, большая часть фильтрации выполняется на низком уровне C. Вероятно, я мог бы переоборудовать модель каждые 30-60 дней, но я бы предпочел сделать это таким образом. Я использую R 2.13.2 в 32-разрядной Windows. Заранее спасибо. Редактировать: ошибка: «Инструкция в «0x6c732a07» ссылается на память в «0x00000008». Не удалось «прочитать» память».

 library(rugarch)
library(xts)
e.spec <- ugarchspec(variance.model = list(model = "eGARCH", garchOrder = c(1,1)),   mean.model = list(armaOrder = c(1,0), include.mean = TRUE)) 
dly.xts <- xts(matrix(rnorm(8000*6), nrow = 8000, ncol = 6), as.Date(1:8000))
tst.xts <- tail(dly.xts, 6000)
names(tst.xts) <- 1:6
tst.idx <- index(tst.xts)
dly.idx <- index(dly.xts)
for(j in 1:ncol(tst.xts)){
     sig.est <- rep(NA, nrow(tst.xts))
    for(i in 1:nrow(tst.xts)){
        print(i)
        dat <- dly.xts[dly.idx <= tst.idx[i], j]
        fit <- try(ugarchfit(e.spec, data = dat[-nrow(dat), ], solver = "solnp", solver.control = list(trace = FALSE)))
        if(class(fit) != "try-error"){
            spec.new <- ugarchspec(variance.model = list(model = "eGARCH", garchOrder = c(1,1)), mean.model = list(armaOrder = c(1,0), include.mean = TRUE), fixed.pars = coef(fit))
             sig.est[i] <- as.numeric(tail(sigma(ugarchfilter(spec = spec.new, data = dat)),1))
            rm(spec.new)
            rm(fit)
            gc()
        }else{
            sig.est[i] <- NA
        }
    }
    save(sig.est, file = paste("egarch", names(tst.xts)[j], ".RData", sep = ""))
}
  

Комментарии:

1. Просто чтобы убедиться, что память — единственная проблема, ваш код работает нормально, если вы уменьшите количество параметров ниже 6000? Если он запускается, сколько параметров вы можете установить, прежде чем возникнут проблемы?

2. Сложно определить, где находится ограничение, но цикл будет работать нормально, если вы сократите внутренние итерации. Итак, если я изменю итерации внутреннего цикла с 1: 6000 на 5990: 6000, он работает нормально.

Ответ №1:

При изменении типов данных с xts на числовые проблема исчезла, и скорость обработки резко возросла. (Оглядываясь назад, кажется очевидным)