используя прогноз lmer в data.table - PullRequest
1 голос
/ 21 февраля 2020
  library(lme4)
  library(data.table)
  library(dplyr)

  d = data.frame(x = rep(1:100, times = 3),
                 y = NA,
                 grp = rep(1:3, each = 100))

  d$y[d$grp == 1] = 1:100 + rnorm(100)
  d$y[d$grp == 2] = 1:100 * 1.5 + rnorm(100)
  d$y[d$grp == 3] = 1:100 * 0.5 + rnorm(100)

  fit = lmer(y ~ x + (x|grp), data = d)

  new.data <- data.frame(x = 1:100, grp = rep(1:3, each = 100))
  new.data1 = new.data %>% dplyr::mutate(grp = 1)
  new.data2 = new.data %>% dplyr::mutate(grp = 3)

  temp <- new.data %>% 
          dplyr::mutate(predV1 = predict(fit, newdata = new.data1, allow.new.levels = TRUE),
                        predV2 = predict(fit, newdata = new.data2, allow.new.levels = TRUE))

У моего фактического new.data гораздо больше предикторов, групп, больше наблюдений для прогнозирования (~ 10000 строк), и, следовательно, вышеупомянутые решения dplyr занимают около 34 секунд. Мне было интересно, можно ли использовать функцию предсказать lmer с data.table, чтобы ускорить ее.

1 Ответ

0 голосов
/ 21 февраля 2020

Если нам нужен подобный подход в data.table, преобразуйте в data.table (setDT) и присвойте (:=) вывод predict новым столбцам 'predV1', 'predV2'

library(data.table)
setDT(new.data)[, c('predV1', 'predV2') :=
     .(predict(fit, newdata = new.data1, allow.new.levels = TRUE), 
       predict(fit, newdata = new.data2, allow.new.levels = TRUE))]
...