One Sample t-test
单样本t检验用于检测一个总体的均值\(\mu\)是否等于某个特定值。通常该总体均值\(\mu\),未知不易测量,我们通过抽样得到样本均数\(\bar{X}\)来代表总体均数\(\mu\)。通常抽样存在一定误差,不太可能等于总体均数\(\mu\),所以我们需要关注样本均数\(\bar{X}\)与特定值之间的差异是否存在统计学意义。
案例
- 若我们想知道某地乌龟的平均重量是否等于310磅。这里该地乌龟平均重量是总体均值,而310磅是特定值。一个一个找出该地乌龟来测量,显然不是很容易的事,所以我们可以进行随机抽样选择部分乌龟来代表总体乌龟。然后通过统计检验来检验是否该地乌龟平均重量是否等于310磅。
- 若我们想尽快了解到长期从事铅作业的男性工人血红蛋白含量均数是否不等于正常男性血红蛋白含量均数\(140g/L\)(一般该均数为理论值,标准值或经过大量观察所得的稳定值),可以随机抽样选择部分从事铅作业工人的血红蛋白含量样本均数。然后通过统计检验来检验是否从事铅作业的男性工人血红蛋白含量均数是否不等于正常男性血红蛋白含量均数\(140g/L\)。
前提假设
为使单样本t检验结果有效,需要满足一些条件。
- 样本之间相互独立
- 当总体标准差\(\sigma\)未知,样本含量\(n\)较小,比如小于60,50等。理论要求t-test样本随机取自正态分布的总体。
- 取样样本分布近似正态分布,可以通过创建直方图来检查其分布形状是否大致像一个钟形
- 样本无异常值,可创建一个箱型图来检查
假设检验步骤
- 确定零假设:
- \(H_{0}: \mu=\mu_{0}\), 假设总体均值\(\mu\)等于\(\mu_{0}\)
- 确定备择假设,这里有3种假设方法,根据实际问题进行假设:
- \(H_{1}: \mu\ne\mu_{0}\), 双侧检验,总体均值\(\mu\)不等于特定值\(\mu_{0}\)
- \(H_{1}: \mu<\mu_{0}\), 双侧检验,总体均值\(\mu\)小于特定值\(\mu_{0}\)
- \(H_{1}: \mu>\mu_{0}\), 双侧检验,总体均值\(\mu\)大于特定值\(\mu_{0}\)
- 计算检验统计量\(t\):
\(t=\frac{(\bar{X}-\mu_{0})}{(S\sqrt{n})}\)
其中:
- \(\bar{x}\): 样本均数
- \(\mu_{0}\): 特定值
- \(S\): 样本均值
- \(n\): 样本大小
- 计算p-value:
选择一个显著性水准\(\alpha\),(一般为0.01,0.05,0.1),然后根据\(\alpha\)和自由度\(df\)\((n-1)\),去找到相应的P-value。可以去查t界值表或者通过程序计算出来。
实例计算
以之前乌龟的那个案例为例,若随机取样选择40个乌龟,其平均重量为\(\bar{X}=300\),标准差\(S=18.5\),则建立检验假设,确认检验水准\(\alpha\):
- \(H_{0}: \mu=\mu_{0}=310\)
- \(H_{1}: \mu\ne\mu_{0}=310\),即乌龟总体平均重量不等于310磅
- \(\alpha=0.05\)
计算t检验统计量:
\[t=\frac{(\bar{X}-\mu_{0})}{(S/\sqrt{n})}=\frac{300-310}{18.5/\sqrt{40}}=-3.4187 \]
\[df = n-1=40-1=39 \]
以\(\nu=39、|t|=|-3.4817|=3.4817\) 查t界值表可知(若是通过程序T Score to P Value Calculator计算,可得出P=0.00149),\(3.4817 > t_{0.02/2, 39} > t_{0.05/2, 39}\), 可知\(P<0.02<0.05\), 故可以拒绝零假设\(H_{0}\),接受\(H_{1}\), 可认为该地乌龟的平均重量不等于310磅。
Python 代码实现
一般常见的算法,都是有Python库封装好的了,我们直接调用它给的接口就行了。
这里借助一个Python科学计算库 scipy, 一般可以通过命令pip install scipy
安装。
import scipy.stats as stats
## 数据就使用下面这个data,当作样本,作为演示
## 分别为某种植物12株植物的高度,单位英寸。
data = [14, 14, 16, 13, 12, 17, 15, 14, 15, 13, 15, 14]
## 假设该种植物总体平均高度为15
popmean = 15
## 通过stats.ttest_1samp 进行单样本t检验和P-value 计算
res = stats.ttest_1samp(a=data, popmean=15)
print("t statistic: ", res.statistic)
print("P Value: ", res.pvalue)
## output
## t statistic: -1.6848470783484626
## P Value: 0.12014460742498101
结果说明:
\(H_{0}: \mu=15\) 假设该植物平均高度为15英寸
\(H_{1}: \mu\ne15\) 该植物平均高度不为15英寸
因为此次检验p-value(0.1201) 大于 \(\alpha=0.05\), 不能拒绝\(H_{0}\),所以没有的证据说明该植物的平均高度不同于15英寸。
R代码
t-test在R里使用t.test
进行计算
> data <- c(14, 14, 16, 13, 12, 17, 15, 14, 15, 13, 15, 14)
> t.test(data, alternative = "two.sided", mu=15)
One Sample t-test
data: data
t = -1.6848, df = 11, p-value = 0.1201
alternative hypothesis: true mean is not equal to 15
95 percent confidence interval:
13.46244 15.20423
sample estimates:
mean of x
14.33333
t.test
中的参数alternative
设置备择假设的单双尾检验,默认为"two.sided" ,双尾检验,单位设置成"greater"或"less", 参数mu
,假设的总体均值。结果和Python的一样,甚至更详细。
参考
One Sample t-test: Definition, Formula, and Example