Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在大数据帧中加速子群建模_R_Performance_Mixed Models - Fatal编程技术网

R 在大数据帧中加速子群建模

R 在大数据帧中加速子群建模,r,performance,mixed-models,R,Performance,Mixed Models,我需要使用glmer对大型数据集的许多不同子组执行分析,并且只提取每个模型的估计值和z值。如果我只使用我的数据的一小部分或一些伪数据(如下面所附),那么这种方法非常有效,但是当我尝试包含整个数据集时,它会花费很长时间。目前我正在使用以下代码: slope_range <- df %>% group_by(region, year, species) %>% summarise(slope = coef(summary(glmer(presence ~ transect

我需要使用glmer对大型数据集的许多不同子组执行分析,并且只提取每个模型的估计值和z值。如果我只使用我的数据的一小部分或一些伪数据(如下面所附),那么这种方法非常有效,但是当我尝试包含整个数据集时,它会花费很长时间。目前我正在使用以下代码:

slope_range <- df %>%
  group_by(region, year, species) %>%
  summarise(slope = coef(summary(glmer(presence ~ transect + (1 | road), family = "binomial")))[2],
            p_val = coef(summary(glmer(presence ~ transect + (1 | road), family = "binomial")))[6])

您正在呼叫coefsummaryglmer。。。每个组两次,因此可以通过拟合模型并为每个组提取一次系数,将执行时间大致减少一半。下面的代码将提取所有系数及其Z和p值,而不仅仅是您指定的两个值,如果您以后可能需要它们,我认为这是最好的。当然,它可以很容易地修改为丢弃其他系数,只保留指定的两个系数

密码 输出 您正在呼叫coefsummaryglmer。。。每个组两次,因此可以通过拟合模型并为每个组提取一次系数,将执行时间大致减少一半。下面的代码将提取所有系数及其Z和p值,而不仅仅是您指定的两个值,如果您以后可能需要它们,我认为这是最好的。当然,它可以很容易地修改为丢弃其他系数,只保留指定的两个系数

密码 输出 您可以使用前面建议的并行方法,例如,在我的6核机器上使用超过4个核的parallel::mclappy只提供了少量的改进。 您可以使用nAGQ=0来加速glmer,但要以精度为代价,请参见。 带有基准的示例代码:

隐形LApplyLME4,data.table,tidyverse,平行,微基准, require,character.only=TRUE >装载所需包装:lme4 >加载所需包:矩阵 >加载所需包:data.table >装载所需包裹:tidyverse >加载所需包:并行 >加载所需包:microbenchmark df% summariseslope=coefsummaryglmerpresence~横断面+1 |道路,家庭=二项式[2], p|val=同一物种的总体存在~横断面+1 |道路,家族=二项[6] } gf2多核.nAGQ0 132.3356 132.9963 137.2777 135.8659 141.5145 144.2564 10 >cld >d >c >b >a 您可以使用前面建议的并行方法,例如,在我的6核机器上使用超过4个核的parallel::mclappy只提供了少量的改进。 您可以使用nAGQ=0来加速glmer,但要以精度为代价,请参见。 带有基准的示例代码:

隐形LApplyLME4,data.table,tidyverse,平行,微基准, require,character.only=TRUE >装载所需包装:lme4 >加载所需包:矩阵 >加载所需包:data.table >装载所需包裹:tidyverse >加载所需包:并行 >加载所需包:microbenchmark df% summariseslope=coefsummaryglmerpresence~横断面+1 |道路,家庭=二项式[2], p|val=同一物种的总体存在~横断面+1 |道路,家族=二项[6] } gf2多核.nAGQ0 132.3356 132.9963 137.2777 135.8659 141.5145 144.2564 10 >cld >d >c >b >a
有多少地区、年份、物种的独特组合?如果这个数字很大,最好的办法是利用某种类型的并行计算包,并根据这些组合的某些分区来分发计算。尽管如此,您在代码中对每个模型进行了两次拟合,在摘要中调用了两次glmer,因此您可以通过只调用一次并保存两个感兴趣的值,将时间几乎缩短一半。我不是tidyverse的用户,但我相信tibble的一个元素可以是一个列表,这将是保存两者的一种方法。大约有4500个组合,因为有许多不同的物种。。。我确实注意到我运行了两次该命令,但不确定如何避免它@qdread的回答解决了这个问题。我不是R等方面的专家,但我一定会按照你的建议研究并行计算包——非常感谢!关于@ClancyStats注释,您可以尝试使用furr包,如果使用purrr函数编写,它可以相当轻松地并行化您的tidyverse代码,而不改变语法。这太棒了,非常感谢!我唯一的问题是:只有在使用lmor glm的情况下,我才能用purrr编写代码,一旦我尝试使用lmer,我就会出现一个错误-你知道这是否是一个普遍的问题吗?我不确定你的错误来自何方,但你也应该查看仍在开发中的broom.mixed包,它为lme4函数创建的模型对象类提供了tidyverse方法:有多少区域、年份和物种的独特组合?如果这个数字很大,最好的办法是利用某种类型的并行计算包,并根据这些组合的某些分区来分发计算。不管怎样,在调用glmer两次的代码中,每个模型都要拟合两次
总之,您可以通过只调用一次并保存两个感兴趣的值,将时间几乎减少一半。我不是tidyverse的用户,但我相信tibble的一个元素可以是一个列表,这将是保存两者的一种方法。大约有4500个组合,因为有许多不同的物种。。。我确实注意到我运行了两次该命令,但不确定如何避免它@qdread的回答解决了这个问题。我不是R等方面的专家,但我一定会按照你的建议研究并行计算包——非常感谢!关于@ClancyStats注释,您可以尝试使用furr包,如果使用purrr函数编写,它可以相当轻松地并行化您的tidyverse代码,而不改变语法。这太棒了,非常感谢!我唯一的问题是:只有在使用lmor glm的情况下,我才能用purrr编写代码,一旦我尝试使用lmer,我就会出现一个错误-你知道这是否是一个普遍的问题吗?我不确定你的错误来自何方,但你也应该查看仍在开发中的broom.mixed包,它为lme4函数创建的模型对象类提供了tidyverse方法:这也很棒,谢谢!很高兴知道有这么多不同的方法可以加快速度。这也很棒,谢谢!很高兴知道有这么多不同的方法可以加快速度。
> dput(df)
structure(list(region = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("ARG", "CHE"), class = "factor"), 
    transect = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 
    2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 
    6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
    10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 
    4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 
    8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 
    2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 
    6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
    10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 
    4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 
    8L, 9L, 10L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 1L, 
    2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), presence = c(1L, 1L, 
    1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 
    0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 
    0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 
    1L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 
    1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L, 0L, 
    1L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 
    0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 
    0L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 
    0L, 1L, 1L, 1L, 0L, 1L, 0L, 0L), year = c(2007L, 2007L, 2007L, 
    2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 
    2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 
    2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 
    2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 
    2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 
    2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 
    2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 
    2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 2007L, 
    2007L, 2007L, 2007L, 2007L, 2007L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 
    2017L, 2017L, 2017L, 2017L), species = structure(c(1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor"), 
    road = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 
    4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L
    ), .Label = c("FG", "MK", "PL", "XY"), class = "factor")), class = "data.frame", row.names = c(NA, 
-160L))
library(tidyverse)
library(lme4)

