t检验通常分为三种,分别是单样本t检验、两独立样本t检验和配对样本t检验。
python中经常使用scipy模块中的t检验相关函数进行t检验。
单样本t检验使用ttest_1samp()函数。
独立样本t检验使用ttest_ind()函数。
配对样本t检验使用ttest_rel()函数。
单样本t检验用于,在已知总体均数的情况下,样本均数与已知总体均数0的比较,其中样本均数代表未知总体均数。
样本含量较小时,要求样本符合正态分布。
某医生测量了36名从事铅作业男性工人的血红蛋白含量,算得其均数为130.83g/L,标准差为25.74g/L。问从事铅作业的男性工人的血红蛋白含量均数是否等于正常成年男性的均数140g/L?
36名从事铅作业男性工人的血红蛋白含量: [112,137,129,126,88,90,105,178,130,128,126,103,172,116,125,90,96,162,157,151,135,113,175,129,165,171,128,128,160,110,140,163,100,129,116,127]
建立假设检验,确定检验水准。
0:=0,即从事铅作业的男性工人与正常男性的血红蛋白含量均数相等。
1:≠0,即从事铅作业的男性工人与正常男性的血红蛋白含量均数不等。
=0.05
计算检验统计量。
确定P。
import numpy as np
from scipy import stats
hb1=np.array([112,137,129,126,88,90,105,178,130,128,126,103,172,116,125,90,96,162,157,151,135,113,175,129,165,171,128,128,160,110,140,163,100,129,116,127]
)
## 正态性检验
stats.shapiro(hb1)
p>0.05,样本符合正态分布,可以进行单样本t检验
# 单样本t检验
stats.ttest_1samp(hb1,140)
p<0.05,按=0.05α=0.05水准拒绝原假设0,接受备择假设1,差异有统计学意义,可以认为从事铅作业男性工人的平均血红蛋白含量低于正常成年男性的平均血红蛋白含量。
独立样本t检验,用于两个完全独立的、符合正态分布的样本的均数比较。
根据两样本的方差是否相等,可分为:
总体方差相等的t检验
总体方差不等的t检验
在python中,使用scipy包的ttest_ind()函数来进行两独立样本的t检验,两样本不符合方差齐性时需要传入参数:eual_var=False,这个参数默认为True。
stats.shapiro()用于正态性检验。
stats.levene()用于方差齐性检验。
为探讨青藤碱抗兔动脉粥样硬化作用,采用单纯高脂饲料12周喂养方法建立动脉粥样硬化家兔模型。将12周造模成功家兔随机等分为2组。模型组给予高脂饲料100g/d;青藤碱组除给与高脂饲料100g/d外,在饲料中添加青藤碱109mg/(kg·d)。连续喂养3周,试验结束后心脏采血,测定心脏血液中高密度脂蛋白。结果如下:
青藤碱组1:[0.66,0.76,0.79,0.88,0.78,0.66,0.75,0.88]
模型组2:[0.58,0.62,0.59,0.70,0.69,0.68,0.58,0.60]
根据以上结果能否认为模型组与青藤碱组心脏血液中高密度脂蛋白含量的总体均数不同?
X1=np.array([0.66,0.76,0.79,0.88,0.78,0.66,0.75,0.88])
X2=np.array([0.58,0.62,0.59,0.70,0.69,0.68,0.58,0.60])
# 正态性检验
print("X1组正态性检验结果:{}".format(stats.shapiro(X1)))
print("X2组正态性检验结果:{}".format(stats.shapiro(X2)))
# 方差齐性检验
print("X1与X2方差齐性检验结果:{}".format(stats.levene(X1,X2)))
X1、X2组正态性检验的p值均大于0.05,符合正态分布。方差齐性检验的p值大于0.05,两样本符合方差齐性。
# 总体方差相等的两独立样本t检验
stats.ttest_ind(X1,X2)
t检验p值小于0.05,按水准,拒绝0,接受1,差异具有统计学意义,可认为青藤碱组与模型组心脏血液中的HDL含量总体均数不同。
为分析血糖控制对血清总胆固醇含量的影响,调查了某社区2型糖尿病患者,各测量了25名血糖控制较差(甲组)和25名血糖控制较好(乙组)的患者血清总胆固醇含量,结果如下:
甲组:[5.61,4.18,3.21,2.41,2.12,6.81,3.47,4.46,1.98,3.03,3.96,4.91,4.42,6.92,4.89,2.99,3.51,5.91,4.90,4.59,5.04,4.16,4.91,4.85,4.70]
乙组:[4.76,6.54,5.65,5.30,4.96,6.30,6.17,4.40,5.75,4.42,4.54,5.10,5.37,4.21,5.44,5.81,4.65,6.05,4.82,5.53,5.0,4.66,4.37,4.42,4.38]
根据以上结果能否认为两组血清总胆固醇含量的总体均数不同?
grp1=np.array([5.61,4.18,3.21,2.41,2.12,6.81,3.47,4.46,1.98,3.03,3.96,4.91,4.42,6.92,4.89,2.99,3.51,5.91,4.90,4.59,5.04,4.16,4.91,4.85,4.70])
grp2=np.array([4.76,6.54,5.65,5.30,4.96,6.30,6.17,4.40,5.75,4.42,4.54,5.10,5.37,4.21,5.44,5.81,4.65,6.05,4.82,5.53,5.0,4.66,4.37,4.42,4.38])
# 正态性检验
print("甲组正态性检验结果:{}".format(stats.shapiro(grp1)))
print("乙组正态性检验结果:{}".format(stats.shapiro(grp2)))
# 方差齐性检验
print("两组方差齐性检验结果为:{}".format(stats.levene(grp1,grp2)))
# 总体方差不等的两独立样本t检验
stats.ttest_ind(grp1,grp2,equal_var=False)
p<0.05,按=0.05水准,拒绝0,接受1,差异具有统计学意义,可以认为血糖控制较差者和良好者血清总胆固醇含量的总体均数不同。
配对样本t检验适用于配对设计或自身对照设计的计量资料的比较。
配对设计是将受试对象按照某些重要特征配成对子,再将每对中的两个受试对象随机分配到两处理组。
stats.ttest_lsmap():在python中可以将配对数据求差值后,对差值进行已知总体均数为0的单样本t检验,来求得t检验统计量和p值。
stats.ttest_rel():或是对配对数据直接调用stats.ttest_rel()函数进行t检验。
为比较两种方法对乳酸饮料中脂肪含量测定结果是否不同,随机抽取10份乳酸饮料制品,分别用脂肪酸水解法和哥特里-罗紫法测定,结果如下:
哥特里-罗紫法:[0.840,0.591,0.674,0.632,0.687,0.978,0.750,0.730,1.200,0.870]
脂肪酸水解法:[0.580,0.509,0.500,0.316,0.337,0.517,0.454,0.512,0.997,0.506]
问两种方法的测定结果是否不同?
fun1=np.array([0.840,0.591,0.674,0.632,0.687,0.978,0.750,0.730,1.200,0.870])
fun2=np.array([0.580,0.509,0.500,0.316,0.337,0.517,0.454,0.512,0.997,0.506])
sub=fun1-fun2
# 正态性检验
stats.shapiro(sub)
# 配对样本t检验
stats.ttest_rel(fun1,fun2)
stats.ttest_1samp(sub,0)
p<0.05,按=0.5水准,拒绝0,接受1,差异具有统计学意义,可以认为两种方法对脂肪含量的测定结果不同。