【问题标题】:grouped statistical test tidyverse分组统计测试 tidyverse
【发布时间】:2019-09-26 18:29:28
【问题描述】:

我正在尝试对长格式数据进行 Wilcoxon 测试。我想使用dplyr::group_by() 来指定我想要对其进行测试的子集。

最终结果将是一个新列,其中将 Wilcoxon 检验的 p 值附加到原始数据框中。我见过的所有技术都需要总结数据框。我不想总结数据框。

请查看重新格式化iris 数据集以模仿我的数据的示例,最后是我执行任务的尝试。

我已经接近了,但我想保留 Wilcoxon 测试之前的所有原始数据。

# Reformatting Iris to mimic my data.
long_format <- iris %>% 
  gather(key = "attribute", value = "measurement", -Species) %>%
  mutate(descriptor = 
           case_when(
    str_extract(attribute, pattern = "\\.(.*)") == ".Width" ~ "Width",
    str_extract(attribute, pattern = "\\.(.*)") == ".Length" ~ "Length")) %>%
  mutate(Feature = 
           case_when(
    str_extract(attribute, pattern = "^(.*?)\\.") == "Sepal." ~ "Sepal",
    str_extract(attribute, pattern = "^(.*?)\\.") == "Petal." ~ "Petal"))

# Removing no longer necessary column.
cleaned_up <- long_format %>% select(-attribute)

# Attempt using do(), but I lose important info like "measurement"
cleaned_up %>%
  group_by(Species, Feature) %>%
  do(w = wilcox.test(measurement~descriptor, data=., paired=FALSE)) %>% 
  mutate(Wilcox = w$p.value)

# This is an attempt with the dplyr experimental group_map function. If only I could just make this a new column appended to the original df in one step.

cleaned_up %>%
  group_by(Species, Feature) %>%
  group_map(~ wilcox.test(measurement~descriptor, data=., paired=FALSE)$p.value)

感谢您的帮助。

【问题讨论】:

  • 您只需将group_map 替换为mutate 并将~ 替换为p =
  • @IceCreamToucan 有一个危险,因为它不会与模型保持分组结构cleaned_up %&gt;% group_by(Species, Feature) %&gt;% summarise(pval = wilcox.test(measurement~descriptor, data=., paired=FALSE)$p.value)
  • 啊,你是对的。如果使用我上面提出的修改,您还需要删除 data 参数(不需要,因为变量已经在范围内)

标签: r dplyr statistics


【解决方案1】:

模型对象可以包装在list

library(tidyverse)
cleaned_up %>%
   group_by(Species, Feature) %>%
   nest %>% 
   mutate(model = map(data, ~ 
          .x %>%
           transmute(w = list(wilcox.test(measurement~descriptor, 
               data=., paired=FALSE)))))

或者另一种选择是group_split变成list,然后map通过list,元素应用模型后创建'pval'列

cleaned_up %>% 
    group_split(Species, Feature) %>%
    map_dfr(~ .x %>%
                 mutate(pval = wilcox.test(measurement~descriptor, 
               data=., paired=FALSE)$p.value))

【讨论】:

  • 感谢这些替代​​方法,也许它们在其他情况下可能会变得有用。
【解决方案2】:

另一种选择是完全避免使用数据参数。 wilcox.test 函数仅在被测试的变量不在调用范围内时才需要数据参数,但在 mutate 内调用的函数将数据框中的所有列都包含在范围内。

cleaned_up %>%
  group_by(Species, Feature) %>%
  mutate(pval = wilcox.test(measurement~descriptor, paired=FALSE)$p.value)

与 akrun 的输出相同(感谢他在上面的 cmets 中的更正)

akrun <- 
  cleaned_up %>% 
    group_split(Species, Feature) %>%
    map_dfr(~ .x %>%
                 mutate(pval = wilcox.test(measurement~descriptor, 
               data=., paired=FALSE)$p.value))

me <- 
cleaned_up %>%
  group_by(Species, Feature) %>%
  mutate(pval = wilcox.test(measurement~descriptor, paired=FALSE)$p.value)

all.equal(akrun, me)
# [1] TRUE

【讨论】:

  • 感谢您提供简单的解决方案。我想我想多了-_-
猜你喜欢
  • 2021-05-22
  • 1970-01-01
  • 2023-03-09
  • 2018-07-27
  • 2013-10-10
  • 2020-09-22
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多