7.2 t 检验

7.2.1 问题

你想要检验来自两个总体的样本是否有不同的均值(显著性差异),或者检验从一个总体抽取的样本均值和理论均值有显著性差异。

7.2.2 方案

7.2.2.1 样本数据

我们将使用内置的 sleep 数据集。

  1. sleep
  2. #> extra group ID
  3. #> 1 0.7 1 1
  4. #> 2 -1.6 1 2
  5. #> 3 -0.2 1 3
  6. #> 4 -1.2 1 4
  7. #> 5 -0.1 1 5
  8. #> 6 3.4 1 6
  9. #> 7 3.7 1 7
  10. #> 8 0.8 1 8
  11. #> 9 0.0 1 9
  12. #> 10 2.0 1 10
  13. #> 11 1.9 2 1
  14. #> 12 0.8 2 2
  15. #> 13 1.1 2 3
  16. #> 14 0.1 2 4
  17. #> 15 -0.1 2 5
  18. #> 16 4.4 2 6
  19. #> 17 5.5 2 7
  20. #> 18 1.6 2 8
  21. #> 19 4.6 2 9
  22. #> 20 3.4 2 10

我们将制造 sleep 数据的宽格式版本;下面我们将看看如何处理长格式和宽格式的数据。

  1. sleep_wide <- data.frame(ID = 1:10, group1 = sleep$extra[1:10],
  2. group2 = sleep$extra[11:20])
  3. sleep_wide
  4. #> ID group1 group2
  5. #> 1 1 0.7 1.9
  6. #> 2 2 -1.6 0.8
  7. #> 3 3 -0.2 1.1
  8. #> 4 4 -1.2 0.1
  9. #> 5 5 -0.1 -0.1
  10. #> 6 6 3.4 4.4
  11. #> 7 7 3.7 5.5
  12. #> 8 8 0.8 1.6
  13. #> 9 9 0.0 4.6
  14. #> 10 10 2.0 3.4

7.2.2.2 比较两组:独立双样本 t 检验

假设有两组独立样本(我们这里忽略ID变量)。

t.test() 函数能够操作像 sleep 这样的长格式数据——一列记录测量值,一列指定组别;或者操作两个单独的向量。

  1. # Welch t 检验
  2. t.test(extra ~ group, sleep)
  3. #>
  4. #> Welch Two Sample t-test
  5. #>
  6. #> data: extra by group
  7. #> t = -1.9, df = 18, p-value = 0.08
  8. #> alternative hypothesis: true difference in means is not equal to 0
  9. #> 95 percent confidence interval:
  10. #> -3.3655 0.2055
  11. #> sample estimates:
  12. #> mean in group 1 mean in group 2
  13. #> 0.75 2.33
  14. # 2 个独立的向量
  15. t.test(sleep_wide$group1, sleep_wide$group2)
  16. #>
  17. #> Welch Two Sample t-test
  18. #>
  19. #> data: sleep_wide$group1 and sleep_wide$group2
  20. #> t = -1.9, df = 18, p-value = 0.08
  21. #> alternative hypothesis: true difference in means is not equal to 0
  22. #> 95 percent confidence interval:
  23. #> -3.3655 0.2055
  24. #> sample estimates:
  25. #> mean of x mean of y
  26. #> 0.75 2.33

