R语言——方差分析

article/2025/10/1 1:09:29

一、方差分析的基本概念

方差分析是在20世纪20年代发展起来的一种统计方法,它是由英国统计学家费希尔在进行实验设计时为解释实验数据而首先引入的。

从形式上看,方差分析是比较多个总体的均值是否相等;但是其本质上是研究变量之间的相互关系。方差分析主要用于研究一个数值因变量与一个或多个分类自变量的关系。

根据方差分析的计算方法给方差分析下一个定义:

方差分析(analysis of variance ,ANOVA)就是通过检验各总体的均值是否相等来判断分类型自变量对数值型因变量是否有显著影响。

二、利用实例讲解方差分析的应用

假设某私立学校具有小学、初中、高中三个水平的学生,每个水平阶段的学生每个学期都会进行一次期末考试。另外假设小学共抽取10个班级,初中抽取9个班级,高中抽取8个班级。

每个班级期末考试的平均分分别用Ai(i=1,2,...,10)、Bj(j=1,2,...,9)和Ck(k=1,2,...,8)表示,为了比较各个水平阶段的班级平均分是否有显著性差异,就可以使用方差分析。

这里的阶段就是因素,也称之为因子,因子的三个取值:小学、初中、高中,称为水平或处理。

 

阶段

 

小学

初中

高中

1

90

87

80

2

90

88

79

3

89

90

80

4

88

78

89

5

89

89

87

6

91

90

86

7

96

80

89

8

88

81

83

9

80

82

 

10

90

 

 

为了更为直观地观察各水平平均值,绘制箱线图如下:

 

由于以上数据只涉及到一个分类自变量,即阶段,因此属于单因素方差分析。

从箱线图可以看出,各水平学生的平均分存在一定的差异,但是这种差异显著不显著,还需要进一步分析。

同时,各个水平的方差看起来也不尽相同。

二、方差分析的基本思想

由以上分析可以看出,虽然各个水平的学生平均分存在差异,但是其方差也有差别,方差分析的基本思想就是弄清楚影响因变量取值的误差来源,以判断是否是分类自变量对因变量产生影响。

在上述数据中,各组数据的误差主要来源于以下几个部分。

首先,即使是同一组的数据,其取值也具有差别,这是因为班级是随机抽取的,因此他们之间的差异可以看作是随机因素的影响造成的,或者说是由抽样的随机性造成的,这种来自水平内部的误差称之为组内误差,显然,组内误差只含有随机误差。

其次,各组的取值不同。来自不同水平之间的误差称为组间误差,这种差异可能来自于随机误差,也可能来自于因子本身的系统性误差造成的系统误差。因此,组内误差包含有可能包含两个方面,即随机误差和系统误差。

最后,总误差为组内误差与组间误差之和。

这样,就把造成因变量的差异的误差分解成组内误差和组间误差。

总误差=组内误差+组间误差

如果组内误差与组间误差相差太大,说明组间误差存在很大成分的系统误差,这时候就可以认为各水平均值显著不等。

将组间误差与总误差的比值定义为关系强度R2,即

R2=

将各平方和除以对应的自由度,则得到相应的均方,也称为方差。

SST的自由度为n-1

SSA的自由度为k-1

SSE的自由度为n-k

三、方差分析的基本假设

(1)各总体的方差必须相等

(2)各总体必须服从正态分布

(3)各观测值相互独立

四、方差分析的类型

根据影响因变量的因素个数,可以把方差分析分为单因素方差分析和双因素方差分析。

如果是双因素方差分析,根据两个因素的交互作为是否对因变量产生影响可分为无交互作用的双因素方差分析和有交互作用的双因素方差分析。

五、方差分析的R语言实现

(一)方差分析基本假设的检验

将数据在R语言中以列表形式存储,

> ave_score

$primary

 [1] 90 90 89 88 89 91 96 88 80 90

 

$junior

[1] 87 88 90 78 89 90 80 81 82

 

$senior

[1] 80 79 80 89 87 86 89 83

1、方差齐性检验

