方差分析
方差分析(ANOVA),是针对连续变量的参数检验,检验多个分组的均值有无 差异,其中分组是按影响因素的不同水平值组合进行划分的。它是对总变异进 行分解,看总变异是由哪些部分组成的,这些部分间的关系如何。
方差分析可以用于:两因素间交互作用差异进行显著性检验、完全随机设计(单因素)、随机区组设计(双因素)、析因设计、拉丁方设 计和正交设计等资料。
假若有四个行业,进一步分析这4个行业的服务质量是否具有显著差异。
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
✔ ggplot2 3.4.0 ✔ purrr 1.0.1
✔ tibble 3.1.8 ✔ dplyr 1.1.0
✔ tidyr 1.3.0 ✔ stringr 1.5.0
✔ readr 2.1.4 ✔ forcats 0.5.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
complaints = tibble(id = 1:7,
零售业 = c(57,66,49,40,34,53,44), 旅游业 = c(68,39,29,45,56,51,NA), 航空公司 = c(31,49,21,34,40,NA,NA), 家电制造业 = c(44,51,65,77,58,NA,NA))
complaints
# A tibble: 7 × 5
id 零售业 旅游业 航空公司 家电制造业
<int> <dbl> <dbl> <dbl> <dbl>
1 1 57 68 31 44
2 2 66 39 49 51
3 3 49 29 21 65
4 4 40 45 34 77
5 5 34 56 40 58
6 6 53 51 NA NA
7 7 44 NA NA NA
即检验这4个行业的均值是否是相等;检验的方式是通过方差分析来实现。
- 因素:需要检验的对象或要考虑的影响因素。在这里是”行业”。
- 水平或处理:因素的不同取值。
- 观测值:每个因素下的样本数据,在这里是投诉次数。
以
showtext::showtext_auto()
complaints = complaints %>%
pivot_longer(-id, names_to = "行业",values_to = "投诉",values_drop_na = TRUE) %>%
mutate(行业 = factor(行业))
complaints %>%
ggplot(aes(行业, 投诉)) + geom_boxplot() + geom_point()
可从该箱线图看出行业内的公司有差异(组内差异),同时不同行业间的均值也存在差异(组间差异)。 方差分析的基本假设是:各组分别来自正态总体和各组方差相等。在这两条件下,各组之间存在差异,只可能是来自于影响因素的不同水平下的均值不同。
方差分析假定每一个观测值都由若干部分累加而成,即总的效应可分解为若干 部分,每一部分都有特定含义,称为效应的可加性。
单因素方差分析
1个因变量,1个影响因素,其模型可表示为: \[ 总差异Y_{ij} =平均差异\mu+因素1差异\alpha_i +随机差异\varepsilon_{ij} \]
以行业投诉数据差异为例,提出假设检验: \[ H_0:\mu_1=\mu_2=\mu_3=\mu+4 \]
\[
H_1:\mu_1,\mu_2,\mu_3,\mu_4不全相等
\]
Attaching package: 'rstatix'
The following object is masked from 'package:stats':
filter
complaints %>%
group_by(行业) %>%
shapiro_test(投诉)
# A tibble: 4 × 4
行业 variable statistic p
<fct> <chr> <dbl> <dbl>
1 家电制造业 投诉 0.986 0.963
2 旅游业 投诉 0.999 1.00
3 航空公司 投诉 0.995 0.994
4 零售业 投诉 0.993 0.997
complaints %>% levene_test(投诉 ~ 行业)
# A tibble: 1 × 4
df1 df2 statistic p
<int> <int> <dbl> <dbl>
1 3 19 0.197 0.897
双因素方差分析
\[
\begin{aligned}
&1 个因变量,2 个影响因素,其模型可表示为:\\
总差异Y_{ijk}&=平均差异\mu+因素1差异\alpha_i +因素2差异\beta_j\\
&+因素1,2交互作用差异\gamma_{ij} + 随机差异\varepsilon_{ijk}
\end{aligned}
\]
df = as_tibble(ToothGrowth) %>%
mutate(dose = factor(dose))
df
# A tibble: 60 × 3
len supp dose
<dbl> <fct> <fct>
1 4.2 VC 0.5
2 11.5 VC 0.5
3 7.3 VC 0.5
4 5.8 VC 0.5
5 6.4 VC 0.5
6 10 VC 0.5
7 11.2 VC 0.5
8 11.2 VC 0.5
9 5.2 VC 0.5
10 7 VC 0.5
# … with 50 more rows
df %>%
group_by(supp, dose) %>%
shapiro_test(len)
# A tibble: 6 × 5
supp dose variable statistic p
<fct> <fct> <chr> <dbl> <dbl>
1 OJ 0.5 len 0.893 0.182
2 OJ 1 len 0.927 0.415
3 OJ 2 len 0.963 0.815
4 VC 0.5 len 0.890 0.170
5 VC 1 len 0.908 0.270
6 VC 2 len 0.973 0.919
anova_test(df, len ~ supp * dose)
ANOVA Table (type II tests)
Effect DFn DFd F p p<.05 ges
1 supp 1 54 15.572 2.31e-04 * 0.224
2 dose 2 54 92.000 4.05e-18 * 0.773
3 supp:dose 2 54 4.107 2.20e-02 * 0.132
若方差分析的前提:正态性、方差齐性不满足,则可以用相应的非参数检验: - (独立)kruskal_test(): Kruskal-Wallis 秩和检验 - (相关)friedman_test(): Friedman 检验