R中的aov()和 anova()函数看似相似,但实际上我们在两种不同的情况下使用它们。
当我们想拟合一个方差分析模型并在方差分析汇总表中查看结果时,我们使用aov()。
当我们想比较嵌套回归模型的拟合度时,我们使用anova(),以确定具有某个系数集的回归模型是否比只具有系数子集的模型提供了明显更好的拟合。
下面的例子展示了如何在实践中使用每个函数。
例子1:如何在R语言中使用aov()
假设我们想进行一个单因素方差分析,以确定三种不同的运动项目是否对减肥有不同的影响。
我们招募了90人参加一个实验,随机分配30人跟随方案A、方案B或方案C一个月。
下面的代码显示了如何使用R中的**aov()**函数来执行这个单因素方差分析:
#make this example reproducible
set.seed(0)
#create data frame
df <- data.frame(program = rep(c("A", "B", "C"), each=30),
weight_loss = c(runif(30, 0, 3),
runif(30, 0, 5),
runif(30, 1, 7)))
#fit one-way anova using aov()
fit <- aov(weight_loss ~ program, data=df)
#view results
summary(fit)
Df Sum Sq Mean Sq F value Pr(>F)
program 2 98.93 49.46 30.83 7.55e-11 ***
Residuals 87 139.57 1.60
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
从模型输出中我们可以看到,方案的p值(.00000000755)小于0.05,这意味着三个方案之间的平均减重存在统计学上的显著差异。
例2:如何在R中使用anova()?
假设我们想用学习时数来预测某所大学学生的考试分数。我们可以决定拟合以下两个回归模型。
完整模型:分数=β0+B1(小时)+B2(小时)2
简化模型:分数 = β0 +B1(小时)
下面的代码显示了如何使用R中的anova()函数来进行缺乏拟合测试,以确定完整模型是否比缩小模型提供了明显更好的拟合:
#make this example reproducible
set.seed(1)
#create dataset
df <- data.frame(hours = runif(50, 5, 15), score=50)
df$score = df$score + df$hours^3/150 + df$hours*runif(50, 1, 2)
#view head of data
head(df)
hours score
1 7.655087 64.30191
2 8.721239 70.65430
3 10.728534 73.66114
4 14.082078 86.14630
5 7.016819 59.81595
6 13.983897 83.60510
#fit full model
full <- lm(score ~ poly(hours,2), data=df)
#fit reduced model
reduced <- lm(score ~ hours, data=df)
#perform lack of fit test using anova()
anova(full, reduced)
Analysis of Variance Table
Model 1: score ~ poly(hours, 2)
Model 2: score ~ hours
Res.Df RSS Df Sum of Sq F Pr(>F)
1 47 368.48
2 48 451.22 -1 -82.744 10.554 0.002144 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
由于输出表中的P值(0.002144)小于0.05,我们可以拒绝测试的无效假设,并得出结论:完整模型在统计上比缩小模型提供了更好的拟合。