【问题标题】:Why a input value is not picked up by a function为什么输入值不被函数拾取
【发布时间】:2021-05-29 21:21:48
【问题描述】:

我想知道为什么我的 rstatix::get_test_label() 调用会引发错误:stat.test should be an object of class: t_test, ..., anova_test, ...

第一个参数 (stat.test) 实际上是一个 anova_test 作为输入值。有解决办法吗?

library(rstatix)
library(tidyverse)

d <- read.csv("https://raw.githubusercontent.com/rnorouzian/v/main/memory.csv")[-1]
stacked_DVs <- pivot_longer(d, c(MP,SE), names_to = "DV") 
grouped <- stacked_DVs %>% group_by(DV)

res.aov <- anova_test(value ~ Group, data = grouped)

rstatix::get_test_label(stat.test = res.aov, detailed = TRUE) # using `anova_test` as input

#Error in stop_ifnot_class(stat.test, .class = names(allowed.tests)) : 
#  stat.test should be an object of class: t_test, wilcox_test, . . .

【问题讨论】:

    标签: r string function ggplot2 tidyverse


    【解决方案1】:

    问题在于res.aov 将输出作为tibble 类返回,而get_test_label 期望类为anova_testrstatix_test。我们可以将group_split 变为list,在list 元素中单独应用anova_test,然后使用get_test_label,这样属性就不会丢失

    library(dplyr)
    library(purrr)
    stacked_DVs %>% 
       group_split(DV) %>% 
       map(~ .x %>%
                 anova_test(value ~ Group) %>% 
                 rstatix::get_test_label(detailed = TRUE))
    #[[1]]
    #paste("Anova, ", italic("F"), "(2,49)", " = ", "32.12, ", italic("p"), 
    #    " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")
    
    #[[2]]
    #paste("Anova, ", italic("F"), "(2,49)", " = ", "32.67, ", italic("p"), 
    #    " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")
    

    或者另一种选择是nest_by

    out <- stacked_DVs %>%
              nest_by(DV) %>%
              mutate(test = list(anova_test(value ~ Group, data = data)),
                    label = list(get_test_label(test, detailed = TRUE)))
    
     out
    # A tibble: 2 x 4
    # Rowwise:  DV
    #  DV                  data test             label     
    #  <chr> <list<tbl_df[,2]>> <list>           <list>    
    #1 MP              [52 × 2] <anova_test[,7]> <language>
    #2 SE              [52 × 2] <anova_test[,7]> <language>
    
    
    out$label
    #[[1]]
    #paste("Anova, ", italic("F"), "(2,49)", " = ", "32.12, ", italic("p"), 
    #    " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")
    
    #[[2]]
    #paste("Anova, ", italic("F"), "(2,49)", " = ", "32.67, ", italic("p"), 
    #    " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")
    

    检查 OP 对象的class

    class(res.aov)
    #[1] "tbl_df"     "tbl"        "data.frame"
    
    class(out$test[[1]])
    #[1] "anova_test"   "data.frame"   "rstatix_test"
    class(out$test[[2]])
    #[1] "anova_test"   "data.frame"   "rstatix_test"
    

    如果我们对未分组的数据执行此操作,class 属性将为anova_testrstatix_test

    stacked_DVs %>% 
         anova_test(value ~ Group) %>% 
         class
    #[1] "anova_test"   "data.frame"   "rstatix_test"
    

    这与anova_test 处理grouped_df 的方式有关。这是源代码中的 sn-p,它执行if/else

    anova_test
    ...
    ...
    
      if (is_grouped_df(data)) {
            results <- data %>% doo(~.anova_test(data = ., .args = .args, 
                effect.size = effect.size, error = error, observed = observed, 
                detailed = detailed), result = "anova")
            if ("anova" %in% colnames(results)) {
                results <- results %>% mutate(anova = map(.data$anova, 
                    .append_anova_class))
            }
        }
        else {
            results <- .anova_test(data, .args = .args, effect.size = effect.size, 
                error = error, observed = observed, detailed = detailed) %>% 
                .append_anova_class()
        }
    

    所以,如果我们想使用doo,那么将输出放在list

    stacked_DVs %>%
        group_by(DV) %>% 
        doo(~list(anova_test(value ~ Group, data = .))) %>%
        mutate(label = map(`.results.`, ~ get_test_label(.x[[1]], detailed = TRUE))) %>%
        pull(label)
    #[[1]]
    #paste("Anova, ", italic("F"), "(2,49)", " = ", "32.12, ", italic("p"), 
    #    " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")
    
    #[[2]]
    #paste("Anova, ", italic("F"), "(2,49)", " = ", "32.67, ", italic("p"), 
    #    " = ", "<0.0001", paste(", ", eta["g"]^2, " = ", 0.57), "")
    

    【讨论】:

    • @rnorouzian 你能检查更新的答案吗?抱歉,不知怎的,我以为您之前使用的是相同的分组
    • @rnorouzian 好像被删除了
    • 抱歉,我只需要使用:: :) 谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2018-12-11
    • 2015-11-17
    相关资源
    最近更新 更多