Jak porównać ze sobą dwie próby?

testując tożsamość populacji przez repróbkowanie

Mając dane dwie próby losowe \(x_1, x_2 \ldots x_N\) oraz \(y_1, y_2 \ldots y_M\), możemy zbadać hipotezę o różnicy średnich. Jeśli okaże się, że średnie z obu prób różnią się istotnie, będzie to oznaczać, że próby nie pochodzą z tej samej populacji, a więc np. różnią się fizycznym parametrem.

Hipotezę zerową stanowi więc \(H_0: \mu_x = \mu_y\). Jako „przeciwieństwo” hipotezy zerowej \(H_0\) formułujemy hipotezę alternatywną \(H_1\), która może być przedstawiona na dwojaki sposób:

Dla testu jednostronnego warto od razu upewnić się, że zakładana nierówność \(\mu_x\) względem \(\mu_y\) ma taki sam znak, jak nierówność pomiędzy średnimi z prób \(\bar{x}\) i \(\bar{y}\). Jeżeli tak nie jest, to nie ma sensu prowadzić dalszych obliczeń — nie da się obalić hipotezy zerowej.

Ponieważ zgodnie z hipotezą zerową obie próby pochodzą z tej samej populacji, spróbujmy ją zamodelować. Całość informacji na temat tej populacji przedstawia połączona próba \(X\) i \(Y\).

POP = numpy.concatenate((X,Y))

Jako statystykę testową możemy wybrać po prostu różnicę średnich \(\Delta = \bar{x} - \bar{y}\), choć można też pokusić się o inną statystykę, np. pseudo t-Studenta. Z połączonej próby będziemy wielokrotnie losować syntetyczne próby \(X_s\) i \(Y_s\) o tych samych liczebnościach co „prawdziwe” \(X\) i \(Y\), oraz obliczać wartości statystyki testowej dla tych sztucznych danych.

Przy pomocy tak zdefiniowanej metody bootstrap obliczymy p-wartość, czyligdzie \(\Delta_0\) jest wartością statystyki testowej dla prawdziwych \(X\) i \(Y\).
ile_powtorzen = 10000

NX = len(X)
NY = len(Y)
# obliczamy wartość statystyki testowej dla prawdziwych danych
delta_0 = numpy.mean(X) - numpy.mean(Y)

licznik = 0
for i in xrange(ile_powtorzen) :
  # losujemy z POP bez zwracania NX liczb
  Xs = POP[numpy.random.randint(len(POP), size=NX)]
  # losujemy z POP bez zwracania NY liczb
  Ys = POP[numpy.random.randint(len(POP), size=NY)]

  # obliczamy wartość statystyki testowej dla wylosowanych danych
  delta = numpy.mean(Xs) - numpy.mean(Ys)
  # przykład dla testu dwustronnego
  if numpy.abs(delta) > numpy.abs(delta_0) :
    licznik += 1

p = float(licznik) / float(ile_powtorzen)

Ostatecznie, jeżeli \(p\lt\alpha\), możemy odrzucić \(H_0\) na korzyść \(H_1\).

autor: Piotr Różański, ostatnia modyfikacja: 10.04.2016