gpt4 book ai didi

python - 追踪 SciPy 的 `ttest_ind()` 函数所做的假设

转载 作者:太空狗 更新时间:2023-10-29 21:35:18 24 4
gpt4 key购买 nike

我正在尝试编写自己的 Python 代码来计算一个和两个尾部独立 t 检验的 t 统计量和 p 值。我可以使用正态近似,但目前我只想使用 t 分布。我未能成功将 SciPy 统计库的结果与我的测试数据相匹配。我可以用一双新的眼睛看看我是否只是在某个地方犯了一个愚蠢的错误。

请注意,这是 cross-posted from Cross-Validated因为它在那里已经有一段时间没有回应了,所以我认为也可以听取一些软件开发人员的意见。我试图了解我正在使用的算法是否存在错误,该算法应该重现 SciPy 的结果。这是一个简单的算法,所以很奇怪为什么我找不到错误。

我的代码:

import numpy as np
import scipy.stats as st

def compute_t_stat(pop1,pop2):

num1 = pop1.shape[0]; num2 = pop2.shape[0];

# The formula for t-stat when population variances differ.
t_stat = (np.mean(pop1) - np.mean(pop2))/np.sqrt( np.var(pop1)/num1 + np.var(pop2)/num2 )

# ADDED: The Welch-Satterthwaite degrees of freedom.
df = ((np.var(pop1)/num1 + np.var(pop2)/num2)**(2.0))/( (np.var(pop1)/num1)**(2.0)/(num1-1) + (np.var(pop2)/num2)**(2.0)/(num2-1) )

# Am I computing this wrong?
# It should just come from the CDF like this, right?
# The extra parameter is the degrees of freedom.

one_tailed_p_value = 1.0 - st.t.cdf(t_stat,df)
two_tailed_p_value = 1.0 - ( st.t.cdf(np.abs(t_stat),df) - st.t.cdf(-np.abs(t_stat),df) )


# Computing with SciPy's built-ins
# My results don't match theirs.
t_ind, p_ind = st.ttest_ind(pop1, pop2)

return t_stat, one_tailed_p_value, two_tailed_p_value, t_ind, p_ind

更新:

在详细阅读了 Welch 的 t 检验后,我发现我应该使用 Welch-Satterthwaite 公式来计算自由度。我更新了上面的代码以反射(reflect)这一点。

有了新的自由度,我得到了更接近的结果。我的两侧 p 值与 SciPy 版本的相差大约 0.008...但这仍然是一个太大的错误,所以我必须仍然做一些不正确的事情(或者 SciPy 分布函数非常糟糕,但很难相信它们仅精确到小数点后两位)。

第二次更新:

在继续尝试的同时,我认为当自由度足够高(大约 > 30)时,SciPy 的版本可能会自动计算 t 分布的正态近似值。所以我改用正态分布重新运行我的代码,计算结果实际上比我使用 t 分布时更远离 SciPy。

奖金问题:)(更多统计理论相关,随意忽略)

此外,t 统计量为负。我只是想知道这对单侧 t 检验意味着什么。这是否通常意味着我应该在负轴方向上进行测试?在我的测试数据中,人口1是一个对照组,没有接受过某个就业培训项目。人群2确实收到了,测得的数据是治疗前后的工资差异。

所以我有理由认为总体 2 的均值会更大。但从统计理论的角度来看,这样炮制测试似乎并不正确。在不依赖对数据的主观知识的情况下,我怎么知道在负方向检查(对于单侧测试)?还是这只是那些频率论者的事情之一,虽然在哲学上并不严谨,但需要在实践中完成?

最佳答案

通过使用 SciPy 内置函数 source(),我可以看到函数 ttest_ind() 的源代码打印输出。根据源代码,SciPy 内置正在执行 t 检验,假设两个样本的方差相等。它没有使用 Welch-Satterthwaite 自由度。 SciPy 假设方差相等,但未说明此假设。

我只想指出,至关重要的是,这就是为什么你不应该只相信库函数。在我的例子中,我确实需要对方差不等的总体进行 t 检验,并且对于我将在其上运行的一些较小的数据集,自由度调整可能很重要。

正如我在一些评论中提到的,对于 30 到 400 之间的样本量,我的代码和 SciPy 的代码之间的差异大约为 0.008,然后对于更大的样本量慢慢变为零。这是等方差 t 统计量分母中额外 (1/n1 + 1/n2) 项的影响。准确度方面,这非常重要,尤其是对于小样本量。它明确地向我证实了我需要编写自己的函数。 (可能还有其他更好的 Python 库,但至少应该知道这一点。坦率地说,令人惊讶的是,这在 ttest_ind() 的 SciPy 文档中并没有放在首位和中心位置)。

关于python - 追踪 SciPy 的 `ttest_ind()` 函数所做的假设,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10038543/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com