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

У меня есть набор данных значений (val), сгруппированных по нескольким категориям (distance & phase). Я хотел бы проверить каждую категорию по Kruskal-Wallis test, где val - это зависимая переменная, distance - это коэффициент, а phase разделил мои данные на 3 группы.

Как таковой, мне нужно указать подмножество данных в тесте Крускала-Уоллиса, а затем применить тест к каждой из групп. НО, Я не могу заставить работать мое подмножество!

В справке R указано, что subset равно an optional vector specifying a subset of observations to be used. Но как правильно установить это в моей функции lapply?

Мои фиктивные данные:

# 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)

# get basic statistics per group
aggregate(val ~ distance + phase, df, mean)

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

Это хорошо работает, поэтому мое подмножество должно быть правильно задано как вектор. Но как использовать это в lapply функции?

# DOES not work!!
lapply(ii, kruskal.test(df$val ~ df$distance,
                        subset = df$phase == as.character(ii))) 

Моя общая цель - создать функцию из kruskal.test и сохранить всю статистику для каждой группы в одну таблицу.

Вся помощь высоко ценится.

1 Ответ

0 голосов
/ 04 мая 2018

Обычно вы начинаете с split ting, а затем lapply ing.

Что-то вроде

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

даст список, проиндексированный по фазе, результатов kruskal.test.

Ваше окончательное выражение не работает, потому что lapply ожидает функцию, а применение kruskal.test не приводит к функции, это приводит к результату выполнения этого теста. Если вы окружите его определением функции с индексом, тогда оно будет работать, просто будьте немного менее идиоматичным.

lapply(ii, function(i) { kruskal.test(df$val ~ df$distance, subset=df$phase==i )})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...