R: проблемы с построением p-значений из теста Conover (Данн отлично работает)

У меня проблемы с сообщением об ошибке, которое я не могу решить.

Я использую следующий код для запуска Kruskal Wallis в R, а затем выполняю попарное сравнение с использованием Dunn's:

res.kruskal <- mydata %>% kruskal_test(values ~ group)
res.kruskal
stat.test <- mydata %>% dunn_test(values ~ group, p.adjust.method = "hochberg") 
stat.test
stat.test <- stat.test %>% add_xy_position(x = "group")

Затем я использую этот результат, чтобы построить следующие значения:

ggboxplot(mydata, x = "group", y = "values, fill = "group") +
  stat_pvalue_manual(stat.test, hide.ns = FALSE)

И получился симпатичный сюжет (ура!)

введите описание изображения здесь

Но тест прикрытия явно более эффективен и предпочтительнее теста Данна ... (любые мнения по этому поводу тоже приветствуются!). Выполнение следующего кода возвращает ошибку:

res.kruskal <- immdatamed %>% kruskal_test(LplastinTL ~ group)
res.kruskal
attach(immdatamed)
stat.test <- conover.test(LplastinTL, group, method = "hochberg") 
stat.test
stat.test <- stat.test %>% add_xy_position(x = "group")
detach(immdatamed)

stat.test <- stat.test %>% add_xy_position(x = "group")
Error in asserttat_group_columns_exists(test) : 
  data should contain group1 and group2 columns

Я не могу понять этого ... Я могу нормально запустить тест Conover, но не могу решить указанную выше ошибку, чтобы заставить его работать с ggboxplot.

На самом деле я бы предпочел использовать более эстетичные ggplot и geom_boxplot, но вообще не могу заставить их взаимодействовать с Dunn_test ...

Приветствуются любые решения!

Спасибо

P.S. Я использовал это с ggplot: http://www.sthda.com/english/articles/24-ggpubr-publication-ready-plots/76-add-p-values-and-significance-levels-to-ggplots, но мне нужен тест Wilcoxon или t.test для попарного сравнения ...


person Tyrone    schedule 20.05.2020    source источник


Ответы (1)


Это очень долго, чтобы объяснить, что я делаю, так как я полагаю, что у вас нет опыта как с R, так и со статистикой. Я даже не буду объяснять, почему Коновер против Данна - это больше обмен статистикой см. здесь

Пожалуйста, в будущем четко указывайте, какие пакеты вы используете, например, никогда не упоминайте rstatix. включите образец своих данных.

# https://stackoverflow.com/questions/61922336/r-problems-plotting-p-values-from-conover-test-dunns-works-fine
library(dplyr)
library(ggpubr)
library(rstatix)

# I'm going to get the Conover test from this package 

require(DescTools)

# You didn't provide data I will use mtcars

mydata <- mtcars %>% select(mpg, gear)
mydata$gear <- factor(mydata$gear)

# Here's what you were doing

stat.test.dunn <- mydata %>% dunn_test(mpg ~ gear, p.adjust.method = "hochberg") 
stat.test.dunn <- stat.test.dunn %>% add_xy_position(x = "gear")
stat.test.dunn
#> # A tibble: 3 x 13
#>   .y.   group1 group2    n1    n2 statistic       p   p.adj p.adj.signif
#>   <chr> <chr>  <chr>  <int> <int>     <dbl>   <dbl>   <dbl> <chr>       
#> 1 mpg   3      4         15    12      3.76 1.69e-4 5.06e-4 ***         
#> 2 mpg   3      5         15     5      1.65 9.98e-2 2.00e-1 ns          
#> 3 mpg   4      5         12     5     -1.14 2.54e-1 2.54e-1 ns          
#> # … with 4 more variables: y.position <dbl>, groups <named list>, xmin <int>,
#> #   xmax <int>

ggboxplot(mydata, x = "gear", y = "mpg", fill = "gear") +
  stat_pvalue_manual(stat.test.dunn, hide.ns = FALSE)

Вот как мы можем "подделать"


stat.test.Conover <- DescTools::ConoverTest(mpg ~ gear, mydata, method = "hochberg" ) 
stat.test.Conover
#> 
#>  Conover's test of multiple comparisons : hochberg  
#> 
#>     mean.rank.diff    pval    
#> 4-3      13.658333 8.5e-05 ***
#> 5-3       7.966667  0.0767 .  
#> 5-4      -5.691667  0.1434    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
stat.test.Conover[[1]]
#>     mean rank diff         pval
#> 4-3      13.658333 8.490683e-05
#> 5-3       7.966667 7.666748e-02
#> 5-4      -5.691667 1.433731e-01

things_we_want <- rstatix::add_significance(data = as.data.frame(stat.test.Conover[[1]]))
things_we_want
#>   mean rank diff         pval pval.signif
#> 1      13.658333 8.490683e-05        ****
#> 2       7.966667 7.666748e-02          ns
#> 3      -5.691667 1.433731e-01          ns

stat.test.Conover <- stat.test.dunn
stat.test.Conover
#> # A tibble: 3 x 13
#>   .y.   group1 group2    n1    n2 statistic       p   p.adj p.adj.signif
#>   <chr> <chr>  <chr>  <int> <int>     <dbl>   <dbl>   <dbl> <chr>       
#> 1 mpg   3      4         15    12      3.76 1.69e-4 5.06e-4 ***         
#> 2 mpg   3      5         15     5      1.65 9.98e-2 2.00e-1 ns          
#> 3 mpg   4      5         12     5     -1.14 2.54e-1 2.54e-1 ns          
#> # … with 4 more variables: y.position <dbl>, groups <named list>, xmin <int>,
#> #   xmax <int>
stat.test.Conover$p.adj <- things_we_want$pval
stat.test.Conover$p.adj.signif <- things_we_want$pval.signif
stat.test.Conover
#> # A tibble: 3 x 13
#>   .y.   group1 group2    n1    n2 statistic       p   p.adj p.adj.signif
#>   <chr> <chr>  <chr>  <int> <int>     <dbl>   <dbl>   <dbl> <chr>       
#> 1 mpg   3      4         15    12      3.76 1.69e-4 8.49e-5 ****        
#> 2 mpg   3      5         15     5      1.65 9.98e-2 7.67e-2 ns          
#> 3 mpg   4      5         12     5     -1.14 2.54e-1 1.43e-1 ns          
#> # … with 4 more variables: y.position <dbl>, groups <named list>, xmin <int>,
#> #   xmax <int>

ggboxplot(mydata, x = "gear", y = "mpg", fill = "gear") +
  stat_pvalue_manual(stat.test.Conover, hide.ns = FALSE)

person Chuck P    schedule 21.05.2020
comment
Спасибо, Чак Пи, это сработало! Приношу свои извинения за то, что не указал пакет и не предоставил образцы данных. Я сделаю это в будущем. Большое спасибо! Вы сэкономили мне часы моего времени, вручную аннотируя графики. - person Tyrone; 22.05.2020
comment
Более чем добро пожаловать, и мы просим больше информации в основном для того, чтобы мы могли помочь. - person Chuck P; 22.05.2020
comment
Привет, Чак, у меня снова проблема с той же проблемой. Не знаю, в чем проблема. Я скопировал и вставил ваш код и успешно использовал его, но в моем новом проекте он не работает. Как вы думаете, возникнет ли проблема при переходе с ggboxplot на ggdotplot? Код продолжает указывать фактические p-значения, а не обозначения *, взятые из dunn.test. Есть ли способ, которым мы можем общаться, делясь моим текущим кодом, не задавая новый вопрос по этому старому вопросу? Спасибо - person Tyrone; 07.10.2020
comment
Привет, @Tyrone, нет никаких гарантий, когда я смогу взглянуть на него, в приведенном выше коде нет ничего, что полагалось бы на точечные графики, которые работают для обоих. Я бы отправил еще один вопрос и убедился, что вы предоставили нам достаточно ваших реальных данных и кода, чтобы кто-то мог помочь. - person Chuck P; 07.10.2020
comment
Спасибо, Чак. Удалось исправить: тесту Коновера не нравятся строки с NA. Спасибо - person Tyrone; 09.10.2020
comment
Ладно, проблема в том, что мы можем угадать, что это за данные. - person Chuck P; 09.10.2020