df %>%
  group_by(region, year, species) %>%
  group_modify(~ data.frame(variable = c('Intercept', 'transect'), 
                            coef(summary(glmer(presence ~ transect + (1 | road), family = "binomial", data = .)))))
# A tibble: 16 x 8
# Groups:   region, year, species [8]
   region  year species variable  Estimate Std..Error z.value Pr...z..
   <fct>  <int> <fct>   <fct>        <dbl>      <dbl>   <dbl>    <dbl>
 1 ARG     2007 a       Intercept    6.11       2.81     2.17   0.0300
 2 ARG     2007 a       transect    -0.743      0.361   -2.06   0.0398
 3 ARG     2007 b       Intercept    1.91       1.22     1.57   0.116 
 4 ARG     2007 b       transect    -0.396      0.208   -1.90   0.0570
 5 ARG     2017 a       Intercept    3.95       1.73     2.28   0.0223
 6 ARG     2017 a       transect    -0.654      0.275   -2.38   0.0174
 7 ARG     2017 b       Intercept    2.44       1.33     1.83   0.0668
 8 ARG     2017 b       transect    -0.396      0.208   -1.90   0.0570
 9 CHE     2007 a       Intercept    3.95       1.73     2.28   0.0223
10 CHE     2007 a       transect    -0.654      0.275   -2.38   0.0174
11 CHE     2007 b       Intercept    2.44       1.33     1.83   0.0668
12 CHE     2007 b       transect    -0.396      0.208   -1.90   0.0570
13 CHE     2017 a       Intercept    6.11       2.81     2.17   0.0300
14 CHE     2017 a       transect    -0.743      0.361   -2.06   0.0398
15 CHE     2017 b       Intercept    1.91       1.22     1.57   0.116 
16 CHE     2017 b       transect    -0.396      0.208   -1.90   0.0570