当使用group_by在R中进行wilcoxon单样本测试时,相同的p值误差



我正在研究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

最新更新