2017-03-09 1 views
3

Ich habe diese Funktion, um eine t-test durchzuführen, mit Stichproben und Populationen mit dem gleichen Schlüssel in Wörterbüchern. Es funktioniert gut, wie vorgesehen.Bootstrap t Methode Python-Implementierung

def ttest_(d): 
    result = {} 
    for k, (l, t) in d.items(): 
     mean_sample = np.mean(t) 
     mean_population = np.mean(l) 
     sd_sample = np.std(t, ddof=1) 
     sd_population = np.std(l, ddof=1) 
     sample_size = len(t) 
     population_size = len(l) 
     result[k] = round(((mean_sample - mean_population)/
           np.sqrt(((sd_sample/np.sqrt(sample_size))**2) + 
             ((sd_population/np.sqrt(population_size))**2))), 2) 

Wie kann ich diese Funktion modifizieren, um:

-> Statt einmal die endgültige Berechnung tun, tun Sie es in einer Bootstrap-x-mal entlang der Linien von so etwas wie:

for _ in range(1000) 

-> Der vorherige Schritt, würde eine Verteilung von T-Tests pro Schlüssel erstellen, dann wäre das Ergebnis [k] der n-ten Perzentilwert .... den Sie mit einem Parameter angeben und einen Wert angeben könnten sage 0,05.

Edit # 1: Aus Gründen der Klarheit der Weg I die Funktion ist die folgende:

pairs = {} 
for (k, v), (k2, v2) in product(population.items(), samples.items()): 
    if k == k2: 
     pairs.update({k: (v, v2)}) 

dann die Formel auf dieser dict angewendet:

ttest_ = ttest_(pairs) 

Edit # 2 : ist wichtig, um diese Struktur der Anwendung der Funktion auf ein Wörterbuch von Wörterbüchern zu erhalten, um die Assoziationen zwischen den verschiedenen zu machen t Samples und Schlüssel, und erhalten das zugehörige Ergebnis [k]. Der einzige Unterschied besteht im Hinzufügen eines Bootstrap und der Perzentilauswahl.

Bearbeiten # 3: Dank Norman Frage. Um dies zu verdeutlichen, vergleichen Sie in der neuen Formel das gleiche Sample [k] mit einer zufälligen Sub-Stichprobe aus der Population [k], x-mal, so erhalten Sie die Verteilung. Diese Unterstichproben haben die Größe der ursprünglichen Stichprobe [k].

+1

Ich konnte die 'Suche nach einer Antwort Zeichnung aus glaubwürdigen Quellen' nicht ändern ........ Ich will das nicht unbedingt. Nur eine gute vollständige gute Antwort. Danke – hernanavella

+0

Wie "eine Verteilung von T-Tests pro Schlüssel erstellen"? Was würde der Bootstrap x mal machen? Sollte es zufällige Unterstichproben aus der Stichprobe ziehen und dann T-Werte für sie berechnen? – Norman

+0

@Norman So ist das Beispiel immer gleich (pro Schlüssel), und es wird verglichen mit Sub-Stichproben, die aus der Population x-mal gezogen werden, so dass Sie x verschiedene t-Werte erhalten. – hernanavella

Antwort

1

Dies sollte es tun, wenn ich richtig verstanden habe.

from itertools import product 
import numpy as np 


# Generate fake data. 
keys = np.arange(100, 130) 
populations = {} 
samples = {} 
for k in keys: 
    loc = np.random.uniform(-9.0, +9.0) 
    scale = np.random.uniform(0.4, 4.0) 
    n = np.random.randint(400, 800) 
    m = np.random.randint(20, 100) 
    populations[k] = np.random.normal(loc, scale, n) 
    samples[k] = np.random.choice(populations[k], m, replace=False) 
    print('data: key={} pop={} samp={}'.format(k, len(populations[k]), len(samples[k]))) 


def ttest_(d, p, n=1000): 
    result = {} 
    percentiles = (np.arange(n) + 0.5)/n 
    for k, (pop, sample) in d.items(): 
     size_sample = len(sample) 
     mean_sample = np.mean(sample) 
     sd_sample = np.std(sample, ddof=1) 

     # Generate a distribution of t values. 
     tvalues = np.zeros(n) 
     for i in range(n): 
      sample2 = np.random.choice(pop, size=size_sample, replace=True) 
      size_sample2 = len(sample2) 
      mean_sample2 = np.mean(sample2) 
      sd_sample2 = np.std(sample2, ddof=1) 
      # Welch's t-test for sample and sample2. 
      tvalues[i] = (mean_sample - mean_sample2)/\ 
         np.sqrt((sd_sample/np.sqrt(size_sample))**2 + 
           (sd_sample2/np.sqrt(size_sample2))**2) 
     # Interpolate the quantile function at p. 
     tvalues.sort() 
     result[k] = round(np.interp(p, percentiles, tvalues), 2) 
    return result 


pairs = {} 
for (k, v), (k2, v2) in product(populations.items(), samples.items()): 
    if k == k2: 
     pairs[k] = (v, v2) 

result = ttest_(pairs, p=0.5) 
for k, v in result.items(): 
    print('result: key={} t={}'.format(k, v)) 
Verwandte Themen