Команда для подмножества таблицы data.table: эквивалентные формулировки

Эти три команды возвращают один и тот же результат (регрессия по подмножеству наблюдений). Я хотел бы знать, есть ли важные различия в том, что действительно делает data.table в фоновом режиме.

suppressMessages(library("data.table"))
suppressMessages(library("biglm"))
N=1e7; K=100
set.seed(1)
DT <- data.table(
  id = 1:N,
  v1 =  sample(5, N, TRUE),                          # int in range [1,5]
  v2 =  sample(1e6, N, TRUE),                        # int in range [1,1e6]
  v3 =  sample(round(runif(100,max=100),4), N, TRUE) # numeric e.g. 23.5749
)
DT[, condition := id>100]

# fist command
coefficients(biglm(v3 ~ v2 + v1, DT[id>100, c("v1", "v2", "v3"), with = FALSE]))

# second command
DT[ id >100, coefficients(biglm(v3 ~ v2 + v1, .SD)), .SDcols = c("v1", "v2", "v3")]

# third command
DT[, coefficients(biglm(v3 ~ v2 + v1, .SD)), by = condition, .SDcols = c("v1", "v2", "v3")]

Если я запускаю каждую команду в новом сеансе R, кажется, что время, затрачиваемое каждой командой, одинаково. Все ли эти команды эквивалентны с точки зрения памяти / скорости в более общей ситуации? Спасибо!


person Matthew    schedule 01.10.2014    source источник


Ответы (1)


Слишком долго для комментария ....

первая команда

  • Создает явную временную копию DT, где id ›100
  • Не создает коэффициентов для id ‹= 100
  • создает логический вектор длины N и использует векторное сканирование для подмножества

Вторая команда

  • создает неявную копию DT, где id ›100
  • создает логический вектор длины N и использует векторное сканирование для подмножества
  • Не создает коэффициентов для id ‹= 100

Третья команда

  • создает неявные копии DT, где id ›100 и id‹ = 100 (только с использованием памяти для большего размера)
  • создает два набора коэффициентов.

С точки зрения скорости, я бы подумал, что обработка biglm будет медленной (по сравнению с любым использованием data.table).

Вы можете увеличить скорость, установив ключ на condition (однако это займет время). Если вам нужно использовать это условие в целом для подмножества, это может оказаться полезным.

eg.

setkey(DT, condition)

Затем вы можете использовать двоичный поиск для извлечения данных по условию

DT[.(TRUE)]
DT[.(FALSE)]

Они будут быстрее и эффективнее с точки зрения памяти.

Возможно, стоит изучить обработку подмножеств данных с помощью update, чтобы добавить их в biglm. Посмотрите на использование profr или utils::Rprof (см. Как эффективно использовать Rprof в R?) и документация.

person mnel    schedule 01.10.2014