用R语言实现方差分析ANOVA

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹,分析师/程序员/Quant: R,Java,Nodejs
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-stat-anova/

前言

方差分析是一种基本统计学方法,在众多领域都有非常广泛的应用,比如评估不同药物的疗效,不同的广告策略的效果。

大模型的时代,是否能用方差分析,判断大模型结论与实际结论,是否有显著性差异,那么就能够快速验证大模型的是否产生了幻觉,以此来对大模型进行改进。

目录

  1. 方差分析介绍
  2. 用R语言方差分析aov()函数
  3. 用R语言方进行方差分析

1. 方差分析介绍

方差分析(Analysis of Variance,简称ANOVA)是一种用于比较多个群体均值是否存在显著差异的统计方法。它通过分析数据中不同来源的变异来检验均值差异的显著性。

方差分析的核心思想是将总变异分解为,组间变异(不同处理组之间的差异)和组内变异(同一组内的个体差异),通过比较这两种变异的相对大小来判断均值差异是否显著。

方差分析的主要类型为,

  • 单因素方差分析(One-way ANOVA):比较一个分类自变量(因素)对连续因变量的影响,例如:比较三种不同教学方法对学生成绩的影响
  • 双因素方差分析(Two-way ANOVA):同时考察两个分类自变量对连续因变量的影响,可以分析主效应和交互效应,例如:研究性别(男/女)和教学方法(A/B/C)对学生成绩的共同影响
  • 多元方差分析(MANOVA):适用于多个连续因变量的情况

ANOVA的核心目标是区分数据变异性的来源:是由实验条件(或处理)的不同引起的,还是由随机变异(即自然波动或实验误差)引起的。这种区分有助于我们判断实验条件是否对研究变量有显著影响。

ANOVA的关键组成部分

  • 总方差(Total Variance): 数据总体的方差,包括组间方差和组内方差。
  • 组间方差(Between-Group Variance): 不同组(或处理条件)间均值的差异。
  • 组内方差(Within-Group Variance): 同一组内个体间的差异。

通过比较组间方差和组内方差,ANOVA帮助我们判断各组间是否存在显著的均值差异。如果组间方差显著大于组内方差,我们有理由相信不同组的均值存在显著差异。

方差分析的基本假设

  • 正态性:每个组的数据应近似呈正态分布。这意味着数据的分布应该是对称的,没有明显的偏斜,使用Shapiro-Wilk检验
  • 方差齐性:所有组的方差应该大致相等。这个假设确保了不同组别的数据具有一致的波动性,使用Levene’s Test或Bartlett’s Test来检验
  • 独立性:数据点之间应该是相互独立的,即一个数据点的值不应影响或决定另一个数据点的值。

方差分析步骤

  1. 提出假设:零假设(H₀):所有组的均值相等,即组间不存在显著差异。备择假设(H₁):至少有两组的均值不等,即存在至少一个组间的显著差异。
  2. 计算组间和组内方差:组间方差(Between-Group Variance):计算每个组的均值与总体均值之间的差异,反映了不同处理或条件下数据的变化程度。组内方差(Within-Group Variance):计算组内数据点与各自组均值的差异,表示在相同条件下的数据波动。
  3. 计算F统计量:F值是方差分析中的核心统计量,它是组间方差与组内方差的比率:F = 组间方差 / 组内方差 ,较高的F值通常表明组间存在显著差异。但我们需要通过F分布来确定这个差异是否统计上显著。
  4. 将计算得到的F值与临界值比较,或直接看p值,根据自由度和显著性水平(通常是0.05)找到F值的临界值。如果计算出的F值超过临界值,我们拒绝零假设,认为至少有两组间存在显著差异。
  5. 做出统计决策

事后检验:当方差分析结果显示显著差异时,需要进行事后检验(Post-hoc tests)来确定具体哪些组之间存在差异,常用方法包括:Tukey’s HSD检验,Bonferroni校正,Scheffe检验。

2. 用R语言方差分析aov()函数

R中的方差分析(ANOVA)是一种统计方法,用于比较两个或多个组之间的均值是否存在显著差异。在R语言中,可以使用ANOVA函数(aov)进行方差分析。

