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

Tim*_*imo 30 python statistics numpy 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 
Run Code Online (Sandbox Code Playgroud)

在Python世界中,scipy提供了类似的函数ttest_ind,但它只能进行双尾t检验.关于我发现的主题的最近信息是这个链接,但它似乎是对实施单尾与双尾的策略的讨论scipy.

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

lvc*_*lvc 65

从您的邮件列表链接:

因为单侧测试可以从双面测试中退出.(对称分布单侧p值只是双侧p值的一半)

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

  • @Tonja:你得到一个负的 t-stat,因为第一个平均值和第二个平均值之间的差异是负的。`scipy.stats.ttest_ind(a, b)` 计算的均值的差异是 `mean(a)-mean(b)`,所以如果你试图证明的替代假设是 `mean(second)&gt; mean(first)`,然后你可以调用`scipy.stats.ttest_ind(second, first)`,你不必担心符号。在这种情况下,如果 `p-value/2 &lt; alpha` 等价于 `t&gt;t_crit(df)`,则拒绝 Null Hypothesis(即 `mean(second)&lt;=mean(first)`), (3认同)

bpi*_*rvu 10

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

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

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])
Run Code Online (Sandbox Code Playgroud)

用样品装置

A.mean() = 0.99549419
B.mean() = 1.1798523
Run Code Online (Sandbox Code Playgroud)

我假设由于B的平均值明显大于A的平均值,您想检查此结果是否具有统计显着性.

所以我们有Null假设

H0: A >= B
Run Code Online (Sandbox Code Playgroud)

我们想拒绝支持替代假设

H1: B > A
Run Code Online (Sandbox Code Playgroud)

现在,当你打电话时scipy.stats.ttest_ind(x, y),这会对价值进行假设检验x.mean()-y.mean(),这意味着为了在整个计算过程中获得正值(这简化了所有考虑因素),我们必须调用

stats.ttest_ind(B,A)
Run Code Online (Sandbox Code Playgroud)

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

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

并且根据文档,这是双尾t检验的输出,我们必须将p我的单尾检验除以2.因此,根据alpha您选择的意义水平,您需要

p/2 < alpha
Run Code Online (Sandbox Code Playgroud)

为了拒绝空假设H0.因为alpha=0.05这显然不是这样,所以你不能拒绝 H0.

另一种决定你是否拒绝H0而不必进行任何代数的方法,t或者p通过查看t值并将其与t_crit所需置信水平(例如95%)的临界t值进行比较.df适用于您的问题的自由.既然我们有

df = sample_size_1 + sample_size_2 - 2 = 8
Run Code Online (Sandbox Code Playgroud)

我们从像统计表得到这一个

t_crit(df=8, confidence_level=95%) = 1.860
Run Code Online (Sandbox Code Playgroud)

我们显然有

t < t_crit
Run Code Online (Sandbox Code Playgroud)

所以我们再次获得相同的结果,即我们不能拒绝 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
Run Code Online (Sandbox Code Playgroud)