Как визуализировать цикл тестов Уилкоксона в одном аккуратном выводе? - PullRequest
0 голосов
/ 12 апреля 2019

Я выполняю несколько тестов Вилкоксона для подкатегорий моего набора данных.R выполняет эти тесты, но отображает один большой результат для каждого теста.Я бы предпочел иметь один вывод, например, в виде таблицы, в которой аккуратно суммированы все 14 критериев Вилкоксона (имя анализируемого подмножества, значение статистики теста, p-значение, результат, например, альтернативная гипотеза: ...)

Я уже перепробовал много советов, которые нашел в Интернете, но, поскольку я не очень хорошо знаком с RI, не могу проанализировать проблемы, он просто не сработал, и друг сказал мне: «stackoverflow - ваш друг. Попросите помощи!».Можете ли вы помочь мне в дальнейшем?

Best, Roman

Вот код, который я выполняю, чтобы получить мой вывод:

strFlaecheNames<-c(df_summary$Flaeche)
varResult<-array(vector("list",10000),1000)

for(i in 1:14){ 

varResult[i]<-wilcox.test(df1$y,data=df1,subset(df1$y, df1$x ==  strFlaecheNames[i]))

print((wilcox.test(df1$y,data=df1,subset(df1$y, df1$x == strFlaecheNames[i]))))

}

Один из моих 14 выходов выглядит так:

Wilcoxon rank sum test with continuity correction

data:  df1$y and subset(df1$y, df1$x == strFlaecheNames[i])
W = 1170300, p-value = 4.888e-13
alternative hypothesis: true location shift is not equal to 0

Вот пример кода, у меня также есть его в форме представительства, но я вроде не могу опубликовать его, но так как код работает, я думаю, это нормально, чтобы опубликовать его?:

    ed_exp2 <- structure(list(x = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
                                              1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 7L, 7L, 7L, 7L, 7L, 7L,
                                              7L, 7L, 7L, 7L, 7L, 7L, 7L), .Label = c("Area1", "Area10", "Area11",
                                                                                      "Area12", "Area13", "Area14", "Area2", "Area3", "Area4", "Area5",
                                                                                      "Area6", "Area7", "Area8", "Area9"), class = "factor"), y = c(0L,
                                                                                                                                                    0L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 1L, 2L, 1L,
                                                                                                                                                    2L, 0L, 1L, 0L, -2L, 2L, 0L, 2L, 1L, 2L, 2L, -2L, 0L, 0L)), .Names = c("x",
                                                                                                                                                                                                                           "y"), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L,
                                                                                                                                                                                                                                               11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 169L, 170L, 171L, 172L,
                                                                                                                                                                                                                                               173L, 174L, 175L, 176L, 177L, 178L, 179L, 180L, 181L), class = "data.frame")
#load libraries
library("stats")
library("dplyr")
library("ggpubr")
library("tidyverse")
library("reprex")

strAreaNames<-c("Area1","Area2")

##required size of memory for output unclear - therefore "10000),1000)"
varResult<-array(vector("list",10000),1000)
#run wilcox.test
for(i in 1:2){
  varResult[i]<-wilcox.test(ed_exp2$y,data=ed_exp2,subset(ed_exp2$y, ed_exp2$x == strAreaNames[i]))
  print((wilcox.test(ed_exp2$y,data=ed_exp2,subset(ed_exp2$y, ed_exp2$x == strAreaNames[i]))))
}

1 Ответ

0 голосов
/ 16 апреля 2019

Да, большинство статистических функций в R возвращают некий вложенный список, обычно потому, что их вывод сложнее, чем одна строка данных. Пакет метла предназначен для того, чтобы взять основной вывод наиболее распространенных статистических функций (lm и т. Д.) И «привести их» в строку данных.

Если я правильно понимаю, вы хотите проверить, отличается ли среднее значение y на уровнях x от общего среднего значения y, используя непарный wilcox.test (критерий суммы рангов) для сравнения средства. Я не уверен, что это важно, поскольку ваши образцы, очевидно, не являются независимыми, но я все равно покажу вам, как это сделать.

