【问题标题】:Is there a way to apply wilcoxon test grouped by site?有没有办法应用按站点分组的 wilcoxon 测试?
【发布时间】:2020-12-08 17:22:13
【问题描述】:

我想对多个组的两个治疗使用 Wilcoxon 2 面检验,即多个样本位点中的每一个都有一个治疗前后 (Conc)。我想按站点将数据集拆分为一个列表,然后应用测试,这样我就可以分别为每个站点提供一个输出,但是,我无法将其设置为可以重复的函数。

我有多个站点 (Site) 和两个级别的处理 (Scenario),得到的分数 (Conc):

'data.frame':   7344 obs. of  6 variables:
 $ Site        : chr  "A" "B" "C" "D" ...
 $ Scenario    : chr  "1" "1" "1" "1" "2" "2" "2" "2" ...
 $ Conc        : num  4.7727 0.055 0.0552 0.055 0.055 ...

每个站点/场景组合中有多个 Conc 数据点 (~60)。我选择 Wilcoxon 检验的原因主要是因为每个站点的处理(方案)之间的样本数量略有不均。

当我将这段代码用于整个数据集时,我得到了一个合理的结果:

t1 <- wilcox.test(Conc ~ Scenario, data = data.frame)
t1

但是,此代码不会对每个站点单独应用测试。

我查看了所有可以找到的类似示例(在 SO 和其他地方),这是我能想到的最好的代码:

t2 = data.frame %>% group_by(Site) %>% do(tidy(wilcox.test(Conc~Scenario, data=data.frame), na.rm=TRUE, equal.var=FALSE))
t2

这段代码为每个站点提供了一个输出,但所有测试输出都是相同的,即使是 p 值:

# A tibble: 107 x 5
# Groups:   Site [107]
   Site     statistic p.value method                                      alternative
   <chr>       <dbl>   <dbl> <chr>                                             <chr>      
 1 A         6145702   0.690 Wilcoxon rank sum test with continuity correction two.sided  
 2 B         6145702   0.690 Wilcoxon rank sum test with continuity correction two.sided  
 3 C         6145702   0.690 Wilcoxon rank sum test with continuity correction two.sided  
 4 D         6145702   0.690 Wilcoxon rank sum test with continuity correction two.sided  
 5 E         6145702   0.690 Wilcoxon rank sum test with continuity correction two.sided  
 6 F         6145702   0.690 Wilcoxon rank sum test with continuity correction two.sided  

谁能看到我做错了什么? 感谢您的帮助

【问题讨论】:

  • 您可以尝试 lapply(split(data.frame, data.frame$Site), function(x) wilcox.test(Conc ~ Scenario, data = x)) 获取所有站点的 Wilcox 测试列表

标签: r pairwise.wilcox.test grouped-list


【解决方案1】:

于 2020 年 8 月 21 日编辑,以更密切地反映您的数据

这是dplyrpurrr 的解决方案已编辑以包含broom::tidy 结果...

# 'data.frame': 5626 obs. of 3 variables: 
# $ Site.Year: Factor w/ 3 levels "Baffle Creek at Newton Road_2018_2019",..: 1 1 1 1 1 1 1 1 1 1 ... 
# $ Scenario : chr "FF_Total" "FF_Total" "FF_Total" "FF_Total" ... 
# $ PAF : num 4.77 4.77 4.77 4.77 4.77

set.seed(2020)

Site.Year <- rep(c("Baffle Creek at Newton Road_2018_2019", 
                   "Baffle Creek at Newton Road_2017_2018", 
                   "Baffle Creek at Newton Road_2019_2020"), 50)
Scenario <- rep_len(c(rep("FF_Total", 4), rep("Not_FF_Total", 4)), 150)
PAF <- rnorm(150, mean = 2.5, sd = 1)

DailyPAF_long <- data.frame(Site.Year, Scenario, PAF)

DailyPAF_long$Site.Year <- factor(DailyPAF_long$Site.Year)
# str(DailyPAF_long)
# wilcox.test(PAF ~ Scenario, data = DailyPAF_long)

library(dplyr)
library(purrr)

DailyPAF_long %>% 
  base::split(Site.Year) %>% 
  purrr::map(~ wilcox.test(PAF ~ Scenario, data = .)) %>% 
  purrr::map_dfr(~ broom::tidy(.)) 

#> # A tibble: 3 x 4
#>   statistic p.value method                       alternative
#>       <dbl>   <dbl> <chr>                        <chr>      
#> 1       361  0.355  Wilcoxon rank sum exact test two.sided  
#> 2       219  0.0723 Wilcoxon rank sum exact test two.sided  
#> 3       380  0.195  Wilcoxon rank sum exact test two.sided

【讨论】:

  • 嗨 Chuck 非常感谢您的回答!我正在尝试您的代码,但我不断收到错误对象“站点”未找到...您认为我需要将任何变量转换为字符吗? 'data.frame':5626 obs。 3 个变量:$ 站点:因子 w/ 3 个级别“A”,..:1 1 1 1 1 1 1 1 1 1 ... $ 场景:因子 w/2 个级别“F”,“N”:1 1 1 1 1 1 1 1 1 1 ... $ 分数:num 4.77 4.77 4.77 4.77 4.77 ...
  • 我绝望地重新启动了 R,但它仍然无法正常工作..
  • 没有任何因素会起作用。我可以看看你正在运行的确切命令吗?这很可能只是生成的错误消息中的命令中的拼写错误。
  • 'data.frame':5626 obs。 3 个变量: $ Site.Year:因子 w/ 3 个级别“Baffle Creek at Newton Road_2018_2019”,..:1 1 1 1 1 1 1 1 1 1 ... $ 场景:chr "FF_Total" "FF_Total" "FF_Total " "FF_Total" ... $ PAF : 数字 4.77 4.77 4.77 4.77 4.77 ...
  • DailyPAF_long %>% split(Site.Year) %>% map(~ wilcox.test(PAF ~ Scenario, data = .)) %>% map_dfr(~ broom::tidy(.) )
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 2020-02-15
  • 2020-04-28
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
相关资源
最近更新 更多