在R语言中,自带的stat包的aov()函数,就是我们最常用方差分析的计算函数。

aov()函数的语法为aov(formula, data=dataframe),y是因变量,字母ABC代表因子。

R语言代码的写法:


model <- aov(response ~ group, data = dataset)
summary(model)
符号用途
~分隔符号,左边为响应变量(因变量),右边为解释变量(自变量),如 y ~ A + B + C
:表示预测变量的交互项,A与B的交互,如y ~ A + B + A:B
*表示所有可能交互项的简洁方式,如 y ~ A*B*C 等同于 y ~ A+B+C + A:B + A:C + B:C + A:B:C
^表示交互项达到某个次数,如y~(A+B+C)^2 等同于 y~ A+B+C + A:B + A:C + B:C
.表示包含除因变量外的所有变量,如y~. 等同于 y~ A+B+C

下面是常见研究设计的表达式

设计表达式
单因素ANOVAy ~ A
含单个协变量的单因素ANOVAy ~ x + A
双因素ANOVAy ~ A * B
含两个协变量的双因素ANOVAy ~ x1 + x2 + A * B
随机化区组y ~ B + A (B是区组因子)
单因素组内ANOVAy ~ A + Error(subject/A)
含单个组内因子(W)和单个组间因子的重复测量ANOVAy ~ B * W + Error(Subject/W)

3. R语言实现方差分析

数据集使用datarium包的职位满意度调查jobsatisfaction数据集。


# 安装datarium
> install.packages("datarium")

# 加载程序包
> library(datarium)
> library(dplyr)

查看jobsatisfaction数据集的基本情况,共4列,ID,gender性别,education_level学历水平,score得分。


> data("jobsatisfaction", package = "datarium")
> jobsatisfaction
# A tibble: 58 × 4
   id    gender education_level score
                 
 1 1     male   school           5.51
 2 2     male   school           5.65
 3 3     male   school           5.07
 4 4     male   school           5.51
 5 5     male   school           5.94
 6 6     male   school           5.8 
 7 7     male   school           5.22
 8 8     male   school           5.36
 9 9     male   school           4.78
10 10    male   college          6.01
# ℹ 48 more rows
# ℹ Use `print(n = ...)` to see more rows

# 查看统计概率
> summary(jobsatisfaction)
       id        gender     education_level     score       
 1      : 1   male  :28   school    :19     Min.   : 4.780  
 2      : 1   female:30   college   :19     1st Qu.: 5.800  
 3      : 1               university:20     Median : 6.380  
 4      : 1                                 Mean   : 6.963  
 5      : 1                                 3rd Qu.: 8.515  
 6      : 1                                 Max.   :10.000  

对数据集进行分组gender, education_level,计算均值和标准差


> jobsatisfaction %>%
+   group_by(gender, education_level) %>%
+   get_summary_stats(score, type = "mean_sd")
# A tibble: 6 × 6
  gender education_level variable     n  mean    sd
                     
1 male   school          score        9  5.43 0.364
2 male   college         score        9  6.22 0.34 
3 male   university      score       10  9.29 0.445
4 female school          score       10  5.74 0.474
5 female college         score       10  6.46 0.475
6 female university      score       10  8.41 0.938

画出分组的数据分箱图


> ggboxplot(
+   jobsatisfaction, x = "gender", y = "score",
+   color = "education_level", palette = "jco"
+ )

建立方差分析模型,有几个变量我们就全部都加入分析,以score为因变量,以gender和education_level的组合为自变量。


# 建模
> model<- aov(score ~ gender*education_level, data = jobsatisfaction)

# 查看因子显著性水平
> summary(model)
                       Df Sum Sq Mean Sq F value  Pr(>F)    
gender                  1   0.54    0.54   1.787 0.18709    
education_level         2 113.68   56.84 187.892 < 2e-16 ***
gender:education_level  2   4.44    2.22   7.338 0.00156 ** 
Residuals              52  15.73    0.30                    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

其中,education_level和gender:education_level的P值对score有影响,gender没有影响。

对模型进行正态分布检验shapiro.test,p值大于0.05,说明符合正态分布。


> shapiro.test(residuals(model))

	Shapiro-Wilk normality test

data:  residuals(model)
W = 0.96786, p-value = 0.1267

