Я подгоняю серию многоуровневых логистических регрессий , используя rstan
через функцию map2stan
в библиотеке rethinking
.Все отлично работает, а модели все подходят правильно и сходятся.Однако наборы данных, с которыми я работаю, очень велики, поэтому время выполнения для каждой модели достаточно велико (порядка нескольких дней).Следовательно, я ищу любые возможные ускорения, которые я могу найти.
В настоящее время мои данные хранятся в data.frames
, которые имеют одинаковую структуру с масштабированными непрерывными переменными и категориальными переменными, разделенными на 0/1 манекенов.Например:
> str(dcc.s.dummy)
'data.frame': 85604 obs. of 34 variables:
$ COST_DIST_ECOTONE : num -0.594 -0.593 -0.596 -0.591 -0.591 ...
$ COST_DIST_HEA : num -0.663 -0.66 -0.672 -0.652 -0.65 ...
$ COST_DIST_HISTOSOLS : num -2.09 -2.09 -2.09 -2.09 -2.09 ...
$ COST_DIST_MEDSTR : num -0.178 -0.176 -0.177 -0.176 -0.174 ...
$ COST_DIST_RIV_COAST : num 0.34 0.337 0.335 0.341 0.338 ...
$ DEM30_ASP_RE_2 : num 0 0 0 0 0 1 0 0 0 0 ...
$ DEM30_ASP_RE_3 : num 0 0 0 0 0 0 0 0 0 0 ...
$ DEM30_ASP_RE_4 : num 1 0 0 1 0 0 0 0 0 1 ...
$ DEM30_ASP_RE_5 : num 0 1 0 0 1 0 0 0 0 0 ...
$ DEM30_M : num 2.19 2.19 2.2 2.18 2.19 ...
$ DEM30_SLOPE : num -0.797 -0.782 -0.839 -0.817 -0.76 ...
$ DRIFT_THICK_1 : num 0 0 0 0 0 0 0 0 0 0 ...
$ DRIFT_THICK_2 : num 0 0 0 0 0 0 0 0 0 0 ...
$ DRIFT_THICK_3 : num 1 1 1 1 1 1 1 1 1 1 ...
$ DRIFT_THICK_4 : num 0 0 0 0 0 0 0 0 0 0 ...
$ LOC_REL_RE : num -0.862 -0.857 -0.857 -0.845 -0.84 ...
$ LOC_SD_SLOPE : num -1.08 -1.08 -1.08 -1.06 -1.06 ...
$ SITE_NONSITE : int 0 0 0 0 0 0 0 0 0 0 ...
$ SSURGO_ESRI_DRAINAGE_RE_2: num 0 0 0 0 0 0 0 0 0 0 ...
$ SSURGO_ESRI_DRAINAGE_RE_3: num 0 0 0 0 0 0 0 0 0 0 ...
$ SSURGO_ESRI_DRAINAGE_RE_4: num 0 0 0 0 0 0 0 0 0 0 ...
$ SSURGO_ESRI_DRAINAGE_RE_5: num 0 1 1 0 1 1 0 0 0 0 ...
$ SSURGO_ESRI_DRAINAGE_RE_6: num 1 0 0 1 0 0 1 1 1 1 ...
$ SSURGO_ESRI_DRAINAGE_RE_7: num 0 0 0 0 0 0 0 0 0 0 ...
$ SSURGO_ESRI_EROSION_RE_2 : num 1 0 0 1 0 0 1 1 1 1 ...
$ SSURGO_ESRI_EROSION_RE_3 : num 0 0 0 0 0 0 0 0 0 0 ...
$ SSURGO_ESRI_EROSION_RE_4 : num 0 0 0 0 0 0 0 0 0 0 ...
$ SSURGO_ESRI_EROSION_RE_5 : num 0 0 0 0 0 0 0 0 0 0 ...
$ SSURGO_ESRI_LOC_DIV : num -0.184 -0.22 -0.168 -0.316 -0.322 ...
$ SSURGO_ESRI_NATIVEVEG_2 : num 0 0 0 0 0 0 0 0 0 0 ...
$ SSURGO_ESRI_NATIVEVEG_3 : num 0 0 0 0 0 0 0 0 0 0 ...
$ SSURGO_ESRI_NATIVEVEG_4 : num 0 0 0 0 0 0 0 0 0 0 ...
$ SSURGO_PH : num 0.86 0.632 0.518 0.86 0.518 ...
$ WATERSHED_INDEX : int 3 3 3 3 3 3 3 3 3 3 ...
Преобразование data.frame
в matrix
с использованием data.matrix(frame, rownames.force = NA)
или аналогичного уменьшит количество времени, которое требуется rstan
/ map2stan
для завершения выборки исоответствовать модели?
Я сталкивался с аргументом в ряде мест, в которых операции, выполняемые над матрицами, обычно выполняются быстрее, чем операции с data.frames.Rstan
делает все это тяжело в c ++, так что, насколько я знаю, он все равно выполняет подобное преобразование в рамках своих операций.Любые идеи или рекомендации будут оценены.