Как выполнить 1-полосный тест ANOVA, разделенный по категориям и подкатегориям с помощью R?

#r #statistics #anova #factors

Вопрос:

Вот краткий контекст:

Были проведены эксперименты (Эксперимент A и Эксперимент B ). Каждый эксперимент был разделен на категории ( Low и High ). Каждая из категорий оценивалась с использованием 3 образцов (Образец 1 , Образец 2 и Образец 3 ). value Каждую пробу анализировали 3 раза. С помощью этой информации была получена следующая база данных

 Experiment <- c(rep("A", 18), rep("B", 18))
Level <- rep((c(rep("Low", 9), rep("High", 9))), 2)
Sample_ID <- rep((c(rep(1,3), rep(2,3), rep(3,3))), 4)
Values <- rnorm(36)

DF <- data.frame(Experiment, Level, Sample_ID, Values)

DF$Experiment <- factor(DF$Experiment,
                        levels = c("A", "B"))
DF$Level <- factor(DF$Level,
                   levels = c("Low", "High"))
DF$Sample_ID <- factor(DF$Sample_ID,
                       levels = c(1, 2, 3))
 

Я начал с проверки нормальности каждого образца, классифицируя анализ по Experiment Level и Sample_ID . Я использовал RVAideMemoire пакет, который позволяет выполнять тест Шапиро-Уилка таким образом, с помощью функции byf.shapiro()

 library(RVAideMemoire)

byf.shapiro(Values ~ Experiment*Level*Sample_ID, data = DF)

Shapiro-Wilk normality tests

data:  Values by Experiment:Level:Sample_ID 

              W p-value  
A:Low:1  0.9143 0.43251  
B:Low:1  0.9880 0.79001  
A:High:1 0.7771 0.06098 .
B:High:1 0.9959 0.87703  
A:Low:2  0.9905 0.81312  
B:Low:2  0.9573 0.60234  
A:High:2 0.8126 0.14497  
B:High:2 0.9980 0.91461  
A:Low:3  0.9698 0.66665  
B:Low:3  0.9893 0.80236  
A:High:3 0.7659 0.03534 *
B:High:3 0.9906 0.81418  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
 

Я попытался выполнить 1-полосный тест ANOVA между образцами 1 , 2 , и 3 для каждого Level и для каждого Experiment , используя следующую функцию:

 ANOVA <- aov(Values ~ Experiment*Level*Sample_ID, data = DF)
summary(ANOVA)
 

Результат этой функции, я думаю, показывает результат 3-стороннего теста ANOVA вместо 1-стороннего теста ANOVA между тремя образцами каждого Level и также разделенными Experiment .

Кто-нибудь знает, как я могу выполнить 1-полосный тест ANOVA между уровнями и экспериментами? Или кто-нибудь знает какие-либо пакеты, которые делают эту дифференциацию?

Просто чтобы графически прояснить мой вопрос, вот таблица, в которой я показываю группировку значений для выполнения 1-стороннего теста ANOVA

введите описание изображения здесь

Ответ №1:

С помощью rstatix пакета можно создавать функции каналов, указывающие, где следует выполнять статистический анализ:

 library(rstatix)

Experiment <- c(rep("A", 18), rep("B", 18))
Level <- rep((c(rep("Low", 9), rep("High", 9))), 2)
Sample_ID <- rep((c(rep(1,3), rep(2,3), rep(3,3))), 4)
Values <- rnorm(36)

DF <- data.frame(Experiment, Level, Sample_ID, Values)

DF$Experiment <- factor(DF$Experiment,
                        levels = c("A", "B"))
DF$Level <- factor(DF$Level,
                   levels = c("Low", "High"))
DF$Sample_ID <- factor(DF$Sample_ID,
                       levels = c(1, 2, 3))

# Shapiro-Wilk test

my.shapiro <- DF %>%
  group_by(Level, Experiment, Sample_ID) %>%
  shapiro_test(Values) %>%
  add_significance()
my.shapiro

# ANOVA

ANOVA <- DF %>%
  group_by(Level, Experiment) %>%
  anova_test(Values ~ Sample_ID) %>%
  add_significance()
ANOVA