1

我正在尝试以整洁的方式引导由多个变量分组的双变量相关性。到目前为止,我有:

paks <- c('dplyr','tidyr','broom')
lapply(paks, require, character.only=TRUE)
set.seed(123)

df <- data.frame(
  rep(c('group1','group2','group3','group4'),25),
  rep(c('subgroup1','subgroup2','subgroup3','subgroup4'),25),
  rnorm(25),
  rnorm(25)
)
colnames(df) <- c('group','subgroup','v1','v2') 

cors_boot <- df %>%
  group_by(., group,subgroup) %>% 
  bootstrap(., 10) %>% 
  do(tidy(cor.test(.$v1,.$v2)))
cors_boot

这将成功运行 10 次复制,但不会保持group_by条件。任何帮助,将不胜感激。

4

2 回答 2

4

一种选择是使用嵌套的 tibbles(nest()从 tidyr 使用)并使用 purrr 包中的函数进行迭代。这是一个例子:

df %>% 
  nest(-group, -subgroup) %>% 
  mutate(cors_boot = map(data, ~ bootstrap(., 10) %>% do(tidy(cor.test(.$v1,.$v2))))) %>% 
  unnest(cors_boot)
#> # A tibble: 40 × 11
#>     group  subgroup replicate   estimate statistic    p.value parameter
#>    <fctr>    <fctr>     <int>      <dbl>     <dbl>      <dbl>     <int>
#> 1  group1 subgroup1         1 0.30199080 1.5192285 0.14233305        23
#> 2  group1 subgroup1         2 0.24782068 1.2267744 0.23231801        23
#> 3  group1 subgroup1         3 0.05697887 0.2737057 0.78675375        23
#> 4  group1 subgroup1         4 0.14141925 0.6851084 0.50012255        23
#> 5  group1 subgroup1         5 0.14769543 0.7161768 0.48109119        23
#> 6  group1 subgroup1         6 0.23407050 1.1546390 0.26009439        23
#> 7  group1 subgroup1         7 0.09388988 0.4522780 0.65530564        23
#> 8  group1 subgroup1         8 0.38602977 2.0068956 0.05665478        23
#> 9  group1 subgroup1         9 0.20248790 0.9916399 0.33169177        23
#> 10 group1 subgroup1        10 0.27430083 1.3679706 0.18453909        23
#> # ... with 30 more rows, and 4 more variables: conf.low <dbl>,
#> #   conf.high <dbl>, method <fctr>, alternative <fctr>

请注意,除了加载 purrr 包之外,数据设置都是相同的:

paks <- c('dplyr','tidyr','broom','purrr')
lapply(paks, require, character.only=TRUE)
set.seed(123)

df <- data.frame(
  rep(c('group1','group2','group3','group4'),25),
  rep(c('subgroup1','subgroup2','subgroup3','subgroup4'),25),
  rnorm(25),
  rnorm(25)
)
colnames(df) <- c('group','subgroup','v1','v2') 

另外,如果它们对你来说是新的,我在一些博客文章中写了一些关于嵌套小标题的文章。例如,这里

于 2017-03-24T03:54:02.890 回答
3

似乎在bootstrap函数之后,它是由引导程序分组replicates而不是groupsubgroup

df %>%
    group_by(group,subgroup) %>% 
    bootstrap(10, by_group=TRUE)
# Source: local data frame [100 x 4]
# Groups: replicate [10]

因此,您将需要在之后再次重新组合bootstrap(请注意,您的v1and v2indf已被回收,因此对于 and 的每个组合返回的值都是cor.test相同的。我更改了,并且在下面的示例中作为健全性检查)groupsubgroupv1v2

set.seed(123)
df <- data.frame(
    group=rep(c('group1','group2','group3','group4'), 25),
    subgroup=rep(c('subgroup1','subgroup2','subgroup3','subgroup4'), 25),
    v1=rnorm(100),
    v2=rnorm(100)
)

cors_boot <- df %>%
    group_by(group,subgroup) %>% 
    bootstrap(10, by_group=TRUE) %>% 
    group_by(group, subgroup) %>% #add in this line to make your code work
    do(tidy(cor.test(.$v1,.$v2)))
cors_boot
于 2017-03-24T01:18:37.907 回答