如何将 lme 函数应用于数据框的每一列?
how to apply lme function to each column of dataframe?
我正在使用 nlme
包中的 lme
函数,但很难将其应用到我的小标题的每一列。我可以使用单个列成功 运行 它 'manually',但是在尝试使用 purrr::map
时失败了。我觉得有什么东西就在我眼皮底下,但我没有看到。任何帮助将不胜感激。
library(tidyverse)
library(nlme)
# Create Tibble
df <- tibble(
id = rep(1:5, length = 30),
ko = as_factor(rep(c('ctrl', 'ko1', 'ko2', 'ko3', 'ko4', 'ko5'), each = 5)),
marker1 = rnorm(30),
marker2 = rnorm(30)
)
# 'Manual' calculation
df %>% lme(marker1 ~ ko, random = ~1|id, data = .)
# Attempt at calculating lme for each column
df %>% map_if(is_double, ~ lme(.x ~ ko, random = ~ 1|id, data = .))
# Ideal would be to get the tibble of each like:
df %>% summarize(broom.mixed::tidy(lme(marker1 ~ ko, random = ~1|id, data = .)))
这有点棘手,因为 lme
中的公式使用他们自己的 non-standard 评估版本。我会建议
vars <- names(df)[map_lgl(df, is_double)]
(vars
%>% setNames(vars) ## trick for naming results
%>% map(~reformulate("ko", response = .))
%>% map(lme, random = ~1|id, data = df)
%>% map_dfr(broom.mixed::tidy, effects = "fixed", .id = "var")
)
(我不确定 summarize()
在那里做什么?)
如果您使用的是 lme4
包,您可以使用 refit()
函数来更有效地执行此操作 ...
由于 lme()
对其公式参数的解释方式,我认为这不能跨列完成。但是,我们可以将数据转换为更长的格式,以便因变量位于一列中,另一列表示应单独测试这些变量:
library(nlme)
library(tidyverse)
tests <- df %>%
pivot_longer(marker1:marker2, names_to = 'marker') %>%
nest(data = -marker) %>%
rowwise() %>%
mutate(
lme = list(lme(value ~ ko, random = ~ 1|id, data = data)),
result = list(broom.mixed::tidy(lme))
) %>%
unnest(result)
marker data lme effect group term estimate std.error df statistic p.value
<chr> <list> <list> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 marker1 <tibble> <lme> fixed fixed (Inte… 2.00e-1 0.394 20 0.506 0.618
2 marker1 <tibble> <lme> fixed fixed koko1 3.46e-1 0.558 20 0.621 0.542
3 marker1 <tibble> <lme> fixed fixed koko2 -7.70e-1 0.558 20 -1.38 0.183
4 marker1 <tibble> <lme> fixed fixed koko3 1.56e-2 0.558 20 0.0281 0.978
5 marker1 <tibble> <lme> fixed fixed koko4 1.76e-1 0.558 20 0.316 0.755
6 marker1 <tibble> <lme> fixed fixed koko5 -2.27e-1 0.558 20 -0.408 0.688
7 marker1 <tibble> <lme> ran_pars id sd_(I… 2.03e-5 NA NA NA NA
8 marker1 <tibble> <lme> ran_pars Residual sd_Ob… 8.82e-1 NA NA NA NA
9 marker2 <tibble> <lme> fixed fixed (Inte… 1.75e-1 0.414 20 0.423 0.677
10 marker2 <tibble> <lme> fixed fixed koko1 -1.46e-1 0.542 20 -0.269 0.791
11 marker2 <tibble> <lme> fixed fixed koko2 -4.89e-1 0.542 20 -0.902 0.378
12 marker2 <tibble> <lme> fixed fixed koko3 -6.79e-1 0.542 20 -1.25 0.225
13 marker2 <tibble> <lme> fixed fixed koko4 -5.70e-1 0.542 20 -1.05 0.306
14 marker2 <tibble> <lme> fixed fixed koko5 -5.57e-1 0.542 20 -1.03 0.317
15 marker2 <tibble> <lme> ran_pars id sd_(I… 3.48e-1 NA NA NA NA
16 marker2 <tibble> <lme> ran_pars Residual sd_Ob… 8.58e-1 NA NA NA NA
我正在使用 nlme
包中的 lme
函数,但很难将其应用到我的小标题的每一列。我可以使用单个列成功 运行 它 'manually',但是在尝试使用 purrr::map
时失败了。我觉得有什么东西就在我眼皮底下,但我没有看到。任何帮助将不胜感激。
library(tidyverse)
library(nlme)
# Create Tibble
df <- tibble(
id = rep(1:5, length = 30),
ko = as_factor(rep(c('ctrl', 'ko1', 'ko2', 'ko3', 'ko4', 'ko5'), each = 5)),
marker1 = rnorm(30),
marker2 = rnorm(30)
)
# 'Manual' calculation
df %>% lme(marker1 ~ ko, random = ~1|id, data = .)
# Attempt at calculating lme for each column
df %>% map_if(is_double, ~ lme(.x ~ ko, random = ~ 1|id, data = .))
# Ideal would be to get the tibble of each like:
df %>% summarize(broom.mixed::tidy(lme(marker1 ~ ko, random = ~1|id, data = .)))
这有点棘手,因为 lme
中的公式使用他们自己的 non-standard 评估版本。我会建议
vars <- names(df)[map_lgl(df, is_double)]
(vars
%>% setNames(vars) ## trick for naming results
%>% map(~reformulate("ko", response = .))
%>% map(lme, random = ~1|id, data = df)
%>% map_dfr(broom.mixed::tidy, effects = "fixed", .id = "var")
)
(我不确定 summarize()
在那里做什么?)
如果您使用的是 lme4
包,您可以使用 refit()
函数来更有效地执行此操作 ...
由于 lme()
对其公式参数的解释方式,我认为这不能跨列完成。但是,我们可以将数据转换为更长的格式,以便因变量位于一列中,另一列表示应单独测试这些变量:
library(nlme)
library(tidyverse)
tests <- df %>%
pivot_longer(marker1:marker2, names_to = 'marker') %>%
nest(data = -marker) %>%
rowwise() %>%
mutate(
lme = list(lme(value ~ ko, random = ~ 1|id, data = data)),
result = list(broom.mixed::tidy(lme))
) %>%
unnest(result)
marker data lme effect group term estimate std.error df statistic p.value
<chr> <list> <list> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 marker1 <tibble> <lme> fixed fixed (Inte… 2.00e-1 0.394 20 0.506 0.618
2 marker1 <tibble> <lme> fixed fixed koko1 3.46e-1 0.558 20 0.621 0.542
3 marker1 <tibble> <lme> fixed fixed koko2 -7.70e-1 0.558 20 -1.38 0.183
4 marker1 <tibble> <lme> fixed fixed koko3 1.56e-2 0.558 20 0.0281 0.978
5 marker1 <tibble> <lme> fixed fixed koko4 1.76e-1 0.558 20 0.316 0.755
6 marker1 <tibble> <lme> fixed fixed koko5 -2.27e-1 0.558 20 -0.408 0.688
7 marker1 <tibble> <lme> ran_pars id sd_(I… 2.03e-5 NA NA NA NA
8 marker1 <tibble> <lme> ran_pars Residual sd_Ob… 8.82e-1 NA NA NA NA
9 marker2 <tibble> <lme> fixed fixed (Inte… 1.75e-1 0.414 20 0.423 0.677
10 marker2 <tibble> <lme> fixed fixed koko1 -1.46e-1 0.542 20 -0.269 0.791
11 marker2 <tibble> <lme> fixed fixed koko2 -4.89e-1 0.542 20 -0.902 0.378
12 marker2 <tibble> <lme> fixed fixed koko3 -6.79e-1 0.542 20 -1.25 0.225
13 marker2 <tibble> <lme> fixed fixed koko4 -5.70e-1 0.542 20 -1.05 0.306
14 marker2 <tibble> <lme> fixed fixed koko5 -5.57e-1 0.542 20 -1.03 0.317
15 marker2 <tibble> <lme> ran_pars id sd_(I… 3.48e-1 NA NA NA NA
16 marker2 <tibble> <lme> ran_pars Residual sd_Ob… 8.58e-1 NA NA NA NA