Bereken een betrouwbaarheidsinterval van voorbeeldgegevens

Ik heb voorbeeldgegevens waarvan ik graag een betrouwbaarheidsinterval wil berekenen voor, het uitgaande van een normale verdeling.

Ik heb de numpy- en scipy-pakketten gevonden en geïnstalleerd en hebben ze numpy gekregen om een ​​gemiddelde en standaarddeviatie te retourneren (Numpy MEAAN (gegevens) met gegevens die een lijst zijn). Elk advies over het krijgen van een voorbeeldvertrouweninterval zou zeer op prijs worden gesteld.


Antwoord 1, Autoriteit 100%

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

U kunt op deze manier berekenen.


Antwoord 2, Autoriteit 80%

Hier een verkorte versie van Shasan-code, het berekenen van het betrouwbaarheidsinterval van 95% van het gemiddelde van array 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))

Maar het gebruik van statsmodels ‘tconfint_meanis misschien wel nog mooier:

import statsmodels.stats.api as sms
sms.DescrStatsW(a).tconfint_mean()

De onderliggende aannames voor beide zijn dat de steekproef (array a) onafhankelijk is getrokken van een normale verdeling met onbekende standaarddeviatie (zie MathWorldof Wikipedia).

Voor grote steekproefomvang n is het steekproefgemiddelde normaal verdeeld en kan men het betrouwbaarheidsinterval berekenen met st.norm.interval()(zoals gesuggereerd in de opmerking van Jaime). Maar de bovenstaande oplossingen zijn ook correct voor kleine n, waar st.norm.interval()betrouwbaarheidsintervallen geeft die te smal zijn (d.w.z. “nep vertrouwen”). Zie mijn antwoordop een vergelijkbare vraag voor meer details (en een van de opmerkingen van Russ hier).

Hier een voorbeeld waarbij de juiste opties (in wezen) identieke betrouwbaarheidsintervallen geven:

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)

En tot slot, het onjuiste resultaat met st.norm.interval():

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

Antwoord 3, autoriteit 11%

Vanaf Python 3.8biedt de standaardbibliotheek de NormalDistobject als onderdeel van de statisticsmodule:

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

Dit:

  • Maakt een NormalDist-object van het gegevensvoorbeeld (NormalDist.from_samples(data), waarmee we toegang krijgen tot het gemiddelde en de standaarddeviatie van de steekproef via NormalDist.meanen NormalDist.stdev.

  • Bereken de Z-scoreop basis van de standaard normale verdeling (weergegeven door NormalDist()) voor het gegeven vertrouwen met behulp van de inverse van de cumulatieve verdelingsfunctie (inv_cdf).

  • Produceert het betrouwbaarheidsinterval op basis van de standaarddeviatie en het gemiddelde van de steekproef.


Hierbij wordt ervan uitgegaan dat de steekproefomvang groot genoeg is (laten we zeggen meer dan ~100 punten) om de standaard normale verdeling te gebruiken in plaats van de t-verdeling van de leerling om de z-waarde te berekenen.


Antwoord 4, autoriteit 8%

Begin met het opzoeken van de z-waardevoor uw gewenste betrouwbaarheidsinterval van een opzoektabel. Het betrouwbaarheidsinterval is dan mean +/- z*sigma, waarbij sigmade geschatte standaarddeviatie is van uw steekproefgemiddelde, gegeven door sigma = s / sqrt(n), waarbij sde standaarddeviatie is die is berekend op basis van uw steekproefgegevens en nuw steekproefomvang is.


Antwoord 5

Een betrouwbaarheidsinterval geeft boven- en ondergrenzen aan het bereik van parameterwaarden die u zou verwachten als we onze metingen herhalen. Voor benoemde distributies kun je ze analytisch berekenen of opzoeken, maar een van de vele mooie eigenschappen van de bootstrap-methode is dat je percentielen van je bootstrap-replica’s kunt nemen om je betrouwbaarheidsinterval te krijgen. Handig is dat je de functie np.percentile() kunt gebruiken.

Gebruik de bootstrap-replicaties die u zojuist heeft gegenereerd om het 95%-betrouwbaarheidsinterval te berekenen. Dat wil zeggen, geef het 2,5e en 97,5e percentiel van uw bootstrap-replica’s die zijn opgeslagen als bs_replicates.

”’python

confidence_interval = np.percentile(bs_replicates,[2.5,97.5])

”’

Other episodes