Перевірте, чи два біноміальних розподіли статистично відрізняються один від одного


37

У мене є три групи даних, кожна з біноміальним розподілом (тобто кожна група має елементи, що мають успіх чи невдачу). У мене немає передбачуваної ймовірності успіху, але натомість я можу розраховувати лише на рівень успішності кожного як наближення до справжнього показника успіху. Я лише знайшов це питання , яке є близьким, але, схоже, не відповідає саме цьому сценарію.

Щоб спростити тест, скажімо, що у мене є 2 групи (3 можна розширити з цього базового випадку).

  • Випробування групи 1: = 2455n1
  • Випробування групи 2: = 2730n2

  • Успіх 1 групи: = 1556k1
  • Успіх 2 групи: = 1671k2

Я не маю очікуваної ймовірності успіху, лише те, що я знаю з зразків. Тож мій мається на увазі рівень успішності для двох груп:

  • Коефіцієнт успішності 1 групи: = 1556/2455 = 63,4%p1
  • Коефіцієнт успішності 2 групи: p2 = 1671/2730 = 61,2%

Коефіцієнт успішності кожного зразка досить близький. Однак розміри моїх зразків також досить великі. Якщо я перевіряю CDF біноміального розподілу, щоб побачити, наскільки він відрізняється від першого (де я припускаю, що перший є нульовим тестом), я отримую дуже малу ймовірність того, що другого вдасться досягти.

В Excel:

1-BINOM.DIST (1556,2455,61,2%, ІСТИНА) = 0,012

Однак це не враховує жодної дисперсії першого результату, вона просто передбачає, що перший результат - це ймовірність тесту.

Чи є кращий спосіб перевірити, чи справді ці два зразки даних статистично відрізняються один від одного?


Ще одне питання, на яке я натрапив, не дуже допомогло: stats.stackexchange.com/questions/82059/…
Скотт,

Чи допомагає це питання? stats.stackexchange.com/questions/25299/…
Ерік

2
В R, ви можете використовувати prop.test: prop.test(c(1556, 1671), c(2455, 2730)).
COOLSerdash

1
Можна зробити як тест на
двовимірні

1
Розширення базового випадку з двох груп на три може бути проблематичним, оскільки тести будуть взаємозалежними: для цього вам знадобиться біноміальна версія ANOVA.
whuber

Відповіді:


36

Рішення - простий google: http://en.wikipedia.org/wiki/Statistic_hypothesis_testing

Отже, ви хочете перевірити наступну нульову гіпотезу щодо даної альтернативи

проти H A : p 1p 2H0:p1=p2HA:p1p2

Тож вам просто потрібно обчислити тестову статистику, яка є

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

де р = п 1 р 1 + п 2 р 2 . p^=n1p^1+n2p^2n1+n2

Так що тепер, у вашій , р 2 = 0,612 , п 1 = 2455 і п 2 = 2730.p^1=.634p^2=.612n1=2455n2=2730.

Після підрахунку статистики тесту вам просто потрібно обчислити відповідне значення критичної області для порівняння вашої статистики тесту. Наприклад, якщо ви тестуєте цю гіпотезу на рівні 95% достовірності, вам потрібно порівняти свою статистику тесту з критичною величиною області (для цього двох тестових тестів).zα/2=1.96

Тепер, якщо то ви можете відхилити нульову гіпотезу, інакше вам не вдасться відкинути нульову гіпотезу. z>zα/2

Добре це рішення працює для випадку, коли ви порівнюєте дві групи, але це не узагальнює випадку, коли ви хочете порівняти 3 групи.

Однак ви можете використати тест Chi Squared, щоб перевірити, чи всі три групи мають рівні пропорції, як запропонував @Eric у своєму коментарі вище: "Чи допомагає це питання? Stats.stackexchange.com/questions/25299/… - Ерік"


