如何用numpy/scipy进行双样本单尾t检验

2024-04-26 10:35:33 发布

您现在位置:Python中文网/ 问答频道 /正文

R中,只需使用

> A = c(0.19826790, 1.36836629, 1.37950911, 1.46951540, 1.48197798, 0.07532846)
> B = c(0.6383447, 0.5271385, 1.7721380, 1.7817880)
> t.test(A, B, alternative="greater")

    Welch Two Sample t-test

data:  A and B 
t = -0.4189, df = 6.409, p-value = 0.6555
alternative hypothesis: true difference in means is greater than 0 
95 percent confidence interval:
 -1.029916       Inf 
sample estimates:
mean of x mean of y 
0.9954942 1.1798523 

在Python世界中,scipy提供类似的函数ttest_ind,但它只能执行双尾t-测试。关于这个主题,我找到的最接近的信息是this链接,但它似乎是关于在scipy中实现单尾与双尾的策略的讨论。

因此,我的问题是,是否有人知道如何使用numpy/scipy执行测试的单尾版本的示例或说明?


Tags: andofsampletestdfdatavaluescipy
3条回答

从您的邮件列表链接:

because the one-sided tests can be backed out from the two-sided tests. (With symmetric distributions one-sided p-value is just half of the two-sided pvalue)

接着说,scipy总是给出有符号的测试统计数据。这意味着给定来自双尾检验的p和t值,您将拒绝当p/2 < alpha and t > 0时大于检验和当p/2 < alpha and t < 0时小于检验的空假设。

在试图将一些见解作为评论添加到已接受的答案中,但由于对评论的一般限制,无法正确地将其写下来之后,我决定将我的两分钱作为完整答案。

首先,让我们适当地提出我们的调查问题。我们正在调查的数据是

A = np.array([0.19826790, 1.36836629, 1.37950911, 1.46951540, 1.48197798, 0.07532846])
B = np.array([0.6383447, 0.5271385, 1.7721380, 1.7817880])

用样本法

A.mean() = 0.99549419
B.mean() = 1.1798523

我假设,因为B的平均值明显大于A的平均值,所以您需要检查这个结果是否具有统计学意义。

所以我们有一个无效的假设

H0: A >= B

为了支持另一种假设,我们想拒绝

H1: B > A

现在,当您调用scipy.stats.ttest_ind(x, y)时,这将对x.mean()-y.mean()的值进行假设测试,这意味着为了在整个计算过程中获得正值(这简化了所有考虑事项),我们必须调用

stats.ttest_ind(B,A)

而不是stats.ttest_ind(B,A)。我们得到的答案是

  • t-value = 0.42210654140239207
  • p-value = 0.68406235191764142

因为根据documentation这是双尾t-检验的输出,所以对于单尾检验,我们必须将p除以2。所以取决于你所选择的重要程度

p/2 < alpha

为了拒绝无效假设H0。对于alpha=0.05来说,情况显然不是这样,因此您不能拒绝H0

另一种不用对tp做任何代数就可以决定是否拒绝H0的方法是查看t值,并将其与适用于您的问题的自由度df的期望置信度(例如95%)下的临界t值t_crit进行比较。因为我们已经

df = sample_size_1 + sample_size_2 - 2 = 8

我们从一个类似this one的统计表中得到

t_crit(df=8, confidence_level=95%) = 1.860

我们显然有

t < t_crit

所以我们又得到了同样的结果,即我们不能拒绝H0

当零假设是Ho: P1>=P2而替代假设是Ha: P1<P2时。为了在Python中测试它,您可以编写ttest_ind(P2,P1)。(注意位置是P2优先)。

first = np.random.normal(3,2,400)
second = np.random.normal(6,2,400)
stats.ttest_ind(first, second, axis=0, equal_var=True)

你会得到如下结果 Ttest_indResult(statistic=-20.442436213923845,pvalue=5.0999336686332285e-75)

在Python中,当statstic <0时,实际p值实际上是real_pvalue = 1-output_pvalue/2= 1-5.0999336686332285e-75/2,约为0.99。由于p值大于0.05,您不能拒绝6>;=3的空假设。当statstic >0时,实际z值实际上等于-statstic,实际p值等于p value/2。

Ivc的答案应该是当(1-p/2) < alpha and t < 0时,可以拒绝小于假设。

相关问题 更多 >