Python计算Student-t分布自由度出错,请求排查修正
排查Student-t分布自由度计算的代码问题
我帮你找出了两处关键错误,这应该就是导致结果不对的核心原因:
1. 样本标准差计算错误
你的stdev函数计算的是总体标准差(直接除以样本数量len(X)),但在计算Welch-Satterthwaite自由度时,我们需要用样本标准差(除以len(X)-1,这是总体标准差的无偏估计量)。
修正后的标准差函数应该是:
def stdev(X): m = mean(X) return math.sqrt(sum((x-m)**2 for x in X) / (len(X) - 1))
2. 自由度公式的括号位置错误
在degreesOfFreedom函数的分母部分,你对第二个样本的处理写错了括号逻辑:
原代码中这部分:
(s2 / len(Y))**2 / len(Y) - 1
会被Python解析为((s2/len(Y))² / len(Y)) - 1,完全偏离了公式要求。正确的写法应该是将len(Y)-1作为整个项的除数,也就是:
(s2 / len(Y))**2 / (len(Y) - 1)
修正后的完整代码
import math def mean(X): return sum(X) / len(X) def stdev(X): m = mean(X) return math.sqrt(sum((x-m)**2 for x in X) / (len(X) - 1)) def degreesOfFreedom(X, Y): n1 = len(X) n2 = len(Y) s1_sq = stdev(X)**2 s2_sq = stdev(Y)**2 numerator = (s1_sq / n1 + s2_sq / n2)**2 denominator = (s1_sq / n1)**2 / (n1 - 1) + (s2_sq / n2)**2 / (n2 - 1) df = numerator / denominator return df # 假设A和B是你的样本数据 # A = [1,2,3,...] # B = [4,5,6,...] print('Degrees of freedom for Student-t distribution: ' + str(degreesOfFreedom(A, B)))
我额外加了n1和n2变量让代码更易读,避免重复调用len()。现在这个版本应该能正确计算Welch-Satterthwaite自由度了。
内容的提问来源于stack exchange,提问作者Johny Doe
相关产品推荐
相关产品推荐

