基于np.var和np.sqrt的单侧T检验(Python实现)
练习背景
本次练习需对比两组数值列表,计算方差与均值后通过t检验分析差异。
假设研究人员验证新型药物对血压的影响,测量20名参与者服药前后血压,原假设为药物无影响,备择假设为药物可降血压,需进行单侧t检验,显著性水平设为0.05。
- 服药前血压:118, 126, 132, 142, 136, 125, 130, 140, 128, 134, 138, 127, 131, 129, 139, 124, 133, 137, 141, 135
- 服药后血压:116, 102, 125, 144, 107, 123, 118, 131, 145, 111, 134, 137, 128, 121, 142, 119, 135, 129, 139, 126
技术疑问解答
用差值数组计算方差是正确的
这是配对t检验的标准操作:配对t检验本质是将前后测量的差值作为单样本,检验其均值是否显著小于0(对应药物降血压的单侧假设)。你混淆了“差值数组的方差”和“均值差的方差”——均值差就是差值数组的均值,而我们需要先计算差值数组的样本方差,再推导均值的标准误,因此用差值数组计算方差完全符合配对t检验的逻辑。np.var(med_diff, ddof=1)确实以n-1为除数
NumPy的np.var函数中,ddof参数用于调整自由度:当ddof=1时,计算的是样本方差,除数为n-1;默认ddof=0时计算的是总体方差,除数为n。官方文档明确说明除数为N - ddof(N为样本量),你的推测完全正确。教授的标准误写法正确,需除以n再开平方
标准误是样本均值的标准差,对于配对t检验,我们关注的是差值均值的标准误,公式为:标准误 = 差值的样本标准差 / √n
而差值的样本标准差是√var_med,因此标准误等价于√(var_med / n)。你直接开平方得到的是差值的样本标准差,并非标准误,所以教授的写法是正确的。
免责声明
我知晓有其他模块可实现t检验或计算标准差,但教授要求按此方式实现。
实现代码
#原假设(H0):药物对血压无影响 #备择假设(H1):药物能降低血压 import numpy as np from scipy.stats import t #服药前血压数据 before_med = np.array([118, 126, 132, 142, 136, 125, 130, 140, 128, 134, 138, 127, 131, 129, 139, 124, 133, 137, 141, 135]) #服药后血压数据 after_med = np.array([116, 102, 125, 144, 107, 123, 118, 131, 145, 111, 134, 137, 128, 121, 142, 119, 135, 129, 139, 126]) print(len(before_med), len(after_med)) n = len(before_med) mean_before_med = np.mean(before_med) print('服药前均值:', mean_before_med) mean_after_med = np.mean(after_med) print('服药后均值:', mean_after_med) #通过t检验进行比较 #两组数据的差值数组 med_diff = after_med-before_med #计算差值的样本方差(除以n-1) var_med = np.var(med_diff, ddof=1) print("差值的样本方差:", var_med) #计算差值均值的标准误 s = np.sqrt(var_med/n) print("标准误:", s) df = n-1 tval = (mean_after_med-mean_before_med)/s print("t值:", tval) #单侧检验的p值(备择假设为差值均值<0) pval = t.cdf(tval, df=df) print("t值=", tval, "p值=", pval) #结果:由于p值<0.05,拒绝原假设,认为药物能降低血压 #单侧检验的临界值(显著性水平0.05) sep = t.ppf(0.95, df) print("将5%的数据与95%的数据分开的临界值:", sep)
内容的提问来源于stack exchange,提问作者nala
相关产品推荐
相关产品推荐

