Я не уверен, что это идеальное место для такого вопроса, но, возможно, вы мне поможете.
Я хочу проверить различия количественной переменной между 3 процедурами, т.е. выполнить ANOVA.
К сожалению, остатки моей модели обычно не распределяются.
У меня обычно есть два решения: преобразовать мои данные или использовать непараметрический c эквивалент моего теста (здесь критерий ранга Крускала Уоллиса).
Ни одно из преобразований, которые я пробовал удалось удовлетворить нормальность (log, 1 / x, квадрат root, мощность tukey и boxcox), поэтому я хотел использовать kruskal и двигаться дальше.
Однако, мой менеджер проекта настоял на том, чтобы иметь только ANOVAs и говорил о ANOVA по рангу как о магическом c решении.
Работая над RI, я нашел несколько примеров и нашел функцию art
из пакета ARTool
, которая выполняет анову по рангу.
library(ARTool)
model <- art(variable~treatment,data)
anova(model)
По сути, он берет вашу переменную и заменяет ее своим рангом (имея дело со связями путем усреднения ранга) следующим образом:
model2 <- lm(rank(variable, ties.method = "average")~treatment,data)
anova(model2)
дает точно такой же результат.
Я не эксперт по статистике, и мне интересно, насколько правильно это решение / преобразование. Мне это кажется довольно жестоким, и это не так далеко от логики c теста Крускала-Уоллиса, даже если статистика c не рассчитывается непосредственно по рангу.
Меня очень смущает проведение теста «ANOVA в рядах», который отличается от kruskal-wallis (также известного как односторонний анализ ANOVA в рядах), и я не знаю, как выбирать между этими два теста.
Я не знаю, был ли я очень ясен и может ли кто-нибудь мне помочь, но, в любом случае, спасибо за ваше внимание и комментарии!
PS: вот пример по фиктивным данным
library(ARTool)
# note that dummy data are random so we shouldn't have the same results
treatment <- as.factor(c(rep("A",100),rep("B",100),rep("C",100)))
variable <- as.numeric(c(sample(c(0:30),100,replace=T),sample(c(10:40),100,replace=T),sample(c(5:35),100,replace=T)))
dummy <- data.frame(treatment,variable)
model <- art(variable~treatment)
anova(model) #f.value = 30.746 and p = 7.312e-13
model2 <- lm(rank(variable, ties.method = "average")~treatment,dummy)
anova(model2) #f.value = 30.746 and p = 7.312e-13
kruskal.test(variable~treatment,dummy)