-
Notifications
You must be signed in to change notification settings - Fork 18
/
common-statistical-tests.qmd
1405 lines (1049 loc) · 63.6 KB
/
common-statistical-tests.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# 常见的统计检验 {#sec-common-statistical-tests}
\index{统计检验}
```{r}
#| echo: false
source("_common.R")
```
::: hidden
$$
\def\bm#1{{\boldsymbol #1}}
$$
:::
::: callout-tip
## 本章亮点
1. 比较全面地展示各类统计检验问题的 R 语言实现,其覆盖面之广,远超市面上同类 R 语言书籍。从连续数据到离散数据,从单样本到两样本,再到一般的多样本,触及最前沿的热门话题。
2. 对每类统计检验问题都给出示例及 R 语言实现,涉及近 40 个统计检验方法。在组织结构上,本章按照数据情况对检验方法分类,方便读者根据手头的数据情况,快速从众多的方法中定位最合适的检验方法,符合从数据出发进行分析实战的要求。
:::
> The Earth is Round ($p < 0.05$)
>
> --- Jacob Cohen [@Cohen1994]
Jacob Cohen 实际谈的是更加深刻的问题。开篇介绍为什么需要假设检验,做检验和不做检验有什么区别?R. A. Fisher 将抽样分布、参数估计和假设检验列为统计推断的三个中心内容,可见假设检验的重要地位。经过近百余年的发展,假设检验具有丰富的内容,可以从不同的角度对检验方法进行归类。
- 检验方法归类:参数与非参数检验方法。
- 检验计算方式:近似 Approximate、精确 Extract、模拟 Simulation 和重抽样 Bootstrap 等方式。
- 检验对象归类:位置参数(均值)和尺度参数(方差)的检验。
- 检验总体数量归类:单总体、两个总体和多个总体。
- 检验总体分布归类:正态、二项、泊松、多项分布等。
- 检验总体维度归类:分一维、二维和多维的情形。
- 检验样本的数量:小样本 $n < 30$ 和大样本 $n \geq 30$。
$\chi^2$ 分布、t 分布和 F 分布作为最基础的三大抽样分布,分别是由 K. Pearson 卡尔·皮尔逊、W. S. Gosset 哥塞特、R. A. Fisher 费希尔提出,并以他们的名字命名的。在假设检验中,也有许多检验方法是以提出者的名字命名的。本来名字具有突出效果,由检验方法联系人物名称,可以帮助记忆,但如此之多,以至于很难一一记住。因此,本文也不按检验方法罗列,但是,推荐读者了解这些统计大师的工作和故事,相信会加深对这些检验方法的理解。关于检验方法,如有不明白的地方,可以查看维基百科词条。对每个检验问题,本章给出原假设和备择假设,检验统计量及其服从的分布,R 语言实现(自编或调用函数,如果调用函数,说明参数及其含义),不讲公式推导过程。
在 R 语言中,有大量的函数可以对样本数据做检验,每一个函数对应一个或多个检验问题。为了让读者根据手头数据可以快速地找到最合适的检验方法。单样本检验、两样本检验和多样本检验都只针对连续数据。计数数据检验针对离散数据,不区分总体数量。配对样本检验是两样本检验中的特殊情况,不分连续还是离散,不分两个样本还是多个样本,多个样本就是两两配对检验。前面都是关于某个特征统计量的检验,对分布的检验涉及样本点是否来自正态分布,样本点是否独立和平稳,样本点是否来自某一分布,两个样本是否来自相同分布等。
```{r}
#| message: false
library(nlme)
library(ggplot2)
library(pwr) # 计算检验的功效和实验样本量
library(dunn.test) # dunn.test
library(car) # leveneTest 可替代 bartlett.test
library(survival)
library(coin) # 补充更多的检验方法
# library(multcomp) # 多重比较
# library(MKpower) # power.welch.t.test
# library(rstatix) # 管道操作整合检验方法
# library(pwrss) # 常见检验的功效和样本量计算
```
## 单样本检验 {#sec-one-sample}
```{mermaid}
%%| label: fig-one-sample
%%| fig-cap: 单样本检验
%%| fig-width: 6.5
flowchart LR
A(单样本) --> B1(正态总体)
A --> B2(总体未知)
B1 --> C1(均值检验)
C1 --> D1(方差已知) --> E1(Z 检验)
C1 --> D2(方差未知) --> E2(t 检验)
B1 --> C2(方差检验) --> E3(卡方检验)
B2 --> C3(均值检验) --> E4(Wilcoxon 秩和检验)
B2 --> C4(方差检验) --> E5[无检验方法]
```
### 正态总体均值检验
#### 方差已知
$$
\begin{aligned}
\mathrm{I} \quad H_0: \mu - \mu_0 \leq 0 \quad vs. \quad H_1: \mu - \mu_0 > 0 \\
\mathrm{II} \quad H_0: \mu - \mu_0 \geq 0 \quad vs. \quad H_1: \mu - \mu_0 < 0 \\
\mathrm{III} \quad H_0: \mu - \mu_0 = 0 \quad vs. \quad H_1: \mu - \mu_0 \neq 0
\end{aligned}
$$
设 $x_1,\cdots,x_n$ 是来自总体 $\mathcal{N}(\mu,\sigma^2)$ 的样本,样本均值和方差分别
$\bar{x} = \frac{\sum_{i=1}^{n}x_i}{n}$ ,$s^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \bar{x})^2$
考虑到 $\bar{x} \sim \mathcal{N}(\mu,\sigma^2 / n)$ ,则检验统计量服从正态分布
$$
u = \frac{\bar{x} - \mu_0}{\sigma / \sqrt{n}}
$$
假定 $\mu_0 = 1$ 对于检验问题 I 拒绝域 $\{u \geq u_{1-\alpha}\}$
```{r}
set.seed(20232023)
n <- 20
# 样本
x <- rnorm(n, mean = 1.8, sd = 2)
# 检验统计量
u <- (mean(x) - 1) / (2 / sqrt(n))
# 临界值
qnorm(p = 1 - 0.05, mean = 0, sd = 1)
# P 值
1 - pnorm(q = u)
```
::: callout-important
随机变量 $X$ 服从标准正态分布,它的概率分布函数如下:
$$
P(X \leq u)= \phi(u) = \frac{1}{\sqrt{2\pi}}\int_{-\infty}^{u}\mathrm{e}^{-t^2/2}\mathrm{dt}
$$
若已知概率 $p = 0.95$ ,则对应的下分位点可用函数 `qnorm()` 计算。
```{r}
qnorm(p = 0.95, mean = 0, sd = 1)
```
:::
#### 方差未知
$$
\begin{aligned}
\mathrm{I} \quad H_0: \mu - \mu_0 \leq 0 \quad vs. \quad H_1: \mu - \mu_0 > 0 \\
\mathrm{II} \quad H_0: \mu - \mu_0 \geq 0 \quad vs. \quad H_1: \mu - \mu_0 < 0 \\
\mathrm{III} \quad H_0: \mu - \mu_0 = 0 \quad vs. \quad H_1: \mu - \mu_0 \neq 0
\end{aligned}
$$
考虑到
$$
\begin{aligned}
& \frac{\bar{x} - \mu}{\sigma / \sqrt{n}} \sim \mathcal{N}(0,1) \\
& \frac{(n-1)s^2}{\sigma^2} \sim \chi^2(n-1) \\
& \mathsf{E}\{s^2\} = \sigma^2 \quad \mathsf{Var}\{s^2\} = \frac{2\sigma^4}{n-1}
\end{aligned}
$$
根据 t 分布的定义,检验统计量服从 t 分布,即 $t \sim t(n-1)$
$$
t = \frac{\bar{x} - \mu_0}{s/\sqrt{n}}
$$
假定 $\mu_0 = 1$ 对于检验问题 I ,拒绝域 $\{t \geq t_{1-\alpha}(n-1)\}$
```{r}
# 检验统计量
t0 <- (mean(x) - 1) / sqrt(var(x) / n)
# 临界值
qt(p = 1 - 0.05, df = n - 1)
# P 值
1 - pt(q = t0, df = n - 1)
```
::: callout-note
英国统计学家 William Sealy Gosset (1876-1937) 于 1908 年在杂志 《Biometrics》 上以笔名 Student 发表论文《The Probable Error of a Mean》[@Gosset1908],论文中展示了独立同正态分布的样本 $x_1, \ldots, x_n \stackrel{i.i.d}{\sim} \mathcal{N}(\mu,\sigma^2)$ 的样本方差 $s^2$ 和样本标准差 $s$ 的抽样分布,根据均值和标准差不相关的性质导出 t 分布,宣告 t 分布的诞生,因其在小样本领域的突出贡献,W. S. Gosset 进入世纪名人录 [@Heyde2001]。
:::
```{r}
#| label: tbl-t-quantile
#| tbl-cap: $t$ 分布的分位数表
#| echo: false
vec_prob <- c(
0.75, 0.80, 0.90, 0.95,
0.975, 0.99, 0.995, 0.999
)
vec_df <- 1:10
tmp <- mapply(FUN = qt,
p = vec_prob,
MoreArgs = list(df = vec_df), SIMPLIFY = TRUE
)
row.names(tmp) <- vec_df
knitr::kable(tmp, row.names = TRUE, col.names = vec_prob, digits = 4)
```
### 正态总体方差检验
卡方检验 $\chi^2$ 检验统计量服从卡方分布。
$$
\begin{aligned}
\mathrm{I} \quad H_0: \sigma^2 - \sigma^2_0 \leq 0 \quad vs. \quad H_1: \sigma^2 - \sigma^2_0 > 0 \\
\mathrm{II} \quad H_0: \sigma^2 - \sigma^2_0 \geq 0 \quad vs. \quad H_1: \sigma^2 - \sigma^2_0 < 0 \\
\mathrm{III} \quad H_0: \sigma^2 - \sigma^2_0 = 0 \quad vs. \quad H_1: \sigma^2 - \sigma^2_0 \neq 0
\end{aligned}
$$
一般假定均值 $\mu$ 是未知的。检验统计量服从卡方分布 $\chi^2(n-1)$
$$
\chi^2 = \frac{(n-1)s^2}{\sigma^2_0}
$$
设 $\sigma^2_0 = 1.5^2$ ,考虑检验问题 I
```{r}
# 检验统计量
chi <- (n - 1) * var(x) / 1.5^2
# 临界值
qchisq(p = 1 - 0.05, df = n -1)
# P 值
1 - pchisq(q = chi, df = n -1)
```
R 软件提供很多统计分布的计算,因此,不再需要查分位数表,现算即可。计算自由度为 $n$ 概率为 $p$ 的 $\chi^2$ 分布的分位数 $\chi^2_p(n)$ ,即
$$
P(\chi^2(n) \leq \chi^2_p(n)) = p
$$
若已知自由度为 1 ,概率为 0.05,则可借助分位数函数 `qchisq()` 计算对应的(下)分位点。
```{r}
qchisq(p = 0.05, df = 1)
```
同理,也可以获得 $\chi^2$ 分布的分位数 @tbl-chisq-quantile ,计算出来的分位数保留 4 位小数。
```{r}
#| label: tbl-chisq-quantile
#| tbl-cap: $\chi^2$ 分布的分位数表
#| echo: false
vec_prob <- c(
0.005, 0.01, 0.025, 0.05, 0.1,
0.9, 0.95, 0.975, 0.99, 0.995
)
vec_df <- 1:10
tmp <- mapply(FUN = qchisq,
p = vec_prob,
MoreArgs = list(df = vec_df), SIMPLIFY = TRUE
)
row.names(tmp) <- vec_df
knitr::kable(tmp, row.names = TRUE, col.names = vec_prob, digits = 4)
```
### 总体未知均值检验
有了均值和方差,为什么还要位置参数和尺度参数?为了更一般地描述问题,扩展范围。特别是在总体分布未知或知之甚少的情况下做检验,不再仅限于均值和方差这样的特征量。
考虑前面正态总体均值检验中的假设 I 的形式,若总体的分布形式未知,则需要 Wilcoxon (威尔科克森)秩和检验 `wilcox.test()` 来做均值的比较。
```{r}
wilcox.test(x = x, mu = 1, alternative = "greater")
```
相比于 t 检验,P 值更小。
### 总体未知方差检验
## 两样本检验 {#sec-two-samples}
```{mermaid}
%%| label: fig-two-samples
%%| fig-cap: 两样本检验
%%| fig-width: 6.5
flowchart LR
A(两样本) --> B1(正态总体)
A --> B2(总体未知)
B1 --> C1(均值检验)
C1 --> D1(方差已知) --> E1(Z 检验)
C1 --> D2(方差未知但相等) --> E2(t 检验)
C1 --> D3(方差未知且不等) --> E3(Welch t 检验)
B1 --> C2(方差检验) --> E4(F 检验)
C2 --> E7(Bartlett 检验)
B2 --> C3(均值检验) --> E5(Wilcoxon 符号秩检验\nKruskal-Wallis 秩和检验)
B2 --> C4(方差检验) --> E8(Ansari-Bradley 检验\nMood 检验\nFligner-Killeen 检验)
```
设 $x_1,\cdots,x_{n_1}$ 是来自总体 $\mathcal{N}(\mu_1,\sigma_1^2)$ 的样本,设 $y_1,\cdots,y_{n_2}$ 是来自总体 $\mathcal{N}(\mu_2,\sigma_2^2)$ 的样本。
### 正态总体均值检验
两样本均值之差的检验
```{r}
#| label: fig-two-samples-means
#| fig-cap: 两样本均值之差的检验
#| fig-width: 5.5
#| fig-height: 3.5
#| dev: 'tikz'
#| fig-process: !expr to_png
#| code-fold: true
#| echo: !expr knitr::is_html_output()
library(ggplot2)
# 绘制虚线所需的数据
const <- 1 / sqrt(2 * pi)
dat <- data.frame(
x = c(-1, -1, 3, 3),
y = c(const, 0, const / 1.5, 0),
group = c("dnorm1", "dnorm1", "dnorm2", "dnorm2"),
upper = c(const, 0, const / 1.5, 0),
lower = c(0, 0, 0, 0)
)
ggplot() +
geom_function(
fun = dnorm, args = list(mean = -1, sd = 1),
aes(colour = "dnorm1"), linewidth = 1.5, xlim = c(-5, 10)
) +
geom_function(
fun = dnorm, args = list(mean = 3, sd = 1.5),
aes(colour = "dnorm2"), linewidth = 1.5, xlim = c(-5, 10)
) +
scale_color_brewer(palette = "Set1", labels = c(
dnorm1 = "$\\mathcal{N}(\\mu_1, \\sigma_1^2)$",
dnorm2 = "$\\mathcal{N}(\\mu_2, \\sigma_2^2)$"
)) +
geom_linerange(
aes(x = x, y = y, ymin = lower, ymax = upper, colour = group),
linewidth = 2, lty = 2, show.legend = FALSE, data = dat
) +
annotate("text", x = -1, y = 0, label = "$\\mu_1$", vjust = 2.5) +
annotate("text", x = 3, y = 0, label = "$\\mu_2$", vjust = 2.5) +
theme_classic(base_size = 13) +
theme(legend.position.inside = c(0.9, 0.9)) +
labs(x = "$x$", y = "$f(x)$", color = "正态分布") +
coord_cartesian(clip = "off")
```
常见检验问题
$$
\begin{aligned}
\mathrm{I} \quad H_0: \mu_1 - \mu_2 \leq 0 \quad vs. \quad H_1: \mu_1 - \mu_2 > 0 \\
\mathrm{II} \quad H_0: \mu_1 - \mu_2 \geq 0 \quad vs. \quad H_1: \mu_1 - \mu_2 < 0 \\
\mathrm{III} \quad H_0: \mu_1 - \mu_2 = 0 \quad vs. \quad H_1: \mu_1 - \mu_2 \neq 0
\end{aligned}
$$
#### 方差已知
$$
u = \frac{(\bar{x} - \bar{y}) - (\mu_1 - \mu_2)}{\sqrt{\frac{\sigma^2_1}{n_1} + \frac{\sigma^2_2}{n_2}} }
$$
检验统计量服从标准正态分布 $u \sim \mathcal{N}(0,1)$,检验统计量 $u$ 对应的样本值 $u_0$,检验的拒绝域和 $P$ 值如下
$$
W_1 = \{u \geq u_{1 - \alpha} \}, \quad p_1 = 1 - \varPhi(u_0)
$$
```{r}
n_1 <- 100
n_2 <- 80
mu_1 <- 10
sigma_1 <- 2.5
mu_2 <- 6
sigma_2 <- 4.5
set.seed(20232023)
x1 <- rnorm(n_1, mean = mu_1, sd = sigma_1)
y1 <- rnorm(n_2, mean = mu_2, sd = sigma_2)
u0 <- (mean(x1) - mean(y1)) / sqrt(sigma_1^2 / n_1 + sigma_2^2 / n_2)
u0
```
对检验问题 I,给定显著性水平 $\alpha = 0.05$,得出拒绝域 $\{ u \geq 1.645\}$,计算样本观察值得到的检验统计量的值 $u_0 = 6.779$,而该值落在拒绝域,所以拒绝原假设,即拒绝 $\mu_1 - \mu_2 \leq 0$,则接受 $\mu_1 - \mu_2 > 0$。
```{r}
# 计算拒绝域
qnorm(1 - 0.05)
# 计算 P 值
1 - pnorm(u0)
```
#### 方差未知但相等
设 $x_1,\cdots,x_{n_1}$ 是来自总体 $\mathcal{N}(\mu_1,\sigma^2)$ 的样本,设 $y_1,\cdots,y_{n_2}$ 是来自总体 $\mathcal{N}(\mu_2,\sigma^2)$ 的样本。
t 检验,检验统计量服从自由度为 $n_1 + n_2 - 2$ 的 t 分布
$$
t = \frac{(\bar{x} -\bar{y})-(\mu_1 - \mu_2)}{s_0\sqrt{\frac{1}{n_1} + \frac{1}{n_2}}}
$$
其中,
$$
\begin{aligned}
& \bar{x} = \sum_{i=1}^{n_1}x_i \quad \bar{y} = \sum_{i=1}^{n_2}y_i \\
& s_0^2 = \frac{1}{n_1 + n_2 - 2}\big(\sum_{i=1}^{n_1}(x_i - \bar{x})^2 + \sum_{i=1}^{n_2}(y_i - \bar{y})^2\big)
\end{aligned}
$$
```{r}
s_w <- sqrt(1 / (n_1 + n_2 - 2) * ((n_1 - 1) * var(x1) + (n_2 - 1) * var(y1)))
t0 <- (mean(x1) - mean(y1)) / (s_w * sqrt(1 / n_1 + 1 / n_2))
t0
```
样本观察值 $t_0 = 8.155 > t_{0.95}(n_1 + n_2 -2) = 1.653$ 落在拒绝域内,对于检验问题 I 我们要拒绝原假设
```{r}
# 临界值:0.95 分位点对应的分位数
qt(1 - 0.05, df = n_1 + n_2 - 2)
# p 值
1 - pt(t0, df = n_1 + n_2 - 2, lower.tail = TRUE)
```
利用 R 内置的 `t.test()` 函数计算
```{r}
t.test(x = x1, y = y1, alternative = "greater", var.equal = TRUE)
```
检验统计量的值及对应的 P 值都是一样的。睡眠数据 sleep 记录了两种药物对病人睡眠时间的影响,此数据集由 "Student"(哥塞特的笔名) 收集。
```{r}
# 方差未知但相等
t.test(extra ~ group, data = sleep, var.equal = TRUE)
```
#### 方差未知且不等
两个样本的样本量不是很大,总体方差也未知,两样本均值之差的显著性检验,即著名的 Behrens-Fisher 问题,Welch 在 1938 年提出近似服从自由度为 $l$ 的 t 分布。
两样本的样本量很大,尽管总体方差未知,两样本均值之差的显著性检验,极限分布是正态分布,可以用 Z 检验。在样本量很大的情况下,Welch t 检验也可以用。
设 $x_1,\cdots,x_{n_1}$ 是来自总体 $\mathcal{N}(\mu_1,\sigma_1^2)$ 的 IID 样本,设 $y_1,\cdots,y_{n_2}$ 是来自总体 $\mathcal{N}(\mu_2,\sigma_2^2)$ 的 IID 样本。
Welch(韦尔奇) t 检验
$$
T = \frac{(\bar{x} - \bar{y}) - (\mu_1 - \mu_2)}{\sqrt{\frac{s_x^2}{n_1} + \frac{s_y^2}{n_2}} }
$$
其中,$s_x^2$ 表示样本 x 的方差 $s_x^2 = \frac{1}{n_1-1}\sum_{i=1}^{n_1}(x_i -\bar{x})^2$ ,$s_y^2$ 表示样本 y 的方差 $s_y^2 = \frac{1}{n_2-1}\sum_{i=1}^{n_2}(y_i -\bar{y})^2$ 。检验统计量 $T$ 服从自由度为 $l$ 的 t 分布。
$$
l = \frac{s_0^4}{ \frac{s_x^4}{n_1^2(n_1 - 1)} + \frac{s_y^4}{n_2^2(n_2-1)} }
$$
其中, $s_0^2 = s_x^2 / n_1 + s_y^2/n_2$,$l$ 通常不是整数,实际使用时,$l$ 可取最近的整数。
```{r}
s0 <- var(x1) / n_1 + var(y1) / n_2
l <- s0^2 / (var(x1)^2 / (n_1^2 * (n_1 - 1)) + var(y1)^2 / (n_2^2 * (n_2 - 1)))
l
```
所以, $l$ 可取 127。检验统计量的值如下
```{r}
t0 <- (mean(x1) - mean(y1)) / sqrt(s0)
t0
```
```{r}
# 临界值:0.95 分位点对应的分位数
qt(1 - 0.05, df = 127)
# p 值
1 - pt(t0, df = 126.7708, lower.tail = TRUE)
# 就近取整
1 - pt(t0, df = 127, lower.tail = TRUE)
```
与函数 `t.test()` 比较,值得注意,t 分布的自由度可以为非整数。
```{r}
t.test(x = x1, y = y1, alternative = "greater", var.equal = FALSE)
```
举例:sleep 数据集
```{r}
#| label: fig-sleep
#| fig-width: 5
#| fig-height: 4
#| fig-cap: 学生睡眠数据的分布
#| fig-showtext: true
#| echo: false
ggplot(aes(x = group, y = extra, color = group), data = sleep) +
geom_boxplot() +
geom_jitter() +
theme_classic()
```
```{r}
# 方差未知且不等
t.test(extra ~ group, data = sleep, var.equal = FALSE)
```
::: callout-note
Egon Pearson 接过他父亲 Karl Pearson 的职位,担任伦敦大学学院的高尔顿统计教授。许宝騄(Pao-Lu Hsu)在 Jerzy Neyman 和 Egon Pearson 主编的杂志《Statistical Research Memoirs》发表第一篇关于 Behrens-Fisher 问题的论文 [@Hsu1938],1998 年关于 Behrens-Fisher 问题的综述 [@Kim1998]。陈家鼎和郑忠国一起整理了许宝騄的生平事迹和学术成就,见[《许宝騄先生的生平和学术成就》](https://www.math.pku.edu.cn/misc/probstat/doc.pdf)。钟开涞(Kai-Lai Chung)将许宝騄的论文集整理出版 [@HSU1983]。
:::
t 检验的影响是如此巨大,以至于广泛存在于具有统计功能的软件中,比如办公软件里的 t 检验。以 MacOS 上的 Numbers 表格软件为例,如 @fig-numbers-ttest 所示,首先打开 Numbers 软件,新建工作表,输入两组数值,然后点击空白处,再从顶部导航栏找到「插入」菜单,「公式」选项,点击扩展选项「新建公式」,在弹出的会话条里输入 TTEST,依次选择第一组,第二组值,检验类型和样本类型,最后点击确认,即可得到两样本 t 检验的 P 值结果。
```{r}
#| label: fig-numbers-ttest
#| fig-cap: 办公软件 Numbers 的两样本 t 检验
#| echo: false
#| out-width: 80%
knitr::include_graphics(path = "screenshots/number-ttest.png")
```
微软 Excel 办公软件也提供 t 检验计算器,和 MacOS 系统上的 Numbers 办公软件类似,它提供 `T.TEST` 函数,计算结果也一样,此处从略。R 软件自带 `t.test()` 函数,也是用于做 t 检验,如下:
```{r}
t.test(x = c(3, 4, 5, 8, 9, 1, 2, 4, 5), y = c(6, 19, 3, 2, 14, 4, 5, 17, 1))
```
### 正态总体方差检验
比较两个正态总体的方差是否相等,F 检验。
```{r}
# 两样本
var.test(extra ~ group, data = sleep)
# 或者
bartlett.test(extra ~ group, data = sleep)
```
注意:函数 `bartlett.test()` 支持多样本情况。
### 总体未知均值检验
在总体分布未知的情况下,比较均值是否相等的检验。
- `wilcox.test()` 适用于单样本和两样本的均值检验,单样本 Wilcoxon 秩和检验,两样本 Wilcoxon 符号秩和检验,后者也叫 Mann-Whitney 检验。
- `kruskal.test()` 适用于两样本和多样本,比较多个均值是否相等的检验,Kruskal-Wallis 秩和检验。
单样本和两样本 `wilcox.test()`。
```{r}
wilcox.test(extra ~ group, data = sleep)
```
**coin** 包提供渐进 Wilcoxon-Mann-Whitney 检验
```{r}
# Asymptotic Wilcoxon-Mann-Whitney Test
wilcox_test(extra ~ group, data = sleep, conf.int = TRUE)
# Exact Wilcoxon-Mann-Whitney Test
wilcox_test(
extra ~ group, data = sleep,
distribution = "exact", conf.int = TRUE
)
```
两样本和多样本 `kruskal.test()` 。
```{r}
kruskal.test(extra ~ group, data = sleep)
```
能用参数检验的一定也可以用非参数检验,一般来说,非参数检验的功效不小于参数检验,非参数检验不要求分布是正态,比如此时 P 值从 0.07939 降至 0.06372。
### 总体未知方差检验
对总体没有分布要求的方差齐性检验方法有三个,按适用范围分类,见下 @tbl-fligner-test 。
+-----------------------------------------+-------------------------------------------+
| 两个样本 | 多个样本 |
+=========================================+===========================================+
| - Ansari-Bradley 检验 `ansari.test()` | - Fligner-Killeen 检验 `fligner.test()` |
| - Mood 检验 `mood.test()` | |
+-----------------------------------------+-------------------------------------------+
: 检验方法分类 {#tbl-fligner-test}
以 A. R. Ansari 和 R. A. Bradley 命名的 Ansari-Bradley 检验 [@ansari1960],对应的 R 函数是 `ansari.test()` ,以 A. M. Mood 命名的 Mood 检验 [@mood1954],对应的 R 函数是 `mood.test()` ,这两者都属于两样本的非参数检验,检验尺度参数是否相同(齐性)。以 M. A. Fligner 和 T. J. Killeen 命名的 Fligner-Killeen 检验 [@fligner1976],对应的 R 函数是 `fligner.test()` ,也属于非参数检验,适用于两样本和多样本的情况。非参数检验常涉及位置参数和尺度参数这一对概念,就正态分布而言,位置参数可以理解为均值 $\mu$ ,尺度参数可以理解为方差 $\sigma^2$ 。
```{r}
ansari.test(extra ~ group, data = sleep)
mood.test(extra ~ group, data = sleep)
fligner.test(extra ~ group, data = sleep)
```
## 多样本检验 {#sec-multi-samples}
```{mermaid}
%%| label: fig-k-samples
%%| fig-cap: 多样本检验
%%| fig-width: 6.5
flowchart LR
A(多样本) --> B1(正态总体)
A --> B2(总体未知)
B1 --> C1(均值检验)
C1 --> D2(方差相等) --> E2(F 检验)
C1 --> D3(方差不等) --> E3(F 检验)
B1 --> C2(方差检验) --> E4(Hartley 检验\n Bartlett 检验\n 修正的 Bartlett 检验\n Levene 检验)
B2 --> C3(均值检验) --> E5(Kruskal-Wallis 秩和检验\n Friedman 秩和检验\n Quade 检验)
B2 --> C4(方差检验) --> E7(Fligner-Killeen 检验)
```
本节考虑 Base R 内置的 PlantGrowth 数据集,它收集自 Annette J. Dobson 所著书籍《An Introduction to Statistical Modelling》[@Dobson1983] 第 2 章第 2 节的案例 --- 研究植物在两种不同试验条件下的生长情况,植物通过光合作用吸收土壤的养分和空气中的二氧化碳,完成积累,故以植物的干重来刻画植物的生长情况,首先将几乎相同的种子随机地分配到实验组和对照组,基于完全随机实验设计(completely randomized experimental design),经过预定的时间后,将植物收割,干燥并称重。
```{r}
str(PlantGrowth)
```
设立对照组(控制组)ctrl 和实验组 trt1 和 trt2,比较不同的处理方式对植物干重的影响
```{r}
summary(PlantGrowth)
```
每个组都有 10 颗植物,生长情况如 @fig-plant-growth 所示
```{r}
#| label: fig-plant-growth
#| fig-width: 5
#| fig-height: 4
#| fig-cap: "植物干重"
#| fig-showtext: true
## Annette J. Dobson 扩展的 Plant Weight Data 数据,见 59 页
library(ggplot2)
ggplot(data = PlantGrowth, aes(x = group, y = weight, color = group)) +
geom_boxplot() +
geom_jitter() +
theme_minimal()
```
### 正态总体均值检验
#### 假定同方差
讲清楚原假设和备择假设。讲清楚假设检验、方差分析、一般线性模型(包含广义线性模型和线性混合效应模型)的关系。
$\sigma_i^2 = \mathsf{Var}\{\epsilon_{ij}\}, i = 1,2,3$ 表示第 $i$ 组的方差,
$$
y_{ij} = \mu + \epsilon_{ij}, i = 1,2,3
$$
其中 $\mu$ 是固定的未知参数。单因素方差分析 `oneway.test()`
```{r}
# 假设各组方差相同
oneway.test(weight ~ group, data = PlantGrowth, var.equal = TRUE)
```
线性模型也假定各个组的方差是相同的,模型显著性检验的结果和上面是一致的。
```{r}
fit_lm <- lm(weight ~ group, data = PlantGrowth)
anova(fit_lm) # 或者 summary(fit)
```
模型输出整理成 @tbl-lm-plant-growth
```{r}
#| label: tbl-lm-plant-growth
#| tbl-cap: "线性回归的输出"
#| echo: false
# 整理模型输出到数据框
fit_lm_output <- round(coef(summary(fit_lm)), 4)
# 指定行名和列名
rownames(fit_lm_output) <- c("$\\alpha$", "$\\beta_1$", "$\\beta_2$")
colnames(fit_lm_output)[4] <- "$P(T > |t|)$"
knitr::kable(fit_lm_output,
escape = FALSE,
col.names = c("估计值", "标准差", "t 统计量", "P 值")
)
```
#### 假定异方差
```{r}
# 计算各个组的方差
aggregate(data = PlantGrowth, weight ~ group, FUN = var)
# 或者
with(PlantGrowth, tapply(weight, group, var))
```
各个组的方差确实不太相同。
```{r}
# 假设各组方差不同
oneway.test(weight ~ group, data = PlantGrowth, var.equal = FALSE)
```
线性混合效应模型,假定每一组(层)有不同的方差。
```{r}
fit_gls <- nlme::gls(weight ~ 1,
data = PlantGrowth, method = "ML",
weights = nlme::varIdent(form = ~ 1 | group)
)
summary(fit_gls)
```
考虑每个组有不同的方差,放开同方差的假设,发现,从对数似然的角度来看,有一定提升。
```{r}
logLik(fit_lm)
logLik(fit_gls)
```
### 正态总体方差检验
总体服从正态分布,有四种常见的参数检验方法:
1. Hartley 检验:各组样本量必须相等。
2. Bartlett 检验:各组样本量可以相等或不等,但每个组的样本量必须不低于 5。
3. 修正的 Bartlett 检验:在样本量较大或较小、相等或不等场合都可使用。
4. Levene 检验:相当于单因素组间方差分析,相比于 Bartlett 检验,Levene 检验更加稳健。
::: callout-tip
在总体分布未知的情况下,检验方差齐性的非参数方法也都可以用在这里。
:::
设 $x_1,\cdots,x_{n_1}$ 是来自总体 $\mathcal{N}(\mu_1,\sigma_1^2)$ 的样本,设 $y_1,\cdots,y_{n_2}$ 是来自总体 $\mathcal{N}(\mu_2,\sigma_2^2)$ 的样本,设 $z_1,\cdots,z_{n_3}$ 是来自总体 $\mathcal{N}(\mu_3,\sigma_3^2)$ 的样本。
$$
\sigma_1^2 = \sigma_2^2 = \sigma_3^2 \quad vs. \quad \sigma_1^2,\sigma_2^2,\sigma_3^2 \quad \text{不全相等}
$$
Bartlett (巴特利特)检验 `bartlett.test()` 要求总体的分布为正态分布,检验各个组的方差是否有显著性差异,即方差齐性检验,属于参数检验,适用于多个样本的情况。
```{r}
# 三样本
bartlett.test(weight ~ group, data = PlantGrowth)
# 或者
car::leveneTest(weight ~ group, data = PlantGrowth)
```
### 总体未知均值检验
Kruskal-Wallis 秩和检验 `kruskal.test()` 检验均值是否齐性。
```{r}
kruskal.test(weight ~ group, data = PlantGrowth)
```
等价的线性模型表示
```{r}
fit_lm <- lm(rank(weight) ~ group, data = PlantGrowth)
anova(fit_lm) # summary(fit_lm)
```
Friedman 秩和检验是非参数检验。适用于单因素重复测量数据的方差分析,检验是否存在一组值显著高于或低于其他组。针对 unreplicated blocked data
典型场景:n 个品酒师对 k 瓶葡萄酒打分,是否存在一组打分显著高于其他组。检验睡眠质量一组人显著好于另一组人。
```{r}
friedman.test(extra ~ group | ID, data = sleep)
```
`formula` 参数取值为 `a ~ b | c` ,`a` 表示数据值,`b` 分组变量 groups,`c` 表示 blocks。
Quade 检验 `quade.test()` 与 Friedman 检验类似,Quade 检验应用于 unreplicated complete block designs。
```{r}
# 睡眠实验
quade.test(extra ~ group | ID, data = sleep)
```
术语涉及实验设计,比如完全区组设计 complete block designs 。1879 年迈克尔逊光速测量数据记录了五次实验,每次试验测量 20 次光速。数据集 morley 中光速 Speed 已经编码过了,为了展示方便,原始观测速度减去了 299000 (km/sec)。
```{r}
# 光速实验
quade.test(Speed ~ Expt | Run, data = morley)
```
<!-- 重复测量数据:试验设计的巧妙 -->
```{r}
#| label: fig-morley
#| fig-cap: 1879 年迈克尔逊光速实验数据
#| fig-showtext: true
#| fig-width: 5
#| fig-height: 4
ggplot(data = morley, aes(x = Expt, y = Speed, group = Expt)) +
geom_boxplot() +
geom_jitter() +
theme_minimal() +
labs(x = "Expt", y = "Speed (km/sec)")
```
### 总体未知方差检验
三个及以上样本的方差齐性检验。进一步地,我们在线性模型的基础上考虑每个实验组有不同的方差,先做方差齐性检验。
```{r}
# 非参数检验
fligner.test(weight ~ group, data = PlantGrowth)
```
检验的结果显示,可以认为三个组的方差没有显著差异。
## 配对样本检验 {#sec-pairwise-data}
配对样本检验算是两样本检验的一种特殊情况。若待检验的样本不止两个,则两两配对检验。
+------------+---------------------------------------------------+
| 样本 | R 函数 |
+============+===================================================+
| 两样本 | - `t.test(paired = TRUE)` 正态总体均值检验 |
| | - `wilcox.test(paired = TRUE)` 总体未知均值检验 |
+------------+---------------------------------------------------+
: 配对样本检验 {#tbl-paired-test}
### 配对 t 检验 {#sec-paired-t-test}
做两个组的配对 t 检验,函数 `t.test()` 的参数 `paired` 设置为 `TRUE` ,两个组的样本当作配对样本处理。
```{r}
sleep2 <- reshape(sleep, direction = "wide",
idvar = "ID", timevar = "group")
t.test(Pair(extra.1, extra.2) ~ 1, data = sleep2)
# R < 4.4.0
# t.test(extra ~ group, data = sleep, paired = TRUE)
```
做多个组的两两配对 t 检验,函数 `pairwise.t.test()` 的参数 `paired` 设置为 `TRUE` ,当仅做两个组的配对 t 检验时,检验结果与前面的等价。
```{r}
with(sleep, pairwise.t.test(x = extra, g = group, paired = TRUE))
```
输出结果中,组 1 和组 2 配对 t 检验的 P 值为 0.0028。
::: callout-tip
两个组的配对 t 检验还与变截距的线性混合效应模型等价。
```{r}
library(nlme)
m <- lme(fixed = extra ~ group, random = ~ 1 | ID, data = sleep)
summary(m)
```
输出结果中,固定效应部分 `group2` 意味着相对于第 1 组,第 2 组的增加值,其为 1.58,对应的 t 统计量的值为 4.062127, P 值为 0.0028。调用 **nlme** 包的函数 `intervals()` 计算固定效应部分 95% 的置信区间。
```{r}
intervals(m, which = "fixed")
```
`group2` 对应的 95% 的置信区间是 $(0.7001140, 2.459886)$ 。
:::
### 配对 Wilcoxon 检验 {#sec-paired-wilcox-test}
Wilcoxon 检验函数 `wilcox.test()` 设置 `paired = TRUE` 可以做配对检验,但是仅限于两个组。
```{r}
# 不支持三组及以上
# wilcox.test(weight ~ group, data = PlantGrowth, paired = TRUE)
wilcox.test(Pair(extra.1, extra.2) ~ 1, data = sleep2)
# R < 4.4.0
# wilcox.test(extra ~ group, data = sleep, paired = TRUE)
```
## 多重假设检验 {#sec-multiple-comparisons}
同时检验多个统计假设。
+------------+-----------------------------------------------+
| 样本 | R 函数 |
+============+===============================================+
| 多样本 | - `pairwise.t.test()` 正态总体均值检验 |
| | - `pairwise.prop.test()` 二项总体比例检验 |
| | - `pairwise.wilcox.test()` 总体未知均值检验 |
+------------+-----------------------------------------------+
: 多重假设检验 {#tbl-pairwise-test}
### 多重 t 检验
数据集 sleep 仅有两个组,数据集 PlantGrowth 包含三个组,下面以数据集 PlantGrowth 为例,介绍做多个组同时进行两两比较的 t 检验。
```{r}
# 样本成对的情况
with(PlantGrowth, pairwise.t.test(x = weight, g = group, paired = TRUE))
```
函数 `pairwise.t.test()` 以 P 值给出两两配对比较的结果,trt1 和 ctrl 配对比较,P 值为 0.346,trt2 和 ctrl 配对比较,P 值为 0.220,以此类推。
```{r}
# 样本非成对的情况
with(PlantGrowth, pairwise.t.test(x = weight, g = group))
```
### 多重比例检验 {#sec-pairwise-prop-test}
对于离散数据,做两两比例检验,采用函数 `pairwise.prop.test()` ,如下示例含有 4 个组。
```{r}
smokers <- c(83, 90, 129, 70)
patients <- c(86, 93, 136, 82)
pairwise.prop.test(smokers, patients)
```
### Wilcoxon 检验 {#sec-pairwise-wilcoxon-test}
Wilcoxon 检验的是两个总体的均值是否相等。
函数 `pairwise.wilcox.test()` 做两个及以上组的两两比较检验。
```{r}
with(PlantGrowth, pairwise.wilcox.test(x = weight, g = group))
```
### Dunn 检验
**dunn.test** 包提供函数 `dunn.test()` 实现 Dunn 检验,将 Kruskal-Wallis 秩和检验用于两两比较。
```{r}
library(dunn.test)
with(PlantGrowth, dunn.test(x = weight, g = group, method = "holm", altp = TRUE))
```
## 总体分布的检验 {#sec-distribution-test}
前面介绍的检验方法都是对总体的某个特征数(均值、方差)进行检验,下面介绍的检验方法是针对分布的性质。比如样本是否来自正态分布,两个样本是否来自同一分布,样本点之间是否相互独立,样本点列是否平稳等。通过检验方法探索样本的分布性质。
### 正态性检验 {#sec-normality-test}
什么样的数据是正态的,理论上是清楚的,对统计建模来说,更实际的问题是什么样的数据是够正态的!探索性数据分析是不断提出假设和验证假设的过程。
> Usually (but not always) doing tests of normality reflect a lack of understanding of the power of rank tests, and an assumption of high power for the tests (qq plots don't always help with that because of their subjectivity). When possible it's good to choose a robust method. Also, doing pre-testing for normality can affect the type I error of the overall analysis.
>
> --- Frank Harrell [^common-statistical-tests-1]
[^common-statistical-tests-1]: <https://stat.ethz.ch/pipermail/r-help/2005-April/070508.html>
检验:拒绝原假设和接受原假设的风险,数据本身和理论的正态分布的距离,抛开 P 值
Shapiro 和 Wilk 提出的 W 检验 [@shapiro1965] ,对应的 R 函数为 `shapiro.test()`
```{r}
set.seed(20232023)
x <- rnorm(100, mean = 5, sd = 3)
shapiro.test(x)
```
> The issue really comes down to the fact that the questions: "exactly normal?", and "normal enough?" are 2 very different questions (with the difference becoming greater with increased sample size) and while the first is the easier to answer, the second is generally the more useful one.
>
> --- Greg Snow [^common-statistical-tests-2]
[^common-statistical-tests-2]: <https://stat.ethz.ch/pipermail/r-help/2009-May/390164.html>
EP 检验对多种备择假设有较高的效率,利用样本的特征函数和正态分布的特征函数的差的模的平方产生的一个加权积分得到 EP 检验统计量 [@Epps1983]
::: callout-tip
样本量 $n \geq 200$ EP 检验统计量 $T_{EP}$ 非常接近 $n = \infty$ 时 $T_{EP}$ 的分位数。
:::
设 $x_1, \ldots, x_n$ 是来自正态总体 $\mathcal{N}(\mu,\sigma^2)$ 的样本, EP 检验统计量定义为
$$
T_{EP} = 1 + \frac{n}{\sqrt{3}} + \frac{2}{n}\sum_{i=2}^{n}\sum_{j=1}^{i-1}\exp\big\{ - \frac{(x_j - x_i)^2}{2s^2_{\star}} \big\} - \sqrt{2} \sum_{i=1}^{n}\exp\big\{- \frac{(x_i - \bar{x})^2}{4s^2_{\star}} \big\}
$$
其中 $\bar{x},s^2_{\star}$ 分别是样本均值和(除以 $n$ 的)样本方差。
### 同分布检验 {#sec-ks-test}
Lilliefors 检验 [^common-statistical-tests-3] 和单样本的 ks 检验的关系
[^common-statistical-tests-3]: <https://personal.utdallas.edu/~herve/Abdi-Lillie2007-pretty.pdf>
> As to whether you can do a **Lilliefors test** for several groups, that depends entirely on your ability to understand what the underlying question would be (see Adams D 1979).
>
> --- Knut M. Wittkowski [^common-statistical-tests-4]
[^common-statistical-tests-4]: <https://stat.ethz.ch/pipermail/r-help/2004-February/045597.html>
Kolmogorov-Smirnov 检验:单样本或两样本的同分布检验 `ks.test()`
```{r}
# 数据 x 与正态分布比较
ks.test(x, y = "pnorm")
```
### 相关性检验 {#sec-cor-test}
样本的相关性检验 `cor.test()`:Pearson's 相关系数检验,Kendall's $\tau$ 检验或者 Spearman's $\rho$ 检验。基于美国高等法院律师对州法官的评级数据集 USJudgeRatings 介绍各项评分之间的相关性。
```{r}
# cor.test(method = "pearson") # lm(y ~ 1 + x)
cor.test(~ CONT + INTG, data = USJudgeRatings)
```
其中,变量 CONT 表示律师与法官的联系次数,INTG 表示司法公正。