(1)Bartlett检验(Bartlett检验也可以接受一个数据框为输入,结构与下面的Levene检验相同。此方法比较适合用于总体服从正态分布的检验)

> bartlett.test(ave_score)

 

         Bartlett test of homogeneity of variances

 

data:  ave_score

Bartlett's K-squared = 0.28233, df = 2, p-value = 0.8683

P值为0.8683,由于p大于常用的a=0.05,因此,无法拒绝原假设,即认为方差相等。

(2)Levene检验 (Levene检验函数接受的数据结构为数据框结构,并且一列是各水平的取值score,另一列是所属的水平level,用score~level表示score为因变量,level为自变量。此方法适用于总体非正态的检验)

> scores<-data.frame(score=c(ave_score$primary,ave_score$junior,ave_score$senior),level=rep(c("primary","junior","senior"),c(10,9,8)))

> scores

   score   level

1     90  primary

2     90  primary

3     89  primary

4     88  primary

5     89  primary

6     91  primary

7     96  primary

8     88  primary

9     80  primary

10    90  primary

11    87  junior

12    88  junior

13    90  junior

14    78  junior

15    89  junior

16    90  junior

17    80  junior

18    81  junior

19    82  junior

20    80  senior

21    79  senior

22    80  senior

23    89  senior

24    87  senior

25    86  senior

26    89  senior

27    83  senior

> leveneTest(score~level,data = scores)

Levene's Test for Homogeneity of Variance (center = median)

      Df F value Pr(>F)

group  2  1.0461 0.3668

      24              

P值大于0.05,可认为等方差

(3)Fligner-Killeen检验

> fligner.test(ave_score)(fliger.test函数可以接受列表输入)

 

         Fligner-Killeen test of homogeneity of variances

 

data:  ave_score

Fligner-Killeen:med chi-squared = 2.0447, df = 2, p-value = 0.3597

结论同上

2、正态性检验

shapiro检验(输入数据为一个向量,检验该向量的数据是否服从正态分布)