进行方差齐性检验bartlett.test,p值小于0.05,说明education_level方差有显著地不同,方差不是齐性的。


> bartlett.test(score ~ education_level, data = jobsatisfaction)

	Bartlett test of homogeneity of variances

data:  score by education_level
Bartlett's K-squared = 11.651, df = 2, p-value = 0.002951

进行方差齐性检验bartlett.test,p值大于0.05,说明gender方差没有显著地不同,方差是齐性的。


> bartlett.test(score ~ gender, data = jobsatisfaction)

	Bartlett test of homogeneity of variances

data:  score by gender
Bartlett's K-squared = 2.3701, df = 1, p-value = 0.1237

Bartlett's K-squared:Bartlett's K-squared是Bartlett检验的统计量,用于衡量不同组间方差的差异。它是通过计算各组的方差并比较它们之间的差异而得出的。如果各组方差相等,则K-squared值应较小;如果方差不相等,K-squared值则较大。

df(自由度):自由度(degrees offreedom,df)是统计分析中的一个重要概念,它指的是在计算某个统计量时,可以自由变化的数值的数量。在上面 Bartlett检验中,由于假设有三个不同种族的组来比较它们之间的出生体重(bwt)的方差,自由度等于组数减一(这里为2)。

p-value(p值):p值用于衡量观察到的统计量在假设检验中的极端性。具体来说,它表示在零假设为真的情况下,观察到像样或更极端结果的概率。若p值小于某个显著性水平(通常为0.05),则我们拒绝零假设;若p值大于显著性水平,则不能拒绝零假设。在Bartlett检验中,p值大于0.05表示没有足够的证据表明各组间方差存在显著差异。

使用Tukey’s HSD检验,进行分组的显著差异。


> TukeyHSD(model)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = score ~ gender * education_level, data = jobsatisfaction)

$gender
                  diff        lwr        upr     p adj
female-male -0.1932143 -0.4832329 0.09680436 0.1870895

$education_level
                        diff       lwr      upr     p adj
college-school     0.7573684 0.3268386 1.187898 0.0002637
university-school  3.2518102 2.8266960 3.676924 0.0000000
university-college 2.4944417 2.0693275 2.919556 0.0000000

$`gender:education_level`
                                        diff          lwr        upr
female:school-male:school          0.3143333 -0.433358082  1.0620247
male:college-male:school           0.7966667  0.029551460  1.5637819
female:college-male:school         1.0363333  0.288641918  1.7840247
male:university-male:school        3.8653333  3.117641918  4.6130247
female:university-male:school      2.9793333  2.231641918  3.7270247
male:college-female:school         0.4823333 -0.265358082  1.2300247
female:college-female:school       0.7220000 -0.005749384  1.4497494
male:university-female:school      3.5510000  2.823250616  4.2787494
female:university-female:school    2.6650000  1.937250616  3.3927494
female:college-male:college        0.2396667 -0.508024749  0.9873581
male:university-male:college       3.0686667  2.320975251  3.8163581
female:university-male:college     2.1826667  1.434975251  2.9303581
male:university-female:college     2.8290000  2.101250616  3.5567494
female:university-female:college   1.9430000  1.215250616  2.6707494
female:university-male:university -0.8860000 -1.613749384 -0.1582506
                                      p adj
female:school-male:school         0.8132166
male:college-male:school          0.0374890
female:college-male:school        0.0019203
male:university-male:school       0.0000000
female:university-male:school     0.0000000
male:college-female:school        0.4086560
female:college-female:school      0.0529764
male:university-female:school     0.0000000
female:university-female:school   0.0000000
female:college-male:college       0.9317495
male:university-male:college      0.0000000
female:university-male:college    0.0000000
male:university-female:college    0.0000000
female:university-female:college  0.0000000
female:university-male:university 0.0087499

TukeyHSD的检验,education_level的显著性水平最高,所以我们画出education_level检验图。


> plot(TukeyHSD(model, "education_level"))

本文通过方差分析,实现对不同变量的影响权重的计算,可以通过统计学的方法,发现新的变量特征。

转载请注明出处:
http://blog.fens.me/r-stat-anova/

This entry was posted in R语言实践

0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x