2017-02-01 15 views
1

Мое намерение состоит в том, чтобы код выполнял загрузку (статистику) по заданному списку с размером выборки, равным длине списка, 10000 раз, а затем вычислял 95% -ный доверительный интервал.Я создал класс для возврата доверительного интервала после начальной загрузки, но мой доверительный интервал выглядит странно узким. Что я сделал не так?

import numpy 
from random import choice 

class bootstrapping(object): 

    def __init__(self,bslist=[],iteration=10000): 
     self.bslist = bslist 
     self.iteration = iteration 

    def CI(self): 
     listofmeans = [] 

     for numbers in range(0,self.iteration): 
      bootstraplist = [choice(self.bslist) for _ in range(len(self.bslist))] 
      listofmeans.append(sum(bootstraplist)/len(bootstraplist)) 

     s = numpy.std(listofmeans) 
     z = 1.96 
     n = self.iteration**0.5 

     lower_confidence = (sum(listofmeans)/len(listofmeans)) - (z*s/n) 
     upper_confidence = (sum(listofmeans)/len(listofmeans)) + (z*s/n) 

     return lower_confidence,upper_confidence 

test = bootstrapping([60,33,102,53,63,33,42,19,31,86,15,50, 
         45,47,26,23,30,20,18,48,22,20,17,29,43,52,29],10000) 
test.CI() 

Доверительный интервал я получаю (37,897427638499948, +38,102572361500052), является странно узким. Когда я ввожу тот же список чисел в Minitab, 95% доверительный интервал, который я получаю, равен (30.74, 47.48). Что-то я сделал не так?

+0

Если вы не установили [random.seed()] (https://docs.python.org/2/library/random.html#random.seed), он даст разные варианты выполнения. Это не будет учитывать несоответствие, но стоит исправить его для будущего тестирования. – TemporalWolf

+0

@TemporalWolf Я не совсем уверен, что понимаю, что вы имеете в виду. Не могли бы вы рассказать немного дальше? –

+0

установка определенного случайного семени делает его таким, чтобы он предоставлял вам одинаковые варианты при каждом его запуске: он полезен для проверки того, работает ли алгоритм с известным входом. – TemporalWolf

ответ

2

Чтобы найти 95% -ный доверительный интервал, позвольте z = 1.96 (приблизительно) и вычислить интервал относительно среднего, плюс или минус z*std, где std - стандартное отклонение. Другими словами, используйте z*std не z*std/n:

import numpy as np 
import random 
random.seed(2017) 

class Bootstrapping(object): 

    def __init__(self,bslist=[],iteration=10000): 
     self.bslist = bslist 
     self.iteration = iteration 

    def CI(self): 
     listofmeans = [] 

     for numbers in range(0,self.iteration): 
      bootstraplist = [random.choice(self.bslist) for _ in range(len(self.bslist))] 
      mean = sum(bootstraplist)/len(bootstraplist) 
      listofmeans.append(mean) 

     mean = np.mean(listofmeans, axis=0) 
     std = np.std(listofmeans, axis=0) 
     z = 1.96 
     err = z*std 
     lower_confidence = mean - err 
     upper_confidence = mean + err 

     return lower_confidence, upper_confidence 

test = Bootstrapping([60,33,102,53,63,33,42,19,31,86,15,50, 
         45,47,26,23,30,20,18,48,22,20,17,29,43,52,29],10000) 
print(test.CI()) 

урожаи

(31.309540089458281, 46.876348799430602) 

В качестве альтернативы, можно вычислить доверительный интервал, не обращаясь к среднему значению +/- 1,96 * станд формулы. Вы можете получить эмпирическую оценку доверительного интервала с помощью сортировки listofmeans и нахождения значений на 5-й и 95-й процентиль:

import random 
random.seed(2017) 

class Bootstrapping(object): 

    def __init__(self,bslist=[],iteration=10000): 
     self.bslist = bslist 
     self.iteration = iteration 

    def CI(self): 
     listofmeans = [] 

     for numbers in range(0,self.iteration): 
      bootstraplist = [random.choice(self.bslist) for _ in range(len(self.bslist))] 
      mean = sum(bootstraplist)/len(bootstraplist) 
      listofmeans.append(mean) 

     listofmeans = sorted(listofmeans)  
     a, b = round(self.iteration*0.05), round(self.iteration*0.95) 
     lower_confidence = listofmeans[a] 
     upper_confidence = listofmeans[b] 

     return lower_confidence, upper_confidence 

test = Bootstrapping([60,33,102,53,63,33,42,19,31,86,15,50, 
         45,47,26,23,30,20,18,48,22,20,17,29,43,52,29],10000) 
print(test.CI()) 

дает

(32.888888888888886, 45.888888888888886) 
+0

Что делает random.seed()? –

+0

Это [«семена» генератора случайных чисел] (https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.seed.html), поэтому результат повторяется. – unutbu

+0

Я уверен, что доверительный интервал «mean + = z * stderror», где стандартная ошибка = (стандартное отклонение)/sqrt (n). Стандартная ошибка - это просто стандартное отклонение * выборки * распределения. –