2017-03-09 85 views
3

我有这个功能来执行t-test,样本和人口在词典中使用相同的键。正如预期的那样,它运作良好。Bootstrap 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检测分布”?引导程序会做什么x次?是否应该从样本中抽取随机子样本,然后计算它们的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))