rstan是否可以将数据存储为矩阵或data.frame来更快地拟合模型?

时间:2018-12-14 19:15:09

标签: r dataframe matrix logistic-regression rstan

我通过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 ++中完成了所有繁重的工作,所以据我所知,作为其操作的一部分,它已经在进行类似的转换。任何见识或建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果运行时约为几天,并且编译时间约为一分钟,则您不会注意到第一次在R端执行任何操作所需的时间,包括数据是以矩阵形式存储还是以矩阵形式存储? data.frame。

换句话说,在这种情况下,您应该更加担心的是,我的rethinking::map2stan生成的Stan代码是否效率低下,而不是重新思考中的数据处理代码效率低下。由于重新整理并未针对您的用例进行优化,因此 rstanarm brms 或手写的Stan代码很有可能---特别是利用线性代数而不是rethinking::map2stan生成的更标量代数代码---将运行得更快。