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

时间:2013-04-13 04:25:43

标签: python numpy statistics scipy

R中,只需使用

即可执行双样本单尾t检验
> 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执行测试的单尾版本的任何示例或说明?

6 个答案:

答案 0 :(得分:59)

从您的邮件列表链接:

  

因为片面测试可以从双面退出   试验。 (对称分布单侧p值只有一半   双面pvalue)

接着说,scipy总是将测试统计信息作为签名。这意味着给定来自双尾测试的p和t值,您将拒绝p/2 < alpha and t > 0时大于测试的零假设,以及p/2 < alpha and t < 0时小于测试的零假设。

答案 1 :(得分:7)

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

首先让我们正确地制定我们的调查问题。我们正在研究的数据是

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的平均值,你想检查这个结果是否具有统计显着性。

所以我们有Null Hypothesis

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进行单尾检验。因此,根据您选择的显着性级别alpha

p/2 < alpha

以拒绝空假设H0。对于alpha=0.05,情况显然并非如此,因此您无法拒绝 H0

另一种决定是否拒绝H0而不必在tp进行任何代数的方法是查看t值并将其与关键t-进行比较对于适用于您的问题的自由度t_crit,所需置信度(例如95%)的值df。因为我们有

df = sample_size_1 + sample_size_2 - 2 = 8

我们从像this one这样的统计表中得到

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

我们显然有

t < t_crit

所以我们再次得到相同的结果,即我们不能拒绝 H0

答案 2 :(得分:3)

当零假设为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值等于pvalue / 2.

Ivc的回答应该是(1-p/2) < alpha and t < 0,你可以拒绝不到假设。

答案 3 :(得分:1)

您看过这个吗: How to calculate the statistics "t-test" with numpy

我认为这正是这个问题所要解决的。

基本上:

import scipy.stats
x = [1,2,3,4]
scipy.stats.ttest_1samp(x, 0)

Ttest_1sampResult(statistic=3.872983346207417, pvalue=0.030466291662170977)

与R中的此示例相同。https://stats.stackexchange.com/questions/51242/statistical-difference-from-zero

答案 4 :(得分:0)

    from scipy.stats import ttest_ind  
    
    def t_test(x,y,alternative='both-sided'):
            _, double_p = ttest_ind(x,y,equal_var = False)
            if alternative == 'both-sided':
                pval = double_p
            elif alternative == 'greater':
                if np.mean(x) > np.mean(y):
                    pval = double_p/2.
                else:
                    pval = 1.0 - double_p/2.
            elif alternative == 'less':
                if np.mean(x) < np.mean(y):
                    pval = double_p/2.
                else:
                    pval = 1.0 - double_p/2.
            return pval

    A = [0.19826790, 1.36836629, 1.37950911, 1.46951540, 1.48197798, 0.07532846]
    B = [0.6383447, 0.5271385, 1.7721380, 1.7817880]

    print(t_test(A,B,alternative='greater'))
    0.6555098817758839

答案 5 :(得分:0)

基于 R 的这个函数:https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/t.test

def ttest(a, b, axis=0, equal_var=True, nan_policy='propagate',
          alternative='two.sided'):        
    tval, pval = ttest_ind(a=a, b=b, axis=axis, equal_var=equal_var,
                           nan_policy=nan_policy)
    if alternative == 'greater':
        if tval < 0:
            pval = 1 - pval / 2
        else:
            pval = pval / 2
    elif alternative == 'less':
        if tval < 0:
            pval /= 2
        else:
            pval = 1 - pval / 2
    else:
        assert alternative == 'two.sided'
    return tval, pval