使用Numpy计算t值与Scipy结果不符,求问题排查建议
排查单样本t检验手动计算与Scipy结果不一致的问题
嘿,我一眼就发现你手动计算t值时的公式错误啦!咱们来一步步拆解问题:
核心错误:标准误的计算逻辑搞反了
单样本t检验的t值计算公式是:
t = (样本均值 - 假设总体均值) / (样本标准差 / √样本量)
这里的样本标准差/√样本量就是标准误(Standard Error),而你在代码里把分母写成了std_x * np.sqrt(n),相当于把标准误算成了样本标准差 * √样本量,直接把结果缩小了100倍(因为n=100,√n=10,乘以10和除以10的差距就是100倍),这就是为什么你的手动结果和Scipy差了两个数量级。
修正后的代码
把t值计算的分母改成除法就可以啦:
import numpy as np import scipy.stats as stats import matplotlib.pyplot as plt np.random.seed(seed=42) # make example reproducible n = 100 x = np.random.normal(loc=1.78, scale=.1, size=n) # the sample is here tval, pval = stats.ttest_1samp(x, 1.75) var_x = x.var(ddof=1) std_x = np.sqrt(var_x) # 修正:把*改成/ tval1 = (x.mean() - 1.75) / (std_x / np.sqrt(n)) print("Scipy: ",tval,"\nNumpy: ",tval1)
运行这段修正后的代码,你会发现手动计算的tval1和Scipy输出的tval完全一致(都是2.1598800019529265)。
额外验证小技巧
可以先单独计算标准误,确认数值是否正确:
standard_error = std_x / np.sqrt(n) print("标准误:", standard_error)
这样能更直观地检查每一步的计算是否符合统计公式,避免类似的符号错误。
内容的提问来源于stack exchange,提问作者Shubham Gupta
相关产品推荐
相关产品推荐

