Крускал Уоллис Тест и подмножество
Можете ли вы помочь в проведении теста Крустала Уоллиса, используя подмножество моих данных? Я хотел бы иметь возможность проверить различия в "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