如何使用 R 执行按类别和子类别分隔的单向方差分析测试?
How to perform a 1-way ANOVA test separated by categories and subcategories using R?
这里是一个简短的上下文:
进行了实验(实验 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
包,它允许您以这种方式执行 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
样本 1
、2
和 3
之间执行单向方差分析检验使用以下函数:
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
这里是一个简短的上下文:
进行了实验(实验 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
包,它允许您以这种方式执行 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
样本 1
、2
和 3
之间执行单向方差分析检验使用以下函数:
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