关于 DataCamp 关于 p 值的假设检验问题的问题

Question about DataCamp's hypothesis testing problem concerning p-values

我正在上名为 DataCamp 的在线数据科学教学网站上的一门课程,我对他们的一个问题(与假设检验有关)有疑问。我将陈述问题、他们的解决方案,然后是我对解决方案的问题。问题陈述在这里:

1964 年的民权法案是美国有史以来通过的最重要的立法之一。排除“出席”和“弃权”票,153 名众议院民主党人和 136 名共和党人投了赞成票。然而,91 名民主党人和 35 名共和党人投了反对票。党派关系对投票有影响吗? 要回答这个问题,您需要评估众议院议员的党派与他或她的投票无关的假设。您将使用投票赞成的民主党人比例作为检验统计量,并评估观察到投票赞成的民主党人比例至少与观察到的比例 153/244 一样小的概率。 (没错,至少小到。1964年,在民权问题上进步不大的是民主党。)要做到这一点,排列众议院选民的党派标签,然后随意将他们分为“民主党”和“民主党”。共和党人”并计算民主党投票赞成的比例。

正确的 python 答案在这里

# Construct arrays of data: dems, reps
dems = np.array([True] * 153 + [False] * 91)
reps = np.array([True] * 136 + [False] * 35)

def frac_yea_dems(dems, reps):
    """Compute fraction of Democrat yea votes."""
    frac = np.sum(dems) / len(dems)
    return frac

# Acquire permutation samples: perm_replicates
perm_replicates = draw_perm_reps(dems, reps, frac_yea_dems, 10000)

# Compute and print p-value: p
p = np.sum(perm_replicates <= 153/244) / len(perm_replicates)
print('p-value =', p)
plt.hist(perm_replicates,bins=50)
plt.show()

哪里


def draw_perm_reps(data_1, data_2, func, size=1):
    """Generate multiple permutation replicates."""

    # Initialize array of replicates: perm_replicates
    perm_replicates = np.empty(size)

    for i in range(size):
        # Generate permutation sample
        perm_sample_1, perm_sample_2 = permutation_sample(data_1,data_2)

        # Compute the test statistic
        perm_replicates[i] = func(perm_sample_1,perm_sample_2)

    return perm_replicates

def permutation_sample(data1, data2):
    """Generate a permutation sample from two data sets."""

    # Concatenate the data sets: data
    data = np.concatenate((data1,data2))

    # Permute the concatenated array: permuted_data
    permuted_data = np.random.permutation(data)

    # Split the permuted array into two: perm_sample_1, perm_sample_2
    perm_sample_1 = permuted_data[:len(data1)]
    perm_sample_2 = permuted_data[len(data1):]

    return perm_sample_1, perm_sample_2

当你 运行 以上所有代码时,你会发现 p 非常小,这意味着原假设应该被拒绝。

我不明白的是为什么他们求和 perm_replicates 小于或等于 153/244。如果他们正在测试的假设是众议院议员的政党对他或她的投票没有影响,他们不应该像 p = np.sum(153/244-delta <= perm_replicates <= 153/244+delta) / len(perm_replicates),其中 delta 是确定经验均值周围邻域的某个参数,它决定了置换数据集均值的均值与经验均值之间的相似性阈值?

另一种说法:如果我们用 dems 替换 reps,那么 perm_replicates = draw_perm_reps(dems, reps, frac_yea_dems, 10000) 就是 perm_replicates = draw_perm_reps(dems, dems, frac_yea_dems, 10000),那么这个假设肯定会表明党派关系对投票没有影响(这是原假设)。如果您 运行 这段代码,您将获得 50% 的 p 值(这是有道理的,所有排列都会给出相似的答案),但是随着 reps 数据集偏离 dems,您将开始增加远离 a 50% p 值或远离 50% p 值递减,因此 p = np.sum(perm_replicates <= 153/244) / len(perm_replicates) 很小 (<<1) OR 大(接近 1)应该会让你拒绝原假设,接近 1/2 的 p 值应该会让你接受原假设,对吗???

一定有一些非常基本的东西我在这里遗漏了,也许有人可以尝试直接回答我的问题和疑虑,或者你可以独立地解释答案,也许我会理解你的解释到我的疑虑对我来说变得荒谬。不过我很感激任何帮助=D

好主意,您刚刚描述了单侧测试和双侧测试之间的区别。为了更深入地了解它,每次进行模拟时,您都会模拟一部分民主党人在党派关系不起作用的假设下投赞成票。

这些模拟分数构建了一个分布,称为零分布,然后我们将给定分数 153/244 与该分布进行比较。如果我们给定的分数与模拟分数的分布相比异常小,我们将拒绝原假设。我想你的意思是,如果真实分数与零分布相比异常大,我们不应该也拒绝吗?难道异常大的比例也能证明存在党派效应吗?

答案是肯定的!异常小或异常大的分数都可能是反对原假设的证据,您可以设置检验来说明这两者。也就是所谓的双面测试。

问题是你希望你的力量在哪里。准确地说:备择假设是一个很大的地方。在备选方案下,党派关系确实发挥了一些作用,但它可能是双向的。 DataCamp 测试专门设计用于在民主党比共和党 更少 可能投票赞成时拒绝。你可以在相反的方向设置一个测试,如果你有一个异常 的民主党赞成分数,它也会拒绝,这也是对这个零假设的有效测试(那个党不没有区别)。但是,在这种情况下它不会拒绝,因为我们看到的经验分数偏低而不是偏大。

你的双面测试也是一个有效的测试。但是,对于民主党实际上比共和党人更不可能投票赞成的情况,最有力的测试将是 DataCamp 的测试。而且,如果您只关心在民主党人的可能性较小而不是共和党人时拒绝零假设,那么您应该使用它。但如果你关心这两种可能性,你应该进行双面测试。

我认为 DataCamp 使用单侧测试是因为它更易于编码,而不是因为它更适合这种情况。