scipy.stats.

CensoredData#

class scipy.stats.CensoredData(uncensored=None, *, left=None, right=None, interval=None)[Quellcode]#

Instanzen dieser Klasse repräsentieren zensierte Daten.

Instanzen können an die fit-Methode von kontinuierlichen unimodalen SciPy-Verteilungen zur Maximum-Likelihood-Schätzung übergeben werden. Die **einzige** Methode der unimodalen kontinuierlichen Verteilungen, die CensoredData versteht, ist die fit-Methode. Eine Instanz von CensoredData kann nicht an Methoden wie pdf und cdf übergeben werden.

Eine Beobachtung wird als *zensiert* bezeichnet, wenn der genaue Wert unbekannt ist, aber eine bekannte obere und/oder untere Grenze hat. Die konventionelle Terminologie ist:

  • links-zensiert: Eine Beobachtung liegt unter einem bestimmten Wert, aber es ist unbekannt, um wie viel.

  • rechts-zensiert: Eine Beobachtung liegt über einem bestimmten Wert, aber es ist unbekannt, um wie viel.

  • intervall-zensiert: Eine Beobachtung liegt irgendwo in einem Intervall zwischen zwei Werten.

Links-, rechts- und interall-zensierte Daten können durch CensoredData dargestellt werden.

Zur Bequemlichkeit werden die Klassenmethoden left_censored und right_censored bereitgestellt, um eine CensoredData-Instanz aus einem einzelnen eindimensionalen Array von Messungen und einem entsprechenden booleschen Array zur Angabe, welche Messungen zensiert sind, zu erstellen. Die Klassenmethode interval_censored akzeptiert zwei eindimensionale Arrays, die die unteren und oberen Grenzen der Intervalle enthalten.

Parameter:
uncensoredarray_like, 1D

Nicht zensierte Beobachtungen.

leftarray_like, 1D

Links-zensierte Beobachtungen.

rightarray_like, 1D

Rechts-zensierte Beobachtungen.

intervalarray_like, 2D, with shape (m, 2)

Intervall-zensierte Beobachtungen. Jede Zeile interval[k, :] repräsentiert das Intervall für die k-te interall-zensierte Beobachtung.

Methoden

__len__()

Die Anzahl der Werte (zensiert und nicht zensiert).

interval_censored(low, high)

Erstellt eine CensoredData-Instanz von interall-zensierten Daten.

left_censored(x, censored)

Erstellt eine CensoredData-Instanz von links-zensierten Daten.

num_censored()

Anzahl der zensierten Werte.

right_censored(x, censored)

Erstellt eine CensoredData-Instanz von rechts-zensierten Daten.

Hinweise

Im Eingabearray interval kann die untere Grenze des Intervalls -inf und die obere Grenze inf sein, aber mindestens eine muss endlich sein. Wenn die untere Grenze -inf ist, repräsentiert die Zeile eine links-zensierte Beobachtung, und wenn die obere Grenze inf ist, repräsentiert die Zeile eine rechts-zensierte Beobachtung. Wenn die Länge eines Intervalls 0 ist (d. h. interval[k, 0] == interval[k, 1]), wird die Beobachtung als nicht zensiert behandelt. So können alle Arten von zensierten und nicht zensierten Daten in interval dargestellt werden, aber es ist im Allgemeinen bequemer, uncensored, left und right für nicht zensierte, links-zensierte bzw. rechts-zensierte Beobachtungen zu verwenden.

Beispiele

Im allgemeinsten Fall kann ein zensierter Datensatz Werte enthalten, die links-zensiert, rechts-zensiert, interall-zensiert und nicht zensiert sind. Hier erstellen wir beispielsweise einen Datensatz mit fünf Beobachtungen. Zwei sind nicht zensiert (Werte 1 und 1,5), eine ist links-zensiert mit dem Wert 0, eine ist rechts-zensiert mit dem Wert 10 und eine ist interall-zensiert im Intervall [2, 3].

>>> import numpy as np
>>> from scipy.stats import CensoredData
>>> data = CensoredData(uncensored=[1, 1.5], left=[0], right=[10],
...                     interval=[[2, 3]])
>>> print(data)
CensoredData(5 values: 2 not censored, 1 left-censored,
1 right-censored, 1 interval-censored)

