R ANOVA 教程:单向和双向(附示例)
什么是方差分析?
方差分析 (方差分析)是一种统计技术,通常用于研究两组或多组均值之间的差异。方差分析以典型变量的不同变异源为中心。R 中的方差分析主要提供组间均值相等存在的证据。这种统计方法是 t 检验的扩展。它用于因子变量有多个组的情况。
单向方差分析
很多时候都需要比较多个组之间的平均值,比如市场部想知道三个团队的销售业绩是否相同。
- 团队:3 个级别因素:A、B、C
- 销售:绩效衡量标准
方差分析检验可以判断三组的表现是否相似。
为了明确数据是否来自同一人群,你可以执行 单因素方差分析 (以下简称单因素方差分析)。与其他统计检验一样,该检验可证明 H0 假设是否可以接受或拒绝。
单向方差分析检验中的假设
- H0:组间均值相同
- H3:至少有一组的均值不同
换句话说,H0 假设意味着没有足够的证据来证明该组(因素)的平均值与另一个组(因素)不同。
该检验与 t 检验类似,但在超过 2 组的情况下建议使用 ANOVA 检验。除此之外,t 检验和 ANOVA 提供类似的结果。
假设
我们假设每个因素都是随机抽取的、独立的,并且来自方差未知但相等的正态分布的总体。
解释方差分析检验
F 统计量用于检验数据是否来自显著不同的总体,即不同的样本均值。
要计算 F 统计量,您需要除以 组间变异性 在 组内变异性.
这个 组间 变异性反映的是整个群体中各组之间的差异。查看下面的两个图表,了解组间方差的概念。
左图显示三组之间的差异很小,而且三个平均值很可能趋向于 最划算 平均值(即三组的平均值)。
右图绘制了三个相距很远的分布,它们之间没有一个重叠。总体平均值和组平均值之间的差异很有可能很大。
这个 组内 变异性考虑了组之间的差异。变异来自个体观察;有些点可能与组平均值完全不同。 组内 变异性会吸收这种影响并参考抽样误差。
为了直观地了解组内变异性的概念,请看下图。
左侧部分绘制了三个不同组的分布。你增加了每个样本的分布,很明显个体方差很大。F 检验会下降,这意味着你倾向于接受零假设
右侧部分显示完全相同的样本(均值相同),但变异性较低。这导致 F 检验增加,并倾向于支持备选假设。
您可以使用这两种度量来构建 F 统计量。理解 F 统计量非常直观。如果分子增加,则意味着组间变异性很高,样本中的组很可能来自完全不同的分布。
换句话说,低 F 统计量表示与组平均值之间差异很小或没有显著差异。
单因素方差分析检验示例
您将使用毒药数据集来实现单向方差分析测试。该数据集包含 48 行和 3 个变量:
- 时间:动物的生存时间
- 毒药:所用毒药类型:因子水平:1,2、3 和 XNUMX
- 治疗:所用治疗类型:因子水平:1,2、3 和 XNUMX
在开始计算方差分析检验之前,您需要按如下方式准备数据:
- 步骤 1:导入数据
- 第 2 步:删除不必要的变量
- 步骤 3:将变量毒药转换为有序级别
library(dplyr) PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/poisons.csv" df <- read.csv(PATH) %>% select(-X) %>% mutate(poison = factor(poison, ordered = TRUE)) glimpse(df)
输出:
## Observations: 48 ## Variables: 3 ## $ time <dbl> 0.31, 0.45, 0.46, 0.43, 0.36, 0.29, 0.40, 0.23, 0.22, 0... ## $ poison <ord> 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2... ## $ treat <fctr> A, A, A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, ...
我们的目标是检验以下假设:
- H0:各组间平均生存时间无差异
- H3:至少有一个组的平均生存时间不同。
换句话说,你想知道根据给豚鼠注射的毒药类型,其存活时间的平均值是否存在统计差异。
您将按如下方式进行:
- 步骤 1:检查变量toxic的格式
- 第 2 步:打印汇总统计数据:计数、平均值和标准差
- 步骤 3:绘制箱线图
- 步骤 4:计算单向方差分析检验
- 步骤 5:运行成对 t 检验
步骤1) 您可以使用以下代码检查毒药的级别。您应该看到三个字符值,因为您使用 mutate 动词将它们转换为因子。
levels(df$poison)
输出:
## [1] "1" "2" "3"
步骤2) 计算平均值和标准差。
df % > % group_by(poison) % > % summarise( count_poison = n(), mean_time = mean(time, na.rm = TRUE), sd_time = sd(time, na.rm = TRUE) )
输出:
## # A tibble: 3 x 4 ## poison count_poison mean_time sd_time ## <ord> <int> <dbl> <dbl> ## 1 1 16 0.617500 0.20942779 ## 2 2 16 0.544375 0.28936641 ## 3 3 16 0.276250 0.06227627
步骤3) 在第三步中,您可以用图形检查分布之间是否存在差异。请注意,您要包括抖动点。
ggplot(df, aes(x = poison, y = time, fill = poison)) + geom_boxplot() + geom_jitter(shape = 15, color = "steelblue", position = position_jitter(0.21)) + theme_classic()
输出:
步骤4) 您可以使用命令 aov 运行单向方差分析测试。方差分析测试的基本语法是:
aov(formula, data) Arguments: - formula: The equation you want to estimate - data: The dataset used
该公式的语法是:
y ~ X1+ X2+...+Xn # X1 + X2 +... refers to the independent variables y ~ . # use all the remaining variables as independent variables
您可以回答我们的问题:在了解了所给予的毒药类型之后,豚鼠的存活时间是否存在差异。
请注意,建议存储模型并使用函数 summary() 来更好地打印结果。
anova_one_way <- aov(time~poison, data = df) summary(anova_one_way)
代码说明
- aov(time ~toxic, data = df):使用以下公式运行方差分析测试
- summary(anova_one_way): 打印测试摘要
输出:
## Df Sum Sq Mean Sq F value Pr(>F) ## poison 2 1.033 0.5165 11.79 7.66e-05 *** ## Residuals 45 1.972 0.0438 ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
p 值低于通常的阈值 0.05。您可以确信地说,各组之间存在统计差异,以“*”表示。
成对比较
单向方差分析无法判断哪组平均值不同。您可以使用 TukeyHSD() 函数执行 Tukey 检验。
TukeyHSD(anova_one_way)
输出:
两向方差分析
双向方差分析检验在公式中添加了另一个组变量。它与单向方差分析检验相同,但公式略有不同:
y=x1+x2
其中 是定量变量, 和 是分类变量。
双向方差分析检验中的假设
- H0:两个变量的均值相等(即因子变量)
- H3:两个变量的均值不同
你向我们的模型添加了 treat 变量。此变量表示给予豚鼠的治疗。你有兴趣看看毒药和给予豚鼠的治疗之间是否存在统计依赖性。
我们通过添加其他独立变量来调整我们的代码。
anova_two_way <- aov(time~poison + treat, data = df) summary(anova_two_way)
输出:
## Df Sum Sq Mean Sq F value Pr(>F) ## poison 2 1.0330 0.5165 20.64 5.7e-07 *** ## treat 3 0.9212 0.3071 12.27 6.7e-06 *** ## Residuals 42 1.0509 0.0250 ## ---
您可以得出结论,毒药和治疗在统计上都不同于 0。您可以拒绝零假设并确认改变治疗或毒药会影响生存时间。
结语
我们可以在下表中总结该测试:
测试 | 代码 | 假说 | P值 |
---|---|---|---|
单因素方差分析 |
aov(y ~ X, data = df) |
H3:至少有一个组的平均值不同 | 0.05 |
成对 |
TukeyHSD(ANOVA summary) |
0.05 | |
双因素方差分析 |
aov(y ~ X1 + X2, data = df) |
H3:两组的平均值不同 | 0.05 |