17  多元统计分析

17.1 方差分析

方差分析(ANOVA),是针对连续变量的参数检验,检验多个分组的均值有无 差异,其中分组是按影响因素的不同水平值组合进行划分的。它是对总变异进 行分解,看总变异是由哪些部分组成的,这些部分间的关系如何。

方差分析可以用于:两因素间交互作用差异进行显著性检验、完全随机设计(单因素)、随机区组设计(双因素)、析因设计、拉丁方设 计和正交设计等资料。

假若有四个行业,进一步分析这4个行业的服务质量是否具有显著差异。

library(tidyverse)
── 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()

可从该箱线图看出行业内的公司有差异(组内差异),同时不同行业间的均值也存在差异(组间差异)。 方差分析的基本假设是:各组分别来自正态总体和各组方差相等。在这两条件下,各组之间存在差异,只可能是来自于影响因素的不同水平下的均值不同。

方差分析假定每一个观测值都由若干部分累加而成,即总的效应可分解为若干 部分,每一部分都有特定含义,称为效应的可加性。

17.1.1 单因素方差分析

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不全相等 \]

library(rstatix)

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

17.1.2 双因素方差分析

\[ \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 检验