使用 tidyverse 和 broom 包在具有多个变量/指标的多个组中进行两个样本 t 检验
Two sample t-test in multiple groups with multiple variables / metrics using tidyverse and broom package
使用以下数据
df <- data.frame(category = sample(1:3, replace = TRUE, 50),
testgroup = sample(c('A', 'B'), replace = TRUE, 50),
var_1 = rnorm(50),
var_2 = rnorm(50),
var_3 = rnorm(50)
)
我想在每个类别中应用 2 样本 t 检验,比较 A 和 B 之间关于所有 3 个变量的均值差异。
理想情况下,输出是使用 tidyverse 和 broom 包生成的。
我在拆分-应用-组合方法上苦苦挣扎了太久,我想已经有了一个不错的解决方案,只需几行代码。
非常感谢您的支持!
一般的经验法则是在 side-by-side 列中获取所需函数的参数(在本例中为 t.test
)。对于您的情况,我们的目标是 A
和 B
并排:
X <- df %>% group_by( category, testgroup ) %>%
summarize( across(starts_with("var"), list) ) %>%
ungroup() %>%
pivot_longer( starts_with("var"), "variable", values_to="values" ) %>%
pivot_wider( names_from="testgroup", values_from="values" )
# # A tibble: 9 x 4
# category variable A B
# <int> <chr> <list> <list>
# 1 1 var_1 <dbl [3]> <dbl [3]>
# 2 1 var_2 <dbl [3]> <dbl [3]>
# 3 1 var_3 <dbl [3]> <dbl [3]>
# 4 2 var_1 <dbl [11]> <dbl [9]>
# 5 2 var_2 <dbl [11]> <dbl [9]>
# ...
我们现在可以很好地应用 two-sample t-test 并使用 broom
:
处理结果
X %>% mutate(test = map2(A, B, t.test),
result = map(test, broom::tidy) ) %>%
unnest( result )
# # A tibble: 9 x 15
# category variable A B test estimate estimate1 estimate2 statistic
# <int> <chr> <lis> <lis> <lis> <dbl> <dbl> <dbl> <dbl>
# 1 1 var_1 <dbl… <dbl… <hte… 1.07 0.400 -0.665 1.08
# 2 1 var_2 <dbl… <dbl… <hte… -0.376 0.350 0.726 -0.415
# 3 1 var_3 <dbl… <dbl… <hte… -0.701 -0.102 0.599 -0.434
# 4 2 var_1 <dbl… <dbl… <hte… -0.276 -0.335 -0.0587 -0.531
# 5 2 var_2 <dbl… <dbl… <hte… 0.727 0.689 -0.0374 1.74
# ...
使用以下数据
df <- data.frame(category = sample(1:3, replace = TRUE, 50),
testgroup = sample(c('A', 'B'), replace = TRUE, 50),
var_1 = rnorm(50),
var_2 = rnorm(50),
var_3 = rnorm(50)
)
我想在每个类别中应用 2 样本 t 检验,比较 A 和 B 之间关于所有 3 个变量的均值差异。
理想情况下,输出是使用 tidyverse 和 broom 包生成的。
我在拆分-应用-组合方法上苦苦挣扎了太久,我想已经有了一个不错的解决方案,只需几行代码。
非常感谢您的支持!
一般的经验法则是在 side-by-side 列中获取所需函数的参数(在本例中为 t.test
)。对于您的情况,我们的目标是 A
和 B
并排:
X <- df %>% group_by( category, testgroup ) %>%
summarize( across(starts_with("var"), list) ) %>%
ungroup() %>%
pivot_longer( starts_with("var"), "variable", values_to="values" ) %>%
pivot_wider( names_from="testgroup", values_from="values" )
# # A tibble: 9 x 4
# category variable A B
# <int> <chr> <list> <list>
# 1 1 var_1 <dbl [3]> <dbl [3]>
# 2 1 var_2 <dbl [3]> <dbl [3]>
# 3 1 var_3 <dbl [3]> <dbl [3]>
# 4 2 var_1 <dbl [11]> <dbl [9]>
# 5 2 var_2 <dbl [11]> <dbl [9]>
# ...
我们现在可以很好地应用 two-sample t-test 并使用 broom
:
X %>% mutate(test = map2(A, B, t.test),
result = map(test, broom::tidy) ) %>%
unnest( result )
# # A tibble: 9 x 15
# category variable A B test estimate estimate1 estimate2 statistic
# <int> <chr> <lis> <lis> <lis> <dbl> <dbl> <dbl> <dbl>
# 1 1 var_1 <dbl… <dbl… <hte… 1.07 0.400 -0.665 1.08
# 2 1 var_2 <dbl… <dbl… <hte… -0.376 0.350 0.726 -0.415
# 3 1 var_3 <dbl… <dbl… <hte… -0.701 -0.102 0.599 -0.434
# 4 2 var_1 <dbl… <dbl… <hte… -0.276 -0.335 -0.0587 -0.531
# 5 2 var_2 <dbl… <dbl… <hte… 0.727 0.689 -0.0374 1.74
# ...