2017-03-09 14 views
3

t-testを実行するこの関数は、辞書と同じキーを使用するサンプルと集団で実行します。意図したとおりにうまく動作します。ブートストラップtメソッドPythonの実装

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) 

どのようにするために、この機能を変更することができます: - :

それはブートストラップでのようなものの線に沿ってX回それを行う、>の代わりに、一度、最終的な計算を行います

for _ in range(1000) 

- >前の手順では、キーごとにTテストの分布を作成し、結果[k]はn番目の百分位数の値になります。パラメータで指定して値0.05と言う。

編集#1: 明確にするために、私は関数を使用する方法は以下の通りである:そして

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

この辞書上の式を適用:

ttest_ = ttest_(pairs) 

編集#2 : 辞書の辞書にこの関数を適用するこの構造を維持して、differen t個のサンプルとキーを取得し、関連する結果[k]を得る。唯一の違いは、ブートストラップとパーセンタイルの選択を追加することです。

編集#3: ノーマン質問のおかげで。新しい公式では、同じ標本[k]を母集団[k]から抜粋したランダムなサブサンプル(x回)と比較すると、その分布が得られます。それらのサブサンプルは元のサンプル[k]のサイズである。

+1

私は「信頼できるソースから回答の図を探しています」........私は必ずしもその必要はありません。ちょうどよい完全な良い答え。ありがとう – hernanavella

+0

「キーごとにt検定の分布を作成する」方法は?ブートストラップは何回行うのですか?それは、サンプルからランダムなサブサンプルを引き出し、それらのt値を計算すべきか? – Norman

+0

@Normanしたがって、サンプルは常に(キーごとに)同じで、母集団から取り出されたサブサンプルと比較されます(x回)ので、xの異なるt値が得られます。 – hernanavella

答えて

1

これが正しく理解されていれば、これを行う必要があります。

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)) 
関連する問題