Параллельный Уилкокс.тест с использованием группирования и суммирования
Должен быть R-ly способ вызова wilcox.test
по нескольким наблюдениям параллельно с помощью group_by. Я потратил много времени, читая об этом, но все еще не могу понять, какой звонок wilcox.test
делает эту работу. Пример данных и кода ниже, используя каналы magrittr
и summarize()
.
library(dplyr)
library(magrittr)
# create a data frame where x is the dependent variable, id1 is a category variable (here with five levels), and id2 is a binary category variable used for the two-sample wilcoxon test
df <- data.frame(x=abs(rnorm(50)),id1=rep(1:5,10), id2=rep(1:2,25))
# make sure piping and grouping are called correctly, with "sum" function as a well-behaving example function
df %>% group_by(id1) %>% summarise(s=sum(x))
df %>% group_by(id1,id2) %>% summarise(s=sum(x))
# make sure wilcox.test is called correctly
wilcox.test(x~id2, data=df, paired=FALSE)$p.value
# yet, cannot call wilcox.test within pipe with summarise (regardless of group_by). Expected output is five p-values (one for each level of id1)
df %>% group_by(id1) %>% summarise(w=wilcox.test(x~id2, data=., paired=FALSE)$p.value)
df %>% summarise(wilcox.test(x~id2, data=., paired=FALSE))
# even specifying formula argument by name doesn't help
df %>% group_by(id1) %>% summarise(w=wilcox.test(formula=x~id2, data=., paired=FALSE)$p.value)
Вызовы багги приводят к этой ошибке:
Error in wilcox.test.formula(c(1.09057358373486,
2.28465932554436, 0.885617572657959, : 'formula' missing or incorrect
Спасибо за вашу помощь; я надеюсь, что это будет полезно и другим людям с аналогичными вопросами.
2 ответа:
Это можно сделать с помощью базы R (хотя в результате получается громоздкий список):
by(df, df$id1, function(x) { wilcox.test(x~id2, data=x, paired=FALSE)$p.value })
Или с dplyr:
ddply(df, .(id1), function(x) { wilcox.test(x~id2, data=x, paired=FALSE)$p.value }) id1 V1 1 1 0.3095238 2 2 1.0000000 3 3 0.8412698 4 4 0.6904762 5 5 0.3095238
Ваша задача будет легко выполнена с помощью функции do (вызов ?сделайте это после загрузки библиотеки dplyr). Используя ваши данные, цепочка будет выглядеть следующим образом:
df <- data.frame(x=abs(rnorm(50)),id1=rep(1:5,10), id2=rep(1:2,25)) df <- tbl_df(df) res <- df %>% group_by(id1) %>% do(w = wilcox.test(x~id2, data=., paired=FALSE)) %>% summarise(id1, Wilcox = w$p.value)
Вывод
res Source: local data frame [5 x 2] id1 Wilcox (int) (dbl) 1 1 0.6904762 2 2 0.4206349 3 3 1.0000000 4 4 0.6904762 5 5 1.0000000
Примечание я добавил функцию do между group_by и summary .
Надеюсь, это поможет.