默认,t 检验不假设有方差齐性(或称作方差同质)。默认的不是 Student t 检验而是使用了 Welch t 检验。注意 Welch t 检验结果中 df=17.776,这是因为对不同质方差进行了校正。要使用 Student t 检验的话,设置 var.equal=TRUE

  1. # Student t 检验
  2. t.test(extra ~ group, sleep, var.equal = TRUE)
  3. #>
  4. #> Two Sample t-test
  5. #>
  6. #> data: extra by group
  7. #> t = -1.9, df = 18, p-value = 0.08
  8. #> alternative hypothesis: true difference in means is not equal to 0
  9. #> 95 percent confidence interval:
  10. #> -3.3639 0.2039
  11. #> sample estimates:
  12. #> mean in group 1 mean in group 2
  13. #> 0.75 2.33
  14. # 针对宽数据相同的操作 (2个分离的向量)
  15. t.test(sleep_wide$group1, sleep_wide$group2, var.equal = TRUE)
  16. #>
  17. #> Two Sample t-test
  18. #>
  19. #> data: sleep_wide$group1 and sleep_wide$group2
  20. #> t = -1.9, df = 18, p-value = 0.08
  21. #> alternative hypothesis: true difference in means is not equal to 0
  22. #> 95 percent confidence interval:
  23. #> -3.3639 0.2039
  24. #> sample estimates:
  25. #> mean of x mean of y
  26. #> 0.75 2.33

7.2.2.3 配对样本t检验

你也可以使用配对样本 t 检验比较配对的数据。数据配对是指你可能有对某种药物治疗前后有观测值或者不同治疗有配对的研究对象。

再次说明,t-test() 函数可以用于有分组变量的数据框或者两个向量。它依赖相对位置来决定配对。如果你使用有分组变量的长格式数据,group 1 的第一行与 group 2 的第一行配对。确保数据排序好并且不存在缺失值是非常重要的;否则配对可以丢弃。这种情况中,我们能通过 groupID 变量进行排序来确保顺序是一样的。

  1. # 按 group 和 ID排序
  2. sleep <- sleep[order(sleep$group, sleep$ID), ]
  3. # 配对 t-test
  4. t.test(extra ~ group, sleep, paired = TRUE)
  5. #>
  6. #> Paired t-test
  7. #>
  8. #> data: extra by group
  9. #> t = -4.1, df = 9, p-value = 0.003
  10. #> alternative hypothesis: true difference in means is not equal to 0
  11. #> 95 percent confidence interval:
  12. #> -2.4599 -0.7001
  13. #> sample estimates:
  14. #> mean of the differences
  15. #> -1.58
  16. # 针对宽数据相同的操作 (2个分离的向量)
  17. t.test(sleep_wide$group1, sleep_wide$group2, paired = TRUE)
  18. #>
  19. #> Paired t-test
  20. #>
  21. #> data: sleep_wide$group1 and sleep_wide$group2
  22. #> t = -4.1, df = 9, p-value = 0.003
  23. #> alternative hypothesis: true difference in means is not equal to 0
  24. #> 95 percent confidence interval:
  25. #> -2.4599 -0.7001
  26. #> sample estimates:
  27. #> mean of the differences
  28. #> -1.58

配对 t 检验等价于检测是否配对的观察值的总体均值是否为 0 。

  1. t.test(sleep_wide$group1 - sleep_wide$group2, mu = 0, var.equal = TRUE)
  2. #>
  3. #> One Sample t-test
  4. #>
  5. #> data: sleep_wide$group1 - sleep_wide$group2
  6. #> t = -4.1, df = 9, p-value = 0.003
  7. #> alternative hypothesis: true mean is not equal to 0
  8. #> 95 percent confidence interval:
  9. #> -2.4599 -0.7001
  10. #> sample estimates:
  11. #> mean of x
  12. #> -1.58

7.2.2.4 与期望的总体均值进行比较:单样本 t 检验

假设你想要检测是否 extra 列的数据抽取自总体均值为0的总体(这里忽略 groupID 列)。

  1. t.test(sleep$extra, mu = 0)
  2. #>
  3. #> One Sample t-test
  4. #>
  5. #> data: sleep$extra
  6. #> t = 3.4, df = 19, p-value = 0.003
  7. #> alternative hypothesis: true mean is not equal to 0
  8. #> 95 percent confidence interval:
  9. #> 0.5956 2.4844
  10. #> sample estimates:
  11. #> mean of x
  12. #> 1.54