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

问题描述 投票:0回答:7

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
执行单尾版本测试的示例或说明吗?

python scipy statistics
7个回答
94
投票

来自您的邮件列表链接:

因为单面测试可以从双面测试中退出 测试。 (对于对称分布,单边 p 值仅为一半 两侧 p 值)

接着说 scipy 总是给出有符号的检验统计量。这意味着给定双尾检验中的 p 和 t 值,您将在

p/2 < alpha and t > 0
时拒绝大于检验的原假设,在
p/2 < alpha and t < 0
时拒绝小于检验的原假设。


33
投票

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

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

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 以进行单尾检验。因此,取决于您选择的重要性级别
alpha
,您需要

p/2 < alpha

为了拒绝原假设

H0
。对于
alpha=0.05
来说,情况显然并非如此,所以你不能拒绝
H0

决定是否拒绝

H0
而无需对
t
p
进行任何代数运算的另一种方法是查看 t 值并将其与所需水平的临界 t 值
t_crit
进行比较适用于您的问题的自由度
df
的置信度(例如 95%)。既然我们有

df = sample_size_1 + sample_size_2 - 2 = 8

我们从像这个那个

这样的统计表中得到
t_crit(df=8, confidence_level=95%) = 1.860

我们显然有

t < t_crit

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

H0


7
投票
    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

4
投票

当原假设为

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
投票

基于 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

0
投票

由于声誉不足,我无法发表评论,但想指出,如果使用临界值(@bpirvu 的有用答案)来做出决定,则必须检查样本的方差是否大致相同(例如使用 F -test),否则您的自由度计算必须更改为使用 n1-1 和 n2-1 中较小的一个。

至少根据傻瓜统计: https://www.cliffsnotes.com/study-guides/statistics/univariate-inferential-tests/two-sample-t-test-for-comparing-two-means 和... https://www.jmp.com/en_us/statistics-knowledge-portal/t-test/two-sample-t-test.html


-2
投票

你看过这个吗: 如何使用 numpy 计算统计量“t 检验”

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

基本上:

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

© www.soinside.com 2019 - 2024. All rights reserved.