何时在 r 中使用 aov() 与 anova()
R中的aov()和anova()函数看起来很相似,但我们实际上在两种不同的场景中使用它们。
当我们想要拟合方差分析模型并在方差分析汇总表中显示结果时,我们使用aov() 。
当我们想要比较嵌套回归模型的拟合度以确定具有特定系数集的回归模型是否比仅具有系数子集的模型提供更好的拟合时,我们使用anova() 。
以下示例展示了如何在实践中使用每个功能。
示例 1:如何在 R 中使用 aov()
假设我们想要执行单向方差分析来确定三种不同的锻炼计划是否对减肥有不同的影响。
我们招募 90 人参加一项实验,随机分配 30 人遵循计划 A、计划 B 或计划 C,为期一个月。
以下代码展示了如何使用 R 中的aov()函数来执行这一单向方差分析:
#make this example reproducible set. seeds (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 --- Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
从模型结果中,我们可以看到该计划的p值(0.0000000000755)小于0.05,这意味着三个计划之间的平均体重减轻存在统计上的显着差异。
示例 2:如何在 R 中使用 anova()
假设我们想使用学习小时数来预测某所大学学生的考试成绩。我们可以决定采用以下两个回归模型:
完整模型:分数 = β 0 + B 1 (小时)+ B 2 (小时) 2
简化模型:分数 = β 0 + B 1 (小时)
以下代码演示了如何使用 R 中的anova()函数执行失拟检验,以确定完整模型是否提供比简化模型明显更好的拟合:
#make this example reproducible
set. seeds (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 **
---
Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
由于输出表中的 p 值 (0.002144) 小于 0.05,因此我们可以拒绝检验的原假设,并得出结论:完整模型在统计上比简化模型提供了显着更好的拟合。
其他资源
以下教程解释了如何在 R 中执行其他常见任务: