Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用numpy/scipy进行双样本单尾t检验_Python_Scipy_Statistics - Fatal编程技术网

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

Python 如何使用numpy/scipy进行双样本单尾t检验,python,scipy,statistics,Python,Scipy,Statistics,在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

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
提供了类似的函数,但它只能进行双尾t检验。我找到的关于这个主题的最接近的信息是link,但它似乎是关于在
scipy
中实现单尾与双尾策略的讨论


因此,我的问题是,是否有人知道如何使用邮件列表链接中的
numpy/scipy

执行单尾版本测试的示例或说明:

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


它接着说,scipy总是给出带符号的测试统计数据。这意味着,给定双尾检验的p和t值,当p/20时,您将拒绝大于检验的无效假设,当无效假设为
Ho:P1>=P2
且替代假设为
Ha:P10
时,您将拒绝小于检验的无效假设,实际z分数实际上等于
-statstic
,实际p值等于pvalue/2


Ivc的答案应该是当
(1-p/2)
时,您可以拒绝小于的假设

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

首先,让我们恰当地阐述我们的调查问题。我们正在调查的数据是

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
我们愿意拒绝,而支持另一种假设

H0: A >= B
H1: B > A
现在,当您调用
scipy.stats.ttest_u ind(x,y)
时,这会对
x.mean()-y.mean()
的值进行假设检验,这意味着为了在整个计算过程中获得正值(简化所有考虑),我们必须调用

stats.ttest_ind(B,A)
而不是
stats.ttest\u ind(B,A)
。我们得到了答案

  • t值=0.42210654140239207
  • p-value=0.68406235191764142
由于这是双尾t检验的结果,我们必须将
p
除以2进行单尾检验。因此,根据重要性级别
alpha
选择您需要的

p/2 < alpha
我们从这样的统计表中得到

我们显然有

t < t_crit
t
因此,我们再次得到了相同的结果,即我们不能拒绝H0,你看到了吗

我认为这正是这个问题所关注的

基本上:

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

Ttest_1sampResult(statistic=3.872983346207417, pvalue=0.030466291662170977)
与scipy.stats import ttest\u ind中的R.

中的示例结果相同
def t_测试(x,y,备选方案=‘双面’):
_,double_p=ttest_ind(x,y,equal_var=False)
如果备选方案==‘双面’:
pval=双p
elif alternative==“更大”:
如果np.平均值(x)>np.平均值(y):
pval=双p/2。
其他:
pval=1.0-双p/2。
elif alternative==“更少”:
如果np.平均值(x)
基于R中的此函数:

def t测试(a,b,轴=0,相等值=True,nan_policy='propagate',
备选方案='two.sided'):
tval,pval=ttest\u ind(a=a,b=b,轴=轴,相等值=相等值,
nan_策略=nan_策略)
如果备选方案==“更大”:
如果tval<0:
pval=1-pval/2
其他:
pval=pval/2
elif alternative==“更少”:
如果tval<0:
pval/=2
其他:
pval=1-pval/2
其他:
assert alternative=='two.side'
返回tval,pval

这里还有一段相关视频:我对
t
的这种表述有点困惑。H0:first大于second
first=np.random.normal(3,2400);第二个=np.随机.正常(6,2400);t、 p=stats.ttest_ind(第一,第二,轴=0,相等值=True)t-stat=-23.0,p-value/2=1.33e-90t@Tonja:由于第一个平均值和第二个平均值之间的差值为负值,因此得到的t-stat为负值。
scipy.stats.ttest\u ind(a,b)
计算的平均值的差异是
mean(a)-mean(b)
,因此如果您试图证明的另一种假设是
mean(second)>mean(first)
,那么您可以调用
scipy.stats.ttest\u ind(second,first)
,并且您不必担心符号。在这种情况下,拒绝零假设(即,
平均(秒)t_crit(df)
,…
t_crit(df)
df
自由度的临界t值,它基本上是
样本大小\u 1+样本大小\u 2-2
,可以从这样的统计表中读取…用于单尾检验(或者这是一个双尾测试)。当我阅读你的帖子时,我感到非常惊讶。从我的观点来看,我认为在单面p值中,p应该总是在p/2之外。你能给我一些关于(1-p/2)的相关文档吗?根据,只有当参数
equal\u var
设置为False时,你才能
stat
import scipy.stats
x = [1,2,3,4]
scipy.stats.ttest_1samp(x, 0)

Ttest_1sampResult(statistic=3.872983346207417, pvalue=0.030466291662170977)
    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
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