测试两个二项分布在统计上是否彼此不同


37

我有三组数据,每组都有二项式分布(即,每组都有成功或失败的元素)。我没有成功的预测概率,而是只能依靠每个成功率作为真实成功率的近似值。我只发现了这个问题,虽然很接近,但似乎并不能完全解决这种情况。

为了简化测试,我们只说我有2个小组(在这个基本案例中可以扩展3个小组)。

  • 第1组试验: = 2455n1
  • 第2组试验: = 2730n2

  • 第1组成功: = 1556k1
  • 第2组成功: = 1671k2

我没有预期的成功概率,只有我从样本中知道的概率。因此,我对这两个组的隐含成功率是:

  • 第1组的成功率: = 1556/2455 = 63.4%p1
  • 第2组的成功率: = 1671/2730 = 61.2%p2

每个样本的成功率都相当接近。但是我的样本量也很大。如果我检查二项式分布的CDF来查看它与第一个分布有何不同(我假设第一个是零检验),那么第二个可以实现的可能性很小。

在Excel中:

1-BINOM.DIST(1556,2455,61.2%,TRUE)= 0.012

但是,这没有考虑第一个结果的任何方差,它只是假设第一个结果是测试概率。

有没有更好的方法来测试这两个数据样本在统计上是否彼此实际上有所不同?


我遇到的另一个问题并没有太大帮助:stats.stackexchange.com/questions/82059/…–
Scott


2
在R中,您可以使用prop.testprop.test(c(1556, 1671), c(2455, 2730))
COOLSerdash

1
可以通过两个样本(二项式)比例检验或2x2卡方检验完成
Glen_b 2014年

1
将基本案例从两组扩展到三组可能会出现问题,因为测试是相互依赖的:您将需要ANOVA的二项式版本来处理。
Whuber

Answers:


36

解决方案是一个简单的Google途径:http//en.wikipedia.org/wiki/Statistical_hypothesis_testing

因此,您想针对给定的替代检验以下零假设

H Ap 1p 2H0:p1=p2HA:p1p2

所以您只需要计算测试统计量

z=p^1p^2p^(1p^)(1n1+1n2)

其中。 p^=n1p^1+n2p^2n1+n2

所以现在,在您的问题中,,,和 p 2=0.612Ñ1=2455ñ2=2730。p^1=.634p^2=.612n1=2455n2=2730.

一旦计算了测试统计量,您只需要计算相应的关键区域值即可比较您的测试统计量。例如,如果要在95%置信水平下测试此假设,则需要将测试统计量与的临界区域值(对于这两个尾部测试)进行比较(1.9)。zα/2=1.96

现在,如果则可以拒绝原假设,否则您将无法拒绝原假设。 z>zα/2

很好,此解决方案适用于比较两个组的情况,但不能推广到要比较三个组的情况。

但是,您可以使用卡方检验来测试所有三个组是否具有相同的比例,如@Eric在上面的评论中所建议的:“这个问题有帮助吗?stats.stackexchange.com/questions/25299/…– Eric”


6
谢谢@丹。与Google一样,知道正确的搜索词是第一个障碍。我确实看了卡方检验。就像我第一次被困的地方一样,那里的问题是我的预期计算是基于样本的。因此,我无法提供期望值,因为我的样本用于确定该期望值。
斯科特

@Scott,如果您对三组的假设比例都相等,则每组的期望值应为1/3。
2014年

1
可以在以下位置找到使用此测试的相关说明:itl.nist.gov/div898/handbook/prc/section3/prc33.htm(当前,Wikipedia页面未提供逐步介绍示例)。
wwwilliam

p^(1p^)(1n1+1n2)=p^1(1p^1)n1+p^2(1p^2)n2

我的问题的答案可以在这里找到:stats.stackexchange.com/questions/361015/…–
Tanguy

10

在R中,答案计算为:

fisher.test(rbind(c(1556,2455-1556), c(1671,2730-1671)), alternative="less")

