如何使用 R 执行按类别和子类别分隔的单向方差分析测试?

How to perform a 1-way ANOVA test separated by categories and subcategories using R?

这里是一个简短的上下文:

进行了实验(实验 A 和实验 B)。每个实验都分为几类(LowHigh)。每个类别都使用 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))

我首先检查每个样本的正态性,按 ExperimentLevelSample_ID 对分析进行分类。我使用了 RVAideMemoire 包,它允许您以这种方式执行 Shapiro-Wilk 测试,函数为 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

我尝试在每个 Level 和每个 Experiment 样本 123 之间执行单向方差分析检验使用以下函数:

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

这个函数的结果,我认为它显示了 3-way ANOVA 测试的结果,而不是 1-way ANOVA 测试的结果,每个 Level 的三个样本之间也被 Experiment.

有谁知道如何在水平和实验之间进行单向方差分析?或者有谁知道有什么软件包可以实现这种差异化吗?

为了以图形方式阐明我的问题,这里是 table 我在其中显示了值分组以进行单向方差分析测试

使用 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