Крускал Уоллис Тест и подмножество

Можете ли вы помочь в проведении теста Крустала Уоллиса, используя подмножество моих данных? Я хотел бы иметь возможность проверить различия в "N" между "продюсерами".

names(Isotope.Data)
[1] "Species"         "Name"            "Group"           "Simple_Group"       "Trophic_Group"  
[6] "Sample"          "N"               "C" 

В моем csv.file у меня есть колонка "Трофическая группа", которая разделяет потребителей и производителей.

table(Isotope.Data$Trophic_Group)

Consumer Producers  
    61         18 

Под заголовком столбца Simple_Group у меня есть три производителя - Rhodophyta, Seagrass и Phaeophyceae.

table(Isotope.Data$Simple_Group)

 Abalone  Loliginidae      Octopus Phaeophyceae   Rhodophyta     Seagrass      Teleost 
      24            2           12            6            9            3           20 
Tunicate 
       3 

Я пробовал множество вещей, но я получаю различные сообщения об ошибках. Кто-нибудь сможет улучшить следующий код?

kruskal.test(C ~ Simple_Group, data = Isotope.Data, subset = Isotope.Data$Trophic_Group = "Producers") 

PS Я создал отдельный файл CSV.file, который включает в себя только основных производителей. Однако последующий Dunn-тест множественных сравнений, используемый для определения уровней, отличающихся друг от друга, обеспечивает разные уровни значимости для уровней, которые включают как Потребителей, так и Производителей.

2 ответа

Может быть, этот ответ будет полезным? Основано на @user295691 ответе:

Тест Крускала-Уоллиса: создать функцию lapply для подмножества data.frame?

Здесь вы определяете отдельные группы, между которыми вы хотите проверить различия, и используете разделение, чтобы правильно определить поднаборы вашего фрейма данных.

Дурацкий пример:

# create data
val<-runif(60, min = 0, max = 100)
distance<-floor(runif(60, min=1, max=3))
phase<-rep(c("a", "b", "c"), 20)

df<-data.frame(val, distance, phase)

# get unique groups
ii<-unique(df$phase)

# run Kruskal test, specify the subset
kruskal.test(df$val ~df$distance,
             subset = phase == "c")

А теперь примените kruskal.test каждой группе, использующей split:

lapply(split(df, df$phase), function(d) { kruskal.test(val ~ distance, data=d) })

или создайте функцию:

lapply(ii, function(i) { kruskal.test(df$val ~ df$distance, subset=df$phase==i )})

Оба выдают результаты теста для каждой группы:

[[1]]

    Kruskal-Wallis rank sum test

data:  df$val by df$distance
Kruskal-Wallis chi-squared = 0.14881, df = 1, p-value = 0.6997


[[2]]

    Kruskal-Wallis rank sum test

data:  df$val by df$distance
Kruskal-Wallis chi-squared = 0.11688, df = 1, p-value = 0.7324


[[3]]

    Kruskal-Wallis rank sum test

data:  df$val by df$distance
Kruskal-Wallis chi-squared = 0.0059524, df = 1, p-value = 0.9385

Или просто получить значения р (обратите внимание на добавление $p.value после kruskal.test):

lapply(ii, function(i) { 
  kruskal.test(df$val ~ df$distance, 
               subset=df$phase==i )$p.value
}
  )

Вы также можете использоватьmap()функция из пакетаpurrrприменить функцию в каждой группе после разделения

      library(purrr)
test <- df %>% group_split(phase) %>% map(~kruskal.test(.,val ~ distance))
test
Другие вопросы по тегам