Try-catch замедление симуляции линейных смешанных эффектов - PullRequest
0 голосов
/ 23 октября 2018

Я моделирую линейные смешанные эффекты в R, но иногда модель не сходится.Поэтому я обертываю его в функцию try, чтобы моделирование продолжалось, даже если модель не работает.Тем не менее, моя симуляция очень медленная, и я думаю, что это из-за моего кода.Я обертываю модель в try, и если она сработает, то снова делаю модель, которая, как я знаю, пожирает мое время.Должен быть лучший способ сделать это.Есть идеи?

Вот пример кода:

set.seed(16420)
y=rnorm(10000,100,15)
x=rnorm(10000,100,15)
t=rep(seq(1,100,1),100)
i=sort(rep(seq(1,100,1),100))
my.data=data.frame(i,t,x,y)
if(!inherits(try(lme(y~x+t,random=~x+t|i,data=my.data),
                 silent=T),"try-error"))
{
  m1=lme(y~x+t,random=~x+t|i,data=my.data)
}
summary(m1)

1 Ответ

0 голосов
/ 26 октября 2018

Простой первый шаг, который вы можете сделать, чтобы ускорить ваш код (почти на 100%), - это не запускать модель lme() дважды;присвойте результат try(lme(...)) m1 и , а затем test, чтобы увидеть, если он наследует ошибку;сравните ваш код сверху (помещенный в функцию) с функцией с таким подходом:

sim_slow <- function() {
    y=rnorm(10000,100,15)
    x=rnorm(10000,100,15)
    t=rep(seq(1,100,1),100)
    i=sort(rep(seq(1,100,1),100))
    my.data=data.frame(i,t,x,y)
    if(!inherits(try(nlme::lme(y~x+t,random=~x+t|i,data=my.data), silent=T),"try-error"))
    {
        return(nlme::lme(y~x+t,random=~x+t|i,data=my.data))
    }
    return(NULL)
}

sim_fast <- function(no_warn = TRUE) {
    if ( no_warn ) { # If you also don't want the warnings
        warn_option <- getOption("warn")
        options(warn = -1)
        on.exit(options(warn = warn_option))
    }
    y <- rnorm(10000, 100, 15)
    x <- rnorm(10000, 100, 15)
    t <- rep(seq(1, 100,1), 100)
    i <- sort(rep(seq(1, 100, 1), 100))
    my.data <- data.frame(i, t, x, y)
    m1 <- try(nlme::lme(y ~ x + t, random = ~x + t|i, data = my.data), silent = TRUE)
    return("if"(inherits(m1, "try-error"), NULL, m1))
}

Создано в 2018-10-26 с помощью пакета Представление (v0.2.1)

Теперь давайте посмотрим, есть ли разница в скорости:

set.seed(16420)
system.time(slow_sims <- replicate(10, sim_slow()))
#> Warning in logLik.lmeStructInt(lmeSt, lmePars): Singular precision matrix
#> in level -1, block 1

#> Warning in logLik.lmeStructInt(lmeSt, lmePars): Singular precision matrix
#> in level -1, block 1

#> (Many similar warnings are omitted here for space)

#>    user  system elapsed 
#>  19.612   0.008  19.621
set.seed(16420)
system.time(fast_sims <- replicate(10, sim_fast()))
#>    user  system elapsed 
#>  11.704   0.000  11.703
sum(sapply(slow_sims, is.null))
#> [1] 3
sum(sapply(fast_sims, is.null))
#> [1] 3
all.equal(slow_sims, fast_sims)
#> [1] TRUE

Создано в 2018-10-26 с помощью пакета prex (v0.2.1)

...