параллельная регрессия в R (возможно, со снегопадом)

Я пытаюсь запустить R параллельно, чтобы запустить регресс. Я пытаюсь использовать библиотеку снегопада (но открыт для любого подхода). В настоящее время я использую следующую регрессию, выполнение которой занимает очень много времени. Может кто-нибудь показать мне, как это сделать?

 sales_day_region_ctgry_lm <- lm(log(sales_out+1)~factor(region_out) 
             + date_vector_out + factor(date_vector_out) +
             factor(category_out) + mean_temp_out)

Я пошел по следующему пути:

library(snowfall)
sfInit(parallel = TRUE, cpus=4, type="SOCK")

wrapper <- function() {
return(lm(log(sales_out+1)~factor(region_out) + date_vector_out +
               factor(date_vector_out) + factor(category_out) +   mean_temp_out))
}

output_lm <- sfLapply(*no idea what to do here*,wrapper)
sfStop()
summary(output_lm)

Но этот подход полон ошибок.

Спасибо!


person nathanf    schedule 11.03.2016    source источник
comment
Это позволит вам повторить одну и ту же модель 4 раза, а не модель, подходящую в 1/4 раза.   -  person Hong Ooi    schedule 11.03.2016
comment
Если lm занимает много времени, это означает, что ваша матрица дизайна огромна, то есть у вас много уровней факторов. Я также немного скептически отношусь к тому, что трансформация, которую вы используете, является наиболее подходящим способом. Внимательно подумайте, является ли обычная регрессия наименьших квадратов лучшим методом для достижения вашей цели.   -  person Roland    schedule 11.03.2016
comment
В частности, включение переменной как в качестве непрерывного предиктора и как факторного предиктора кажется ... назовем это странным ....   -  person Roland    schedule 11.03.2016


Ответы (2)


Пакет partools предлагает простой и удобный -полочная реализация параллельной линейной регрессии с помощью функции calm(). (Префикс «ca» означает «усреднение по порциям».)

В вашем случае - не считая правильного комментария @Roland о смешивании фактора и непрерывных предикторов - решение должно быть таким простым, как:

library(partools)
#library(parallel) ## loads as dependency

cls <- makeCluster(4) ## Or, however many cores you want/have.

sales_day_region_ctgry_calm <- 
  calm(
    cls, 
    "log(sales_out+1) ~ factor(region_out) + date_vector_out + 
     factor(date_vector_out) + factor(category_out) + mean_temp_out, 
     data=YOUR_DATA_HERE"
    )

Обратите внимание, что вызов модели описан в кавычках. Обратите внимание, что вам может потребоваться сначала рандомизировать ваши данные, если они упорядочены каким-либо образом (например, по дате). См. виньетка partools для получения дополнительных сведений.

person Grant    schedule 10.07.2017

Поскольку вы подбираете одну большую модель (в отличие от нескольких маленьких моделей) и используете линейную регрессию, быстрый и простой способ добиться параллелизма - использовать многопоточный BLAS. Что-то вроде Microsoft R Open (ранее известного как Revolution R Open) должно помочь. *

* раскрытие информации: я работаю в Microsoft / Revolution.

person Hong Ooi    schedule 11.03.2016