> sapply(ave_score,shapiro.test)(

          primary                       junior                      

statistic 0.8332102                     0.8725879                   

p.value   0.03657401                    0.1310428                   

method    "Shapiro-Wilk normality test" "Shapiro-Wilk normality test"

data.name "X[[i]]"                      "X[[i]]"                     

          senior                      

statistic 0.8764152                   

p.value   0.1739798                   

method    "Shapiro-Wilk normality test"

data.name "X[[i]]"   

primary 水平的检验拒绝原假设,即非正态。这个数据只是为了说明方差分析的原理,并没有进行严格的验证,但是不影响后续工作的推进。

3、独立性检验

可以通过控制抽样过程来控制独立性,无具体的检验方法。

(二)方差分析

1、单因素方差分析

方差分析所需的数据结构一般是一个数据框,就像上面的那样。

进行方差分析可以使用lm()函数,也可以使用aov()函数,再利用summary()函数或者anova()函数输出最终结果。

对于上述的单因素方差分析,分别用这两者方法分析如下:

(1)用lm()函数

> score_lm<-lm(score~level,data = scores)

> summary(score_lm)

 

Call:

lm(formula = score ~ level, data = scores)

 

Residuals:

   Min     1Q Median     3Q    Max

-9.100 -3.500  0.900  2.938  6.900

 

Coefficients:

             Estimate Std. Error t value Pr(>|t|)   

(Intercept)    85.000      1.424  59.706   <2e-16 ***

levelprimaty    4.100      1.962   2.089   0.0475 * 

levelsenior    -0.875      2.075  -0.422   0.6770   

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 

Residual standard error: 4.271 on 24 degrees of freedom

Multiple R-squared:  0.2309,         Adjusted R-squared:  0.1668

F-statistic: 3.602 on 2 and 24 DF,  p-value: 0.04285

 

> anova(score_lm)

Analysis of Variance Table

 

Response: score

          Df Sum Sq Mean Sq F value  Pr(>F) 

level      2 131.41  65.705  3.6021 0.04285 *

Residuals 24 437.78  18.241                 

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

 

Summary()函数会输出残差和模型,anova()只会输出结果。

(2)利用aov()函数

> score_aov<-aov(score~level,data = scores)

> summary(score_aov)

            Df Sum Sq Mean Sq F value Pr(>F) 

level        2  131.4   65.71   3.602 0.0429 *

Residuals   24  437.8   18.24                

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

> anova(score_aov)

Analysis of Variance Table

 

Response: score

          Df Sum Sq Mean Sq F value  Pr(>F) 

level      2 131.41  65.705  3.6021 0.04285 *

Residuals 24 437.78  18.241                 

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

从上述结果可以看出,anova()输出的是标准的方差分析表,而利用lm()函数计算的方差分析会输出回归模型,以及残差——更多的是回归的信息。

2、无交互作用的双因素方差分析

有的时候,因变量可能受到来自一个以上的因素的影响,最典型的就是双因素方差分析。假如因素A与因素B没有联合效应,则称为无交互作用的双因素方差分析。

考虑以下的例子,假如某经销商想知道一款饮料的销售额与销售地点和饮料包装风格的关系,探究这两个因素是否都在影响销售额或者只有一个因素影响销售额。

数据如下:

  地区
  ABCDE合计
     包装3033294137170
3238393240181
2933353940176
4041453940205
合计131145148151157732

无交互作用的双因素方差分析与单因素方差分析类似,只是在写公式的时候变成【销售额~地区+包装】就行。

如果为了省事,可以使用gl()函数生成因子,但是为了与原数据对应,减小阅读压力,建议自己写因子水平。

gl(n, k, length = n*k, labels = seq_len(n), ordered = FALSE)
n:一个整数,表示水平的个数

an integer giving the number of levels.

k:表示每个水平重复几遍

an integer giving the number of replications.

length:如果前面两个都给出了,就不用给这项参数了,否则需要给出所有数据的个数

an integer giving the length of the result.

labels:结果的标签向量

an optional vector of labels for the resulting factor levels.

ordered:是否排序

a logical indicating whether the result should be ordered or not.

 

这里,我选择自己手动生成水平数据。

> dat<-read.table("clipboard",header = TRUE,stringsAsFactors = FALSE)

> dat

  包装  A  B  C  D  E

1   甲 30 33 29 41 37

2   乙 32 38 39 32 40

3   丙 29 33 35 39 40

4   丁 40 41 45 39 40

 

> sales<-c(dat$A,dat$B,dat$C,dat$D,dat$E)

> areas<-rep(c("A","B","C","D","E"),each=4)

> style<-rep(c('甲','乙','丙','丁'),5)

 

> sales

 [1] 30 32 29 40 33 38 33 41 29 39 35 45 41 32 39 39 37 40 40 40

> areas

 [1] "A" "A" "A" "A" "B" "B" "B" "B" "C" "C" "C" "C" "D" "D" "D" "D" "E" "E" "E" "E"

> style

 [1] "甲" "乙" "丙" "丁" "甲" "乙" "丙" "丁" "甲" "乙" "丙" "丁" "甲" "乙" "丙" "丁"

[17] "甲" "乙" "丙" "丁"

 

> drink_sale<-data.frame(sales,areas,style)

> drink_sale

   sales areas style

1     30     A    甲

2     32     A    乙

3     29     A    丙

4     40     A    丁

5     33     B    甲

6     38     B    乙

7     33     B    丙

8     41     B    丁

9     29     C    甲

10    39     C    乙

11    35     C    丙

12    45     C    丁

13    41     D    甲

14    32     D    乙

15    39     D    丙

16    39     D    丁

17    37     E    甲

18    40     E    乙

19    40     E    丙

20    40     E    丁

分析之前需要对地区和包装风格做方差齐性检验。

> bartlett.test(sales~areas,data = drink_sale)

 

         Bartlett test of homogeneity of variances

 

data:  sales by areas

Bartlett's K-squared = 4.833, df = 4, p-value = 0.3049

> bartlett.test(sales~style,data = drink_sale)

         Bartlett test of homogeneity of variances

 

data:  sales by style

Bartlett's K-squared = 2.017, df = 3, p-value = 0.5689

检验结果都无法拒绝原假设,即可以认为方差是相等的。

 接下来进行方差分析

> drink_aov<-aov(sales~areas+style,data = drink_sale)

> anova(drink_aov)

Analysis of Variance Table

Response: sales

          Df Sum Sq Mean Sq F value  Pr(>F) 

areas      4   93.8  23.450  1.6572 0.22397 

style      3  141.2  47.067  3.3263 0.05655 .

Residuals 12  169.8  14.150                 

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

两个p值都是大于0.05,因此可以认为销售地区与包装风格对销售额没有显著影响。

3、有交互作用的双因素方差分析

因素之间的交互作用在现实中很常见,比如胖胖的人喜欢蓝色的衣服,南方的人更喜欢喝雪花啤酒等,前者是体重和颜色的交互作用,后者是地区和啤酒品牌的交互作用。

因此,如果两个因素联合在一起对因变量有显著的影响,则称这样的方差分析为有交互作用的方差分析。

下面的数据展示的是各个路段在高峰期与非高峰期的车流量(数据来自《数据分析:R语言实战》)。对其进行双因素方差分析的过程如下。

 路段1路段2路段3
高峰期25 24 27 25 2519 20 23 22 21 29 28 31 28 30
非高峰期20 17 22 21 1718 17 13 16 1222 18 24 21 22

 

> cars<-read.table("clipboard",header = TRUE,stringsAsFactors = TRUE)

> summary(cars)

     车流量         路段          时期  

 Min.   :12.00   路段1:10   非高峰期:15 

 1st Qu.:18.25   路段2:10   高峰期  :15 

 Median :22.00   路段3:10               

 Mean   :21.90                          

 3rd Qu.:25.00                          

 Max.   :31.00      

方差齐性检验

> bartlett.test(车流量~路段,data=cars)

         Bartlett test of homogeneity of variances

 

data:  车流量 by 路段

Bartlett's K-squared = 0.57757, df = 2, p-value = 0.7492

 

> bartlett.test(车流量~时期,data=cars)

         Bartlett test of homogeneity of variances

 

data:  车流量 by 时期

Bartlett's K-squared = 0.053302, df = 1, p-value = 0.8174

上述检验显示满足方差齐性条件

接下来进行方差分析

> cars_aov<-aov(车流量~路段*时期,data=cars)

> anova(cars_aov)

Analysis of Variance Table

 

Response: 车流量

          Df  Sum Sq Mean Sq F value    Pr(>F)   

路段       2 261.600 130.800 35.3514 7.018e-08 ***

时期       1 313.633 313.633 84.7658 2.407e-09 ***

路段:时期  2   6.667   3.333  0.9009    0.4195   

Residuals 24  88.800   3.700                     

---

Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

路段和时期的p值都显著小于0.05,但是二者的联合效应的p值为0.4195,大于0.05,因此可以认为二者无显著的交互作用。

 

交互效应图可以更加直观地看出两个因素是否具有交互效应,可以用interaction.plot()绘制

interaction.plot(x.factor, trace.factor, response, fun = mean,type = c("l", "p", "b", "o", "c"), legend = TRUE,trace.label = deparse(substitute(trace.factor)),fixed = FALSE,xlab = deparse(substitute(x.factor)),ylab = ylabel,ylim = range(cells, na.rm = TRUE),lty = nc:1, col = 1, pch = c(1:9, 0, letters),xpd = NULL, leg.bg = par("bg"), leg.bty = "n",xtick = FALSE, xaxt = par("xaxt"), axes = TRUE,...)
x.factor

a factor whose levels will form the x axis.

trace.factor

another factor whose levels will form the traces.

response

a numeric variable giving the response

 

> names(cars)<-c("flow","path","time")

 

> attach(cars)

 

> interaction.plot(path,time,flow,legend = F)

> interaction.plot(time,path,flow,legend = F)


 两个图中的曲线均没有相交,可以初步认为没有交互作用。


http://chatgpt.dhexx.cn/article/jB6srycc.shtml

相关文章

相关度R方

相关度 这里的相关度使用皮尔逊相关性系数&#xff0c;计算公式为&#xff1a; 皮尔逊相关性系数可以从某个角度用来衡量预测值与实际值的相关性关系。 取值范围为[-1,1]&#xff0c;数值为正表示为正相关&#xff0c;为负表示为负相关。绝对值越大表示相关性越强。 使用scip…

一文搞定R语言拟合p值、R方...

R:ggplot2拟合&#xff0c;我推荐geom_smooth绘制拟合和ggpmisc添加统计信息。 几行代码就可以搞定了&#xff0c;对新手非常友好。 线性拟合 library(tidyverse) library(readxl) library(ggplot2) library(ggpmisc)repeat1_rawgrassland <- read_excel("D:/OneDri…

R语言在逻辑回归中求R square R方

并非所有结果/因变量都可以使用线性回归进行合理建模。也许第二种最常见的回归模型是逻辑回归&#xff0c;它适用于二元结果数据。最近我们被客户要求撰写关于逻辑回归的研究报告&#xff0c;包括一些图形和统计输出。如何计算逻辑回归模型的R平方&#xff1f; 相关视频&…

Regression 中的 R方

最近在学习ML,一直看到这R方,明白什么意思,但是不知道怎么算出来的,今天看sklearn文档的时候偶然看到了,记录下 简而言之,他的值表示该系列数据是否适合该Regression 算法, 得分越靠近1越适合. 总结来说就是, 1 减去 ( 所有 ( ( 真实值 减去 预测值 ) 的平方 ) 和 除以 所有 (…

基于MATLAB的R方计算

R方计算原理 什么是R方 R-square是你以后很多数据模型都需要用到的统计量&#xff0c;计量模型什么的&#xff0c;还有回归系数显著性检验&#xff0c;F检验&#xff0c;德斌沃森统计量检验。利用数据拟合一个模型时&#xff0c;模型肯定存在误差&#xff0c;那么回归方程对观…

数据科学 | 如何解释线性回归的R方

R方&#xff0c;即R-Squared&#xff0c;常用来衡量线性回归的拟合度。相关性“r"衡量两个变量间的相关性&#xff0c;相关性接近1表示变量间具有很强的正相关性&#xff0c;接近-1表示变量间具有很强的负相关性&#xff0c;接近0表示变量间没有太多的关系。R方与相关性”…

什么是R方?这6张图会让你终身难忘~

什么是R2 &#xff1f; 在回归模型中&#xff0c;因变量&#xff08;y&#xff09;总的方差&#xff08;信息&#xff09;可以被称作总平方和&#xff08;Total sum of squares&#xff0c;TSS&#xff09;&#xff0c;它由两部分组成[1]&#xff1a; 1. 模型可以解释的那部分信…

贝叶斯相关公式(Bayes)

这里只是记录一下&#xff0c;非常推荐马同学高等数学,文末有原文.点击这里看里面的例一应该是理解贝叶斯公式最好的例子 ,如果你稍微有一些基础&#xff0c;我觉得文末第二个链接中的例一更加适合你 代数推导 1. 贝叶斯公式 是根据条件概率推导的 P(A|B)P(AB)P(B)P(B|A)…

贝叶斯模型及其应用总结

本文参考整理众多资料而成。 http://blog.csdn.net/huaxi1902/article/details/24140061 http://mindhacks.cn/2008/09/21/the-magical-bayesian-method/ http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.html http://www.ruanyifeng.com/blog/2011/08…

贝叶斯预测模型 (数学原理与推导)

1. 方差的两种计算方法 对于方差计算的一个重要结论&#xff1a; 2. 联合概率分布-条件概率分布 当然&#xff0c;利用联合概率分布也很容易推出边缘概率分布&#xff1b;只需要对其他变量进行全积分即可&#xff01; 条件概率分布直观想象还是有难度的&#xff0c;很多时候我…

朴素贝叶斯算法 — 超详细公式讲解+代码实例

本文收录于Github仓库&#xff0c;欢迎前来 star 呀~ https://github.com/Veal98/cs-wiki在线阅读地址/更好的阅读体验请移步&#xff1a;cswiki.top &#x1f454; 朴素贝叶斯算法 Naive Bayes &#x1f4a1; 思维导图 1. 朴素贝叶斯法概述 朴素贝叶斯法是基于贝叶斯定理与…

贝叶斯定理

贝叶斯定理 通常&#xff0c;事件A在事件B的条件下的概率&#xff0c;与事件B在事件A的条件下的概率是不一样的&#xff1b;然而&#xff0c;这两者是有确定的关系&#xff0c;贝叶斯法则就是这种关系的陈述。 贝叶斯法则又被称为贝叶斯定理、贝叶斯规则&#xff0c;是指概率统…

dbus 学习

和菜鸟一起学linux之DBUS基础学习记录 D-Bus三层架构 D-Bus是一个为应用程序间通信的消息总线系统, 用于进程之间的通信。它是个3层架构的IPC 系统&#xff0c;包括&#xff1a; 1、函数库libdbus &#xff0c;用于两个应用程序互相联系和交互消息。 2、一个基于libdbus构造…

ubuntu DBUS 收集

ubuntu DBUS 收集 libdbus-1.so.3.19.11 是dbus-1.12.16.tar.gz 包编译出来的 参考文档: https://www.freedesktop.org/wiki/Software/dbus/ https://www.freedesktop.org/wiki/IntroductionToDBus/ https://dbus.freedesktop.org/doc/dbus-tutorial.html https://docs.gtk.…

Linux DBUS服务器端程序

DBus 服务器端接收方式 DBus 服务器端用来接收signal和method调用。从收集的资料中发现&#xff0c;主要有三种接收方式。 一&#xff0c;采用while循环&#xff0c;监听dbus_connection_read_write()函数。有消息到来时在循环内部进行处理。优点是结构简单&#xff0c;处理方…

Linux -dbus总线

下载编译dbus 下载https://dbus.freedesktop.org/releases/dbus/ dbussrc1.14.0-Linux文档类资源-CSDN下载 dbus-1.14.0.tar.xz xz -d dbus-1.14.0.tar.xz tar xvf dbus-1.14.0.tar2.配置编译 ./configure --prefix/data/opensrc/dbus #--prefix/data/opensrc/dbus 指定输…

DBus通讯

linux下进程间通信的方式主要有Pipe(管道)&#xff0c;FIFO(命名管道)&#xff0c;信号&#xff0c;共享内存&#xff0c;消息队列&#xff0c;信号灯等&#xff0c;这些方式各有 各得特点&#xff0c;如管道是linux下命令行中常用的&#xff0c;用于父子进程的通信。但是这些通…

Linux DBUS客户端程序

DBUS客户端程序&#xff0c;发送一个信号&#xff0c;信号携带int型数据。信号的object path为"/test/signal/server"&#xff0c;interface名为 "test.signal.Type"&#xff0c;信号名为"Test"。接收端可以根据这三个属性来判断是否是想接收的信…

四、QtDbus

文章目录 概述一、QtDBus模块Debug备忘单 二、QtDBus类型系统1、QtDBus类型系统简介2、原生类型3、复合类型4、扩展类型系统5、类型系统使用 三、QtDBus常用类1、QDBusMessage2、QDBusConnection3、QDBusInterface4、QDBusReply5、QDBusAbstractAdaptor6、QDBusAbstractInterfa…

Hello Qt——QtDBus快速入门

一、QtDBus简介 QtDBus是一个使用D-Bus协议进行进程间通信的仅在Unix运行的库&#xff0c;是对D-Bus底层API的封装实现。 QtDBus模块提供了使用Qt信号槽机制扩展的接口。要使用QtDBus模块&#xff0c;需要在代码中加入以下代码&#xff1a; #include <QtDBus> 如果使用…