Обчисліть довірчий інтервал із вибіркових даних


109

У мене є вибіркові дані, для яких я б хотів обчислити довірчий інтервал, припускаючи нормальний розподіл.

Я знайшов і встановив пакети numpy та scipy і отримав numpy для повернення середнього та стандартного відхилень (numpy.mean (дані), дані мають список). Будь-яка порада щодо отримання вибіркового інтервалу довіри буде дуже вдячна.


1
я думаю, ви точно вказали, чи хочете ви обчислити ІС для вибіркової середньої чи середньої сукупності. Це визначає, чи потрібно використовувати звичайний або t розподіл для обчислення z-балу. А нижня відповідь - середнє значення вибірки, тому при розподілі використовується.
Джейк

Відповіді:


162
import numpy as np
import scipy.stats


def mean_confidence_interval(data, confidence=0.95):
    a = 1.0 * np.array(data)
    n = len(a)
    m, se = np.mean(a), scipy.stats.sem(a)
    h = se * scipy.stats.t.ppf((1 + confidence) / 2., n-1)
    return m, m-h, m+h

ви можете розрахувати так.


1
sp.stats.stderr застаріло. Я підмінив sp.stats.sem, і він спрацював чудово!
Bmayer0122

1
Імпорт scipyне обов'язково імпортує всі підпакети автоматично. Краще імпортувати підпакет scipy.statsявно.
Вікрам

31
Обережно з "приватним" використанням sp.stats.t._ppf. Мені це не так комфортно без додаткових пояснень. Краще використовувати sp.stats.t.ppfбезпосередньо, якщо ви не впевнені, що знаєте, що робите. При швидкому огляді джерела існує достатня кількість пропущеного коду _ppf. Можливо, доброякісна, але також, можливо, небезпечна спроба оптимізації?
Русь

Мені це подобається, тому що ви можете просто додати *ss.t._ppf((1+conf)/2.,n-1) до вбудованого .semметоду фрейму даних панди, тому вам не доведеться хвилюватисяapply
TNT

1
Просто хочу уточнити, що цей розрахунок є середнім для вибірки, тому при розподілі використовується. Якщо питання стосуються підрахунку середньої сукупності, слід використовувати нормальний розподіл і впевнений інтервал буде меншим для того ж рівня довіри.
Джейк

133

Ось скорочена версія коду шасана, що обчислює 95% довірчий інтервал середнього масиву a:

import numpy as np, scipy.stats as st

st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))

Але використовувати StatsModels ' tconfint_mean, можливо, навіть приємніше:

import statsmodels.stats.api as sms

sms.DescrStatsW(a).tconfint_mean()

Основне припущення для обох полягає в тому, що вибірку (масив a) було взято незалежно від звичайного розподілу з невідомим стандартним відхиленням (див. MathWorld або Wikipedia ).

Для великого розміру вибірки n середня вибірка зазвичай розподіляється, і можна обчислити її довірчий інтервал, використовуючи st.norm.interval()(як це запропоновано в коментарі Хайме). Але наведені вище рішення є правильними і для малих n, де st.norm.interval()даються довірчі інтервали, які занадто вузькі (тобто "фальшива впевненість"). Дивіться мою відповідь на подібне запитання для більш детальної інформації (і один із коментарів Русса тут).

Ось приклад, коли правильні параметри дають (по суті) однакові інтервали довіри:

In [9]: a = range(10,14)

In [10]: mean_confidence_interval(a)
Out[10]: (11.5, 9.4457397432391215, 13.554260256760879)

In [11]: st.t.interval(0.95, len(a)-1, loc=np.mean(a), scale=st.sem(a))
Out[11]: (9.4457397432391215, 13.554260256760879)

In [12]: sms.DescrStatsW(a).tconfint_mean()
Out[12]: (9.4457397432391197, 13.55426025676088)

І нарешті, неправильний результат із використанням st.norm.interval():

In [13]: st.norm.interval(0.95, loc=np.mean(a), scale=st.sem(a))
Out[13]: (10.23484868811834, 12.76515131188166)

1
Я вважаю, що вам слід зателефонувати, st.t.interval(0.05)щоб отримати 95% довірчий інтервал.
Scimonster

5
Ні, st.t.interval(0.95)це правильно для 95% довірчого інтервалу, дивіться документи для scipy.stats.t. Хоча іменування аргументу SciPy alphaздається менш ідеальним.
Ульріх Стерн

Якщо у мене є два масиви даних, а потім обчислюється різниця їх середнього. Чи є спосіб отримати 95% ІС за цієї середньої різниці? Чи можете ви придумати будь-який простий спосіб зробити це, як той, який ви надаєте тут, використовуючи StatsModelsl?
Стівен

@steven, виявляється, я відповів на запитання з цього приводу. :)
Ульріх Штерн

16

Почніть з пошуку z-значення для бажаного інтервалу довіри з оглядової таблиці . Тоді довірчий інтервал - це mean +/- z*sigmaде sigmaсереднє оцінене середнє відхилення вашої вибірки, задане значенням sigma = s / sqrt(n), де sстандартне відхилення, обчислене з ваших даних вибірки, і nрозмір вибірки.


29
scipy.stats.norm.interval(confidence, loc=mean, scale=sigma)
Хайме

4
Первісний запитувач вказав, що слід припустити нормальний розподіл, але варто зазначити, що для невеликих вибіркових сукупностей (N <100 або більше) краще шукати z в розподілі Ст Ст, а не в нормальному розподілі . Відповідь шазана вже робить це.
Русь

3
@bogatron, щодо запропонованого обчислення для довірчого інтервалу, це не буде означати +/- z * sigma / sqrt (n) , де n - розмір вибірки?
Девід

3
@David, ти маєш рацію. Я неправильно змістив значення sigma. sigmaу моїй відповіді має бути оцінене середнє відхилення середнього зразка, а не оцінене стандартне відхилення розподілу. Я оновив відповідь, щоб уточнити це. Дякуємо, що вказали на це.
богатрон

15

Починаючи Python 3.8, стандартна бібліотека забезпечує NormalDistоб'єкт як частину statisticsмодуля:

from statistics import NormalDist

def confidence_interval(data, confidence=0.95):
  dist = NormalDist.from_samples(data)
  z = NormalDist().inv_cdf((1 + confidence) / 2.)
  h = dist.stdev * z / ((len(data) - 1) ** .5)
  return dist.mean - h, dist.mean + h

Це:

  • Створює NormalDistоб’єкт із вибірки даних ( NormalDist.from_samples(data)що дає нам доступ до середнього та стандартного відхилення вибірки через NormalDist.meanі NormalDist.stdev.

  • Обчисліть на Z-scoreоснові стандартного нормального розподілу (представленого NormalDist()) для заданої достовірності, використовуючи зворотну функцію кумулятивного розподілу ( inv_cdf).

  • Виробляє довірчий інтервал на основі стандартного відхилення вибірки та середнього значення.


Це передбачає, що розмір вибірки є досить великим (скажімо, більше ~ 100 балів), щоб використовувати стандартний нормальний розподіл, а не розподіл учня для обчислення zзначення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.