《Cookbook for R》 Statistical Analysis 数据统计篇之 T-test 检验
当你想测试两个样本是否来自均值不同的群体
或者测试一个样本是否来自均值不同于某个理论均值的群体。
示例数据:R内置数据集 sleep
{r}
sleep
#> extra group ID
#> 1 0.7 1 1
#> 2 -1.6 1 2
#> 3 -0.2 1 3
#> 4 -1.2 1 4
#> 5 -0.1 1 5
#> 6 3.4 1 6
#> 7 3.7 1 7
#> 8 0.8 1 8
#> 9 0.0 1 9
#> 10 2.0 1 10
#> 11 1.9 2 1
#> 12 0.8 2 2
#> 13 1.1 2 3
#> 14 0.1 2 4
#> 15 -0.1 2 5
#> 16 4.4 2 6
#> 17 5.5 2 7
#> 18 1.6 2 8
#> 19 4.6 2 9
#> 20 3.4 2 10
制作一个宽版格式的 sleep
数据集
{r}
sleep_wide <- data.frame(
ID=1:10,
group1=sleep$extra[1:10],
group2=sleep$extra[11:20]
)
sleep_wide
#> ID group1 group2
#> 1 1 0.7 1.9
#> 2 2 -1.6 0.8
#> 3 3 -0.2 1.1
#> 4 4 -1.2 0.1
#> 5 5 -0.1 -0.1
#> 6 6 3.4 4.4
#> 7 7 3.7 5.5
#> 8 8 0.8 1.6
#> 9 9 0.0 4.6
#> 10 10 2.0 3.4
1、比较两组:两个独立样本的 t-test
假设两组样本是独立采样的(出于此目的忽略ID变量)
t.test()
函数可以对长格式数据(例如 sleep
数据集)进行操作
其中 extra
列记录测量值,group
列记录分组
{r}
# Welch t-test
t.test(extra ~ group, sleep)
#>
#> Welch Two Sample t-test
#>
#> data: extra by group
#> t = -1.8608, df = 17.776, p-value = 0.07939
#> alternative hypothesis: true difference in means is not equal to 0
#> 95 percent confidence interval:
#> -3.3654832 0.2054832
#> sample estimates:
#> mean in group 1 mean in group 2
#> 0.75 2.33
# Same for wide data (two separate vectors)
# t.test(sleep_wide$group1, sleep_wide$group2)
默认情况下,t.test()
并不假定方差相等;它默认使用 Welch t-test
,而不是 student's t-test
本案例用 Welch t-test
检验,df=17.776,因为要对不等方差进行调整
如果要使用 student's t-test
检验,需要设置 var.equal=TRUE
{r}
# Student t-test
t.test(extra ~ group, sleep, var.equal=TRUE)
#>
#> Two Sample t-test
#>
#> data: extra by group
#> t = -1.8608, df = 18, p-value = 0.07919
#> alternative hypothesis: true difference in means is not equal to 0
#> 95 percent confidence interval:
#> -3.363874 0.203874
#> sample estimates:
#> mean in group 1 mean in group 2
#> 0.75 2.33
# Same for wide data (two separate vectors)
# t.test(sleep_wide$group1, sleep_wide$group2, var.equal=TRUE)
2、比较两个组:配对样本t检验
例如:在治疗前后进行观察,或者对两个匹配的受试者进行不同治疗
同样,t.test()
可用于带有分组变量的数据框或两个向量。
它依靠相对位置来确定配对。
如果使用的是带有分组变量的长格式数据,则 group=1
的第一行与 group=2
的第一行配对。
重要的是,要确保数据分类整理,不遗漏观测数据;
否则,配对会出现偏差。
在这个示例数据中,我们可以根据 group
和 ID
进行排序,以确保顺序相同
{r}
# 先按 group 排,再按 ID排
sleep <- sleep[order(sleep$group, sleep$ID), ]
# 配对 t-test
t.test(extra ~ group, sleep, paired=TRUE)
#>
#> Paired t-test
#>
#> data: extra by group
#> t = -4.0621, df = 9, p-value = 0.002833
#> alternative hypothesis: true difference in means is not equal to 0
#> 95 percent confidence interval:
#> -2.4598858 -0.7001142
#> sample estimates:
#> mean of the differences
#> -1.58
# 宽格式数据框也是如此(两个单独的向量)
# t.test(sleep.wide$group1, sleep.wide$group2, paired=TRUE)
配对 t.test()
等同于测试每对观测值之间的差值是否为 0
{r}
t.test(sleep_wide$group1 - sleep_wide$group2, mu=0, var.equal=TRUE)
#> One Sample t-test
#> data: sleep_wide$group1 - sleep_wide$group2
#> t = -4.0621, df = 9, p-value = 0.002833
#> alternative hypothesis: true mean is not equal to 0
#> 95 percent confidence interval:
#> -2.4598858 -0.7001142
#> sample estimates:
#> mean of x
#> -1.58
3、将一组数据与预期总体平均值进行比较:单样本t检验
假设你要检测 extra
列中的数据是否来自一个真实均值为0的群体
该情况下忽略 group
和 ID
{r}
t.test(sleep$extra, mu=0)
#>
#> One Sample t-test
#>
#> data: sleep$extra
#> t = 3.413, df = 19, p-value = 0.002918
#> alternative hypothesis: true mean is not equal to 0
#> 95 percent confidence interval:
#> 0.5955845 2.4844155
#> sample estimates:
#> mean of x
#> 1.54