2017-03-23 1 views
0

Ich versuche, eine bivariate Korrelation gruppiert von mehreren Variablen in einer sauberen Art und Weise zu erstellen. Bisher habe ich bekam:bootstrapping von mehreren Gruppen in dplyr

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 

Dies wird succesffuly 10 Replikationen laufen, aber die group_by Bedingungen nicht halten. Jede Hilfe wäre willkommen.

Antwort

3

Eine Möglichkeit ist die Verwendung von verschachtelten Tibbles (mit nest() von tidyr) und Iterieren mit Funktionen aus dem purrr Paket zu machen. Hier ein Beispiel:

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> 

Beachten Sie, dass Daten-Setup ist alles gleich, außer der purrr Paket wird auch geladen:

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') 

beiseite, wenn sie neu für Sie sind, dann habe ich ein wenig geschrieben über verschachtelte tibbles in einigen Blog-Posts. Zum Beispiel here.

2

Es scheint, dass nach der bootstrap Funktion, durch Bootstrap replicates statt group und subgroup

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

daher gruppiert ist, müssen Sie wieder neu zu formieren nach bootstrap (pls beachten Sie, dass Ihre v1 und v2 in df wird recycelt, so dass die von cor.test zurückgegebenen Werte für jede Kombination von group und subgroup gleich sind. Ich habe v1 und v2 im Beispiel unten als Plausibilitätsprüfung geändert.

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 
+0

Ich habe ein ähnliches Problem wie das Plakat. Wenn ich Ihre Lösung versuche, wird sie jedoch neu gruppiert. Es scheint, dass die replizierten Datensätze verloren gehen. – RNB

Verwandte Themen