我想执行两个样本的单尾t检验以比较两个均值。对于我正在寻找的特定问题,我希望比较仅在一个方向上进行。我希望原假设为mu_2 > mu_1
,替代假设为mu_1 <= mu_2
。还是零假设仍然是mu_1 - mu_2 = 0
,即使对于单尾情况也是如此?
我正在使用大型数据集,但是如果我要提取并舍入参数,则data_1为mu_1 = 4.3, s_1 = 4.8, and n_1 = 40000
,data_2为mu_2 = 4.9, s_2 = 4.4, n_2 = 30000
。我正在使用scipy进行两个样本的t检验:
stats.ttest_ind(data1,
data2,
equal_var = False)
鉴于scipy仅考虑了两尾测试,所以我不确定如何解释这些值。 Ttest_indResult(statistic=-19.51646312898464, pvalue=1.3452106729078845e-84)
。 alpha值为0.05,而p值则比意味着零假设被拒绝的小得多。但是,我的直觉告诉我,不应该拒绝原假设,因为mu_2明显大于mu_1(至少我希望p值更大)。因此,我觉得我要么错误地解释了结果,要么需要进行额外的计算以获得正确的答案。
我将感谢您提供任何其他帮助和指导。谢谢!
您是正确的,如果您要进行单面测试,则它应该具有较大的p值。 ttest_ind
执行两侧检验,这使您有可能观察到比t统计量的绝对值更极端的东西。
要进行单面t检验,您可以使用cdf,它是直至t统计量的概率之和。
稍微修改this code:
def welch_ttest(x1, x2,alternative):
n1 = x1.size
n2 = x2.size
m1 = np.mean(x1)
m2 = np.mean(x2)
v1 = np.var(x1, ddof=1)
v2 = np.var(x2, ddof=1)
t = (m1 - m2) / np.sqrt(v1 / n1 + v2 / n2)
df = (v1 / n1 + v2 / n2)**2 / (v1**2 / (n1**2 * (n1 - 1)) + v2**2 / (n2**2 * (n2 - 1)))
if alternative == "equal":
p = 2 * t.cdf(-abs(t), df)
if alternative == "lesser":
p = 1-t.cdf(abs(t), df)
if alternative == "greater":
p = t.cdf(abs(t), df)
return t, df, p
我模拟一些数据:
import numpy as np
from scipy.stats import ttest_ind
from scipy.stats import t
np.random.seed(seed=123)
data1 = np.random.normal(4.3,4.8,size=40000)
np.random.seed(seed=123)
data2 = np.random.normal(4.9,4.4,size=30000)
ndf = len(data1) +len(data2) - 2
ttest_ind(data1,data2,equal_var = False)
Ttest_indResult(statistic=-16.945279258324227, pvalue=2.8364816571790452e-64)
您得到的结果类似,我们可以对上面的代码进行替代==“ equal”的测试,这是一个双向测试:
welch_ttest(data1,data2,"equal")
(<scipy.stats._continuous_distns.t_gen at 0x12472b128>,
67287.08544468222,
2.8364816571790452e-64)
您可以使用与scipy 2面t检验相同的p值,现在我们进行您需要的单面检验:
welch_ttest(data1,data2,"greater")
(<scipy.stats._continuous_distns.t_gen at 0x12472b128>, 67287.08544468222, 1.0)