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/2
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
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大于secondfirst=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