我正在研究1000多个物种的36000个个体的后代性别比的大型数据集。我想看看每个物种的性别比例中位数是否与0.5有显著差异。我用一个样本wilcoxon来做这个。以下是一个示例数据集:
n<-100
dat<-data.frame(species=rep(LETTERS[1:5],n/5), SR=sample((1:100)/100,n,replace=TRUE))
当我运行以下代码时,我会得到所有p值都相同的结果。
library(dyplr)
res <- dat %>% group_by(species) %>%
do(w=wilcox.test(dat$SR,mu=.5,alternative=("two.sided"))) %>%
summarize(species,wilcox=w$p.value)
res
#OUTPUT#
# # A tibble: 5 x 2
species wilcox
<chr> <dbl>
1 A 0.465
2 B 0.465
3 C 0.465
4 D 0.465
5 E 0.465
你知道我做错了什么吗?我该怎么解决这个问题?
函数do()
已被取代,不应再使用。您可以在summarize()
和across()
中执行同样的操作。
首先,您只需按species
分组,然后使用summarize()
中的across()
来访问每组的值,并计算wilcoxon检验,并在表达式末尾使用$p.value
直接提取其p值。
请注意,我设置exact = FALSE
是为了防止计算精确的p值,因为样本太小,否则会生成警告。对于真实数据,如果数据样本较大,则可以排除此语句。有关详细信息,请参阅此信息。
n<-100
dat<-data.frame(species=rep(LETTERS[1:5],n/5), SR=sample((1:100)/100,n,replace=TRUE))
library(dplyr)
dat %>%
group_by(species) %>%
summarize(wilcox = across(SR,
~wilcox.test(.,
mu=.5,
alternative=("two.sided"),
exact = FALSE)$p.value)$SR)
#> # A tibble: 5 × 2
#> species wilcox$SR
#> <chr> <dbl>
#> 1 A 0.737
#> 2 B 0.0105
#> 3 C 0.751
#> 4 D 0.380
#> 5 E 0.614
创建于2022-08-19,reprex v2.0.2