Python stats.ttest_ind()vs.“;手册;学生人数的计算';s独立t检验:不同结果

Python stats.ttest_ind()vs.“;手册;学生人数的计算';s独立t检验:不同结果,python,scipy,t-test,Python,Scipy,T Test,我将stats.ttest_ind()与同一测试的“手动”计算进行比较,得到不同的结果 import numpy as np import pandas as pd import scipy.stats as stats import math stats.ttest_ind()方法: 输出: 手动方法: #mean men_mean, women_mean = men.mean(), women.mean() #standard deviation men_sd, women_sd = me

我将stats.ttest_ind()与同一测试的“手动”计算进行比较,得到不同的结果

import numpy as np
import pandas as pd
import scipy.stats as stats
import math
stats.ttest_ind()方法:

输出:

手动方法:

#mean
men_mean, women_mean = men.mean(), women.mean()
#standard deviation
men_sd, women_sd = men.std(ddof=1), women.std(ddof=1)
#standard error
men_n, women_n = len(men), len(women)
men_se, women_se = men_sd/math.sqrt(men_n), women_sd/math.sqrt(women_n)
#standard error on the difference between men and women
se_diff = math.sqrt(men_se**2.0 + women_se**2.0)
#t-stat
t_stat = (men_mean - women_mean) / se_diff
#degrees of freedom
df = men_n + women_n - 2
#critical value
alpha = 0.05
cv = stats.t.ppf(1.0 - alpha, df)
# p-value
p = (1 - stats.t.cdf(abs(t_stat), df)) * 2
print(t_stat, cv, p)
输出:


我们可以看出有一点不同。为什么?也许是因为stats.ttest_ind()是如何计算自由度的?非常感谢您的见解。

以下作品。这是上面的代码,只更改了两行

将numpy导入为np
作为pd进口熊猫
将scipy.stats导入为stats
输入数学
#生成数据
np.随机种子(123)
df=pd.DataFrame({
“年龄”:np.random.normal(40,5200).round(),
“性别”:np.random.choice(['male','femal'],200,p=[0.4,0.6]),
})
#定义组
男性=年龄[性别='男性']
女性=年龄[性别='女性']
#运行t检验
###############################更改了下面的行
test_stat,test_p=stats.ttest_ind(男性,女性,平等变量=False)
打印(测试统计、测试统计)
#卑鄙
男人是指,女人是指,男人是指,女人是指
#标准差
男性性病,女性性病=男性性病(ddof=1),女性性病(ddof=1)
#标准误差
男,女
男用户,女用户=男用户/数学.sqrt(男用户),女用户/数学.sqrt(女用户)
#男女差异的标准误差
seu diff=math.sqrt(男性se2.0+女性se2.0)
#t-stat
t_stat=(男性平均-女性平均)/se_diff
#自由度
###############################更改了下面的行
df=(男/男+女**2/女)**2/(男/女**4/男**2/(男/女1)+女**4/女**2/(女)
#临界值
α=0.05
cv=stats.t.ppf(1.0-α,df)
#p值
p=(1-stats.t.cdf(abs(t_stat),df))*2
打印(t_统计、cv、p)
它输出

-0.9244538916746341 0.356441636045986
-0.9244538916746341 1.6530443278019797 0.3564416360459859
代码不一致的原因如下:

test\u stat,test\u p=stats.ttest\u ind(男性,女性)
行中,您接受了默认设置,即t检验将由相等方差假设计算。因此,
scipy.stats
给出的计算是一个纯等方差t检验。这在的文档中有描述

在您自己的代码中,您通常遵循以下步骤:分别计算男性和女性的平均值及其标准误差的估计值,并以这种方式计算t统计量

你确实在一个地方偏离了韦尔奇测试:自由度计算。自由度应使用我在代码中输入的公式(并链接到上面)进行近似计算,但您使用了适用于的计算


如果您想要更多关于如何计算这些统计信息的详细信息,或者为什么它们被定义为这样,或者为什么您的代码不是您所期望的那样,我建议您检查一下,与之相比,这更适合于统计问题,而这更多是关于编程的。这两个社区都精通python,因此他们应该能够很好地帮助您解决问题。

要获得相同的t-统计,您需要声明这两个组不需要具有相同的方差,即
ttest_ind(男性,女性,equal_var=False)
在这种情况下,df计算更为复杂。参见维基百科非常感谢@LudvigH,答案已被接受,但您能否就我仍然不清楚的两件事多说几句:(1)因为我是按正态分布取样的,所以我假设方差等于btw样本(尽管它们的大小确实不相同)?(2) 我以为我在一个集合测试中计算了我的t值,不是吗?我稍微扩展了我的措辞,但并没有让统计数据比编程占用更多的空间。我建议您自己也实现等方差假设代码,看看它有多不同。如果你觉得这很难,我建议你在stats.stackexchange.com上提出一个问题。你也可以在那里告诉我。非常感谢LudvigH,事实上我现在得到了它(事实上,问题是我如何计算自由度)!我会记住你的建议,在stats.stackexchange上发布更多的“统计”问题。再次感谢
#mean
men_mean, women_mean = men.mean(), women.mean()
#standard deviation
men_sd, women_sd = men.std(ddof=1), women.std(ddof=1)
#standard error
men_n, women_n = len(men), len(women)
men_se, women_se = men_sd/math.sqrt(men_n), women_sd/math.sqrt(women_n)
#standard error on the difference between men and women
se_diff = math.sqrt(men_se**2.0 + women_se**2.0)
#t-stat
t_stat = (men_mean - women_mean) / se_diff
#degrees of freedom
df = men_n + women_n - 2
#critical value
alpha = 0.05
cv = stats.t.ppf(1.0 - alpha, df)
# p-value
p = (1 - stats.t.cdf(abs(t_stat), df)) * 2
print(t_stat, cv, p)
-0.9244538916746341 0.3563753194455255
-0.9244538916746341 0.356441636045986
-0.9244538916746341 1.6530443278019797 0.3564416360459859