Entsprechend:

>>> data = CensoredData(interval=[[1, 1],
...                               [1.5, 1.5],
...                               [-np.inf, 0],
...                               [10, np.inf],
...                               [2, 3]])
>>> print(data)
CensoredData(5 values: 2 not censored, 1 left-censored,
1 right-censored, 1 interval-censored)

Ein häufiger Fall ist eine Mischung aus nicht zensierten Beobachtungen und zensierten Beobachtungen, die alle rechts-zensiert (oder alle links-zensiert) sind. Betrachten Sie zum Beispiel ein Experiment, bei dem sechs Geräte zu verschiedenen Zeiten gestartet und bis zum Ausfall laufen gelassen werden. Nehmen wir an, die Zeit wird in Stunden gemessen, und das Experiment wird nach 30 Stunden beendet, auch wenn bis dahin nicht alle Geräte ausgefallen sind. Wir könnten zu Daten wie diesen gelangen:

Device  Start-time  Fail-time  Time-to-failure
   1         0         13           13
   2         2         24           22
   3         5         22           17
   4         8         23           15
   5        10        ***          >20
   6        12        ***          >18

Zwei der Geräte waren zum Zeitpunkt der Beendigung des Experiments nicht ausgefallen; die Beobachtungen der Ausfallzeiten dieser beiden Geräte sind rechts-zensiert. Wir können diese Daten darstellen mit:

>>> data = CensoredData(uncensored=[13, 22, 17, 15], right=[20, 18])
>>> print(data)
CensoredData(6 values: 4 not censored, 2 right-censored)

Alternativ können wir die Methode CensoredData.right_censored verwenden, um eine Darstellung dieser Daten zu erstellen. Die Ausfallzeit-Beobachtungen werden in die Liste ttf eingegeben. Die Liste censored gibt an, welche Werte in ttf zensiert sind.

>>> ttf = [13, 22, 17, 15, 20, 18]
>>> censored = [False, False, False, False, True, True]

Übergeben Sie diese Listen an CensoredData.right_censored, um eine Instanz von CensoredData zu erstellen.

>>> data = CensoredData.right_censored(ttf, censored)
>>> print(data)
CensoredData(6 values: 4 not censored, 2 right-censored)

Wenn die Eingabedaten interall-zensiert sind und bereits in zwei Arrays gespeichert sind, von denen eines die untere Grenze der Intervalle und das andere die obere Grenze enthält, kann die Klassenmethode interval_censored verwendet werden, um die CensoredData-Instanz zu erstellen.

Dieses Beispiel erstellt eine Instanz mit vier interall-zensierten Werten. Die Intervalle sind [10, 11], [0,5, 1], [2, 3] und [12,5, 13,5].

>>> a = [10, 0.5, 2, 12.5]  # Low ends of the intervals
>>> b = [11, 1.0, 3, 13.5]  # High ends of the intervals
>>> data = CensoredData.interval_censored(low=a, high=b)
>>> print(data)
CensoredData(4 values: 0 not censored, 4 interval-censored)

Schließlich erstellen und zensieren wir einige Daten aus der weibull_min-Verteilung und passen dann weibull_min an diese Daten an. Wir gehen davon aus, dass der Lageparameter bekanntermaßen 0 ist.

>>> from scipy.stats import weibull_min
>>> rng = np.random.default_rng()

Erstellen Sie den zufälligen Datensatz.

>>> x = weibull_min.rvs(2.5, loc=0, scale=30, size=250, random_state=rng)
>>> x[x > 40] = 40  # Right-censor values greater or equal to 40.

Erstellen Sie die CensoredData-Instanz mit der Methode right_censored. Die zensierten Werte sind diejenigen, bei denen der Wert 40 ist.

>>> data = CensoredData.right_censored(x, x == 40)
>>> print(data)
CensoredData(250 values: 215 not censored, 35 right-censored)

35 Werte wurden rechts-zensiert.

Passen Sie weibull_min an die zensierten Daten an. Wir erwarten, dass Form und Skalierung ungefähr 2,5 bzw. 30 betragen.

>>> weibull_min.fit(data, floc=0)
(2.3575922823897315, 0, 30.40650074451254)