6
Дякую @Dan. Як і багато разів з Google, знання правильного терміна для пошуку є першою перешкодою. Я поглянув на тест хі-квадрата. Проблема, як і в тому, де я вперше застрягла, полягає в тому, що мій очікуваний розрахунок базується на вибірці. Тому я не можу надати очікуваного значення, оскільки мої вибірки використовуються для визначення цього очікуваного значення.
Скотт

@ Скотт, якщо ваші гіпотезовані пропорції для трьох груп такі, що всі вони рівні, то очікуване значення повинно бути 1/3 для кожної групи.
День

1
Пов’язане пояснення використання цього тесту можна знайти тут: itl.nist.gov/div898/handbook/prc/section3/prc33.htm (на даний момент на сторінці Вікіпедії не вказано прохідного прикладу).
wwwilliam

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

answer to my question can be found here: stats.stackexchange.com/questions/361015/…
Tanguy

11

In R the answer is calculated as:

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

8
Would you consider writing a little bit more than providing the R function? Naming the function does not help in understanding the problem and not everyone use R, so it would be no help for them.
Tim

1
This is the most exact statistical answer, and works for small numbers of observations (see the following: itl.nist.gov/div898/handbook/prc/section3/prc33.htm).
Andrew Mao


3

Just a summary:

Dan and Abaumann's answers suggest testing under a binomial model where the null hypothesis is a unified single binomial model with its mean estimated from the empirical data. Their answers are correct in theory but they need approximation using normal distribution since the distribution of test statistic does not exactly follow Normal distribution. Therefore, it's only correct for a large sample size.

But David's answer is indicating a nonparametric test using Fisher's test.The information is here: https://en.wikipedia.org/wiki/Fisher%27s_exact_test And it can be applied to small sample sizes but hard to calculate for big sample sizes.

Which test to use and how much you trust your p-value is a mystery. But there are always biases in whichever test to choose.


2
Are you trying to suggest that sample sizes in the thousands, with likely parameter values near 1/2, are not large for this purpose?
whuber

1
For this case, I think you could use Dan's method but compute the p value in an exact way (binomial) and approxiamte way (normal Z>Φ−1(1−α/2)Z>Φ−1(1−α/2) and Z<Φ−1(α/2) ) to compare whether they are close enough.
Dr_Hope

1

Your test statistic is Z=p1^p2^p^(1p^)(1/n1+1/n2), where p^=n1p1^+n2p2^n1+n2.

The critical regions are Z>Φ1(1α/2) and Z<Φ1(α/2) for the two-tailed test with the usual adjustments for a one-tailed test.


1

In Python, statsmodels has a function called proportions_ztest. Here is an example of its usage:

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))

This prints out:

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

-1

Original post: Dan's answer is actually incorrect, not to offend anyone. A z-test is used only if your data follows a standard normal distribution. In this case, your data follows a binomial distribution, therefore a use a chi-squared test if your sample is large or fisher's test if your sample is small.

Edit: My mistake, apologies to @Dan. A z-test is valid here if your variables are independent. If this assumption is not met or unknown, a z-test may be invalid.


3
The "only if" part is an extreme position unlikely to be shared by many. No data actually follow a normal distribution. Few data actually behave as if drawn randomly and independently from a normal distribution. Nevertheless, z tests continue to be effective because the distributions of statistics (such as the difference of means) to which they apply can be extremely well approximated by normal distributions. In fact, the appeal to a χ2 test relies on the same asymptotic assumptions as a z test does!
whuber

If you believe in the CLT, then the normal distribution does commonly exist.
Ryan

2
@Ryan Well, I believe in the CLT but it doesn't say anything about n=30 or n=300 or n=5000. You don't actually get normality unless you somehow manage to have infinite sample sizes, or you somehow started with normality. Questions about how close we are to normality when taking averages are not addressed by the CLT.. (We can consider those questions but we don't use the CLT to find out if the approximation is any good.)
Glen_b -Reinstate Monica
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.