8
您是否会考虑编写一些比提供R函数更多的东西?给函数命名不会帮助理解问题,并不是每个人都使用R,因此对他们没有帮助。
蒂姆

1
这是最准确的统计答案,适用于少量观察(请参阅以下内容:itl.nist.gov/div898/handbook/prc/section3/prc33.htm)。
安德鲁·毛


3

只是一个摘要:

Dan和Abaumann的答案建议在二项式模型下进行测试,其中零假设是一个统一的单一二项式模型,其均值由经验数据估算得出。他们的答案在理论上是正确的,但由于检验统计量的分布不完全符合正态分布,因此需要使用正态分布进行近似。因此,它仅适用于大样本量。

但是David的回答表明使用费舍尔检验进行了非参数检验。信息在这里:https : //en.wikipedia.org/wiki/Fisher%27s_exact_test 而且它可以应用于小样本量,但很难为大样本量计算。

使用哪种测试以及您对p值的信任程度是一个谜。但是,无论选择哪种测试,始终存在偏差。


2
1/2

1
对于这种情况,我认为您可以使用Dan方法,但是以精确的方式(二项式)和近似的方式(正常Z>Φ-1(1-α/ 2)Z>Φ-1(1-α/ 2)和Z <Φ-1(α/ 2))比较它们是否足够接近。
Dr_Hope '16

1

Z=p1^p2^p^(1p^)(1/n1+1/n2)p^=n1p1^+n2p2^n1+n2

Z>Φ1(1α/2)Z<Φ1(α/2)


1

在Python中,statsmodels具有一个称为的函数proportions_ztest。这是一个用法示例:

import statsmodels.api as sm
import numpy as np
import rpy2.robjects.packages as rpackages
import rpy2.robjects as robjects
rstats = rpackages.importr('stats')

s1 = 1556
n1 = 2455

s2 = 1671
n2 = 2730

# manual calculation
p1 = s1 / n1
p2 = s2 / n2
p = (s1 + s2) / (n1 + n2)

z = (p1 - p2) / (p*(1-p)*((1/n1)+(1/n2)))**0.5

# using R in Python with rpy2
rmatrix = robjects.r.matrix(robjects.IntVector([s1, n1-s1, s2,n2-s2]), nrow=2)
fisher_test = rstats.fisher_test(rmatrix, alternative="two.sided")

zscore, pval = sm.stats.proportions_ztest([s1, s2], [n1, n2], alternative='two-sided')

print('Manual calculation of z: {:.6f}'.format(z))
print('Z-score from statsmodels: {:.6f}'.format(zscore))
print('R pvalue from fisher.test: {:.6f}'.format(fisher_test[0][0]))
print('Statsmodels pvalue: {:.6f}'.format(pval))

打印输出:

Manual calculation of z: 1.610825
Z-score from statsmodels: 1.610825
R pvalue from fisher.test: 0.108268
Statsmodels pvalue: 0.107218

-1

原始帖子:Dan的答案实际上是错误的,不要冒犯任何人。仅当您的数据遵循标准正态分布时才使用z检验。在这种情况下,您的数据遵循二项式分布,因此,如果样本较大,则使用卡方检验;如果样本较小,则使用费舍尔检验。

编辑:我的错误,对@Dan表示歉意。如果您的变量是独立的,则z检验在此处有效。如果不满足此假设或未知,则z检验可能无效。


2
χ2

如果您相信CLT,那么通常会存在正态分布。
瑞安

2
@Ryan好吧,我相信CLT,但是它没有说出有关n = 30或n = 300或n = 5000的任何信息。除非您设法以某种方式拥有无限的样本量,或者以某种方式开始使用正态性,否则您实际上并不会获得正态性。CLT并未解决有关在求平均值时离常态有多接近的问题。(我们可以考虑这些问题,但我们不会使用CLT来找出近似值是否很好。)
Glen_b 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.