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, dieCensoredDataversteht, ist diefit-Methode. Eine Instanz vonCensoredDatakann nicht an Methoden wiepdfundcdfü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
CensoredDatadargestellt werden.Zur Bequemlichkeit werden die Klassenmethoden
left_censoredundright_censoredbereitgestellt, um eineCensoredData-Instanz aus einem einzelnen eindimensionalen Array von Messungen und einem entsprechenden booleschen Array zur Angabe, welche Messungen zensiert sind, zu erstellen. Die Klassenmethodeinterval_censoredakzeptiert 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.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
-infund die obere Grenzeinfsein, aber mindestens eine muss endlich sein. Wenn die untere Grenze-infist, repräsentiert die Zeile eine links-zensierte Beobachtung, und wenn die obere Grenzeinfist, 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 inintervaldargestellt 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_censoredverwenden, um eine Darstellung dieser Daten zu erstellen. Die Ausfallzeit-Beobachtungen werden in die Listettfeingegeben. Die Listecensoredgibt an, welche Werte inttfzensiert 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 vonCensoredDatazu 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_censoredverwendet werden, um dieCensoredData-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 dannweibull_minan 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 Methoderight_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_minan 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)