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