Приведение в порядок вывода wilcox.test

library(broom)
tidy(wilcox.test(90:100, 94:100, exact = FALSE))

# A tibble: 1 x 4
  statistic p.value method                                            alternative
      <dbl>   <dbl> <chr>                                             <chr>      
1      24.5   0.220 Wilcoxon rank sum test with continuity correction two.sided 

A tibble - это немного более приятный вид фрейма данных, часть тидиверса.

Как это работает: Как объяснено в ?wilcox.test, эта функция фактически возвращает список:

> str(wilcox.test(90:100, 94:100, exact = FALSE))

List of 7
 $ statistic  : Named num 24.5
  ..- attr(*, "names")= chr "W"
 $ parameter  : NULL
 $ p.value    : num 0.22
 $ null.value : Named num 0
  ..- attr(*, "names")= chr "location shift"
 $ alternative: chr "two.sided"
 $ method     : chr "Wilcoxon rank sum test with continuity correction"
 $ data.name  : chr "90:100 and 94:100"
 - attr(*, "class")= chr "htest"

Пакет broom просто извлекает основные части, которые хорошо вписываются в ряд данных.

Сплит-применить-комбайн, базовый путь R

Теперь вы хотите сделать это для каждого уникального значения x (Area1, Area2 и т. Д.), А затем собрать результаты во фрейме данных, который показывает, для какого поднабора каждый результат. Есть много способов сделать это в базе R; вот один:

# Example data frame (I'm calling it "d" for brevity)
d <- data.frame(x = c("Area1", "Area1", "Area1", "Area2", "Area2"), y = c(1, 2, 3, 2, 3))
# Empty list to hold our results
L <- list()
for (i in unique(d$x)) {
  # Run Wilcoxon test, "tidy" the result, and assign it to element i of L
  L[[i]] <- tidy(wilcox.test(d$y, d[d$x == i, "y"], exact = FALSE))
}
L
# Combine the results
results <- do.call(rbind, L)  # Same as rbind(L[[1]], L[[2]], ...)
# Add a column identifying the subsets
results$area <- names(L)
results

# A tibble: 2 x 5
  statistic p.value method                                            alternative area 
*     <dbl>   <dbl> <chr>                                             <chr>       <chr>
1       8.5   0.875 Wilcoxon rank sum test with continuity correction two.sided   Area1
2       4     0.834 Wilcoxon rank sum test with continuity correction two.sided   Area2

Сплит-применить-комбайн, обратный путь

Рабочий процесс split-apply-объединить является очень распространенным, но несколько трудоемким для реализации в базе R. Способ tidyverse / dplyr гораздо более лаконичен и, с некоторой практикой, легче читать:

library("tidyverse")
library("broom")

d %>% 
  group_by(x) %>% 
  do(wilcox.test(d$y, .$y, exact = FALSE) %>% tidy)

# A tibble: 2 x 5
# Groups:   x [2]
  x     statistic p.value method                                            alternative
  <fct>     <dbl>   <dbl> <chr>                                             <chr>      
1 Area1       8.5   0.875 Wilcoxon rank sum test with continuity correction two.sided  
2 Area2       4     0.834 Wilcoxon rank sum test with continuity correction two.sided 

Примечания:

  • Труба %>% - это синтаксический сахар: x %>% f(a) означает f(x, a). Это облегчает написание вложенных вызовов функций в удобочитаемой форме. Прочитайте руководство по трубам для более глубокого понимания.
  • Обычно в dplyr вы ссылаетесь на столбцы фрейма данных по имени без кавычек, а не по имени фрейма данных. В вашем случае требуется d$y, чтобы получить все y независимо от group_by, но это исключение. Снова прочтите руководство.
  • Точка внутри do() относится к текущему подмножеству фрейма данных, поэтому .$y являются y в текущей группе.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...