CensoredData#
- class scipy.stats.CensoredData(uncensored=None, *, left=None, right=None, interval=None)[原始碼]#
此類別的實例代表設限資料。
實例可以傳遞給 SciPy 連續單變數分佈的
fit
方法,以進行最大概似估計。唯一理解CensoredData
的單變數連續分佈方法是fit
方法。CensoredData
的實例不能傳遞給諸如pdf
和cdf
等方法。當無法得知精確值,但已知其上限和/或下限時,則稱觀測值為設限。傳統術語為:
左設限:觀測值低於特定值,但未知低多少。
右設限:觀測值高於特定值,但未知高多少。
區間設限:觀測值落在兩個值之間的區間中的某處。
左設限、右設限和區間設限資料可以使用
CensoredData
表示。為了方便起見,提供了類別方法
left_censored
和right_censored
,可從單個一維測量陣列和相應的布林陣列建立CensoredData
實例,以指示哪些測量值是設限的。類別方法interval_censored
接受兩個一維陣列,其中包含區間的下限和上限。- 參數:
- uncensoredarray_like,1D
未設限的觀測值。
- leftarray_like,1D
左設限的觀測值。
- rightarray_like,1D
右設限的觀測值。
- intervalarray_like,2D,形狀為 (m, 2)
區間設限的觀測值。每一列
interval[k, :]
代表第 k 個區間設限觀測值的區間。
註解
在輸入陣列 interval 中,區間的下限可以是
-inf
,上限可以是inf
,但至少必須有一個是有限的。當下限為-inf
時,該列代表左設限觀測值;當上限為inf
時,該列代表右設限觀測值。如果區間長度為 0(即interval[k, 0] == interval[k, 1]
),則該觀測值被視為未設限。因此,可以使用interval
表示所有類型的設限和未設限資料,但通常使用 uncensored、left 和 right 分別表示未設限、左設限和右設限的觀測值更方便。範例
在最一般的情況下,設限資料集可能包含左設限、右設限、區間設限和未設限的值。例如,在這裡我們建立一個包含五個觀測值的資料集。其中兩個是未設限的(值為 1 和 1.5),一個是左設限的觀測值 0,一個是右設限的觀測值 10,另一個是區間設限的,區間為 [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)
等效地,
>>> 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)
常見的情況是混合使用未設限的觀測值和所有右設限(或所有左設限)的設限觀測值。例如,考慮一個實驗,其中六個裝置在不同時間啟動並持續運轉直到故障。假設時間以小時為單位測量,並且實驗在 30 小時後停止,即使並非所有裝置在那時都已故障。我們最終可能會得到如下資料:
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
當實驗停止時,其中兩個裝置尚未故障;這兩個裝置的故障時間觀測值是右設限的。我們可以使用以下方式表示此資料:
>>> data = CensoredData(uncensored=[13, 22, 17, 15], right=[20, 18]) >>> print(data) CensoredData(6 values: 4 not censored, 2 right-censored)
或者,我們可以使用方法
CensoredData.right_censored
來建立此資料的表示法。故障時間觀測值放入列表ttf
中。censored
列表指示ttf
中的哪些值是設限的。>>> ttf = [13, 22, 17, 15, 20, 18] >>> censored = [False, False, False, False, True, True]
將這些列表傳遞給
CensoredData.right_censored
以建立CensoredData
的實例。>>> data = CensoredData.right_censored(ttf, censored) >>> print(data) CensoredData(6 values: 4 not censored, 2 right-censored)
如果輸入資料是區間設限的,並且已經儲存在兩個陣列中,一個陣列保存區間的下限,另一個陣列保存區間的上限,則可以使用類別方法
interval_censored
來建立CensoredData
實例。此範例建立一個包含四個區間設限值的實例。這些區間為 [10, 11]、[0.5, 1]、[2, 3] 和 [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)
最後,我們從
weibull_min
分佈建立和設限一些資料,然後將weibull_min
擬合到該資料。我們假設位置參數已知為 0。>>> from scipy.stats import weibull_min >>> rng = np.random.default_rng()
建立隨機資料集。
>>> 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.
使用
right_censored
方法建立CensoredData
實例。設限值是值為 40 的那些。>>> data = CensoredData.right_censored(x, x == 40) >>> print(data) CensoredData(250 values: 215 not censored, 35 right-censored)
已右設限 35 個值。
將
weibull_min
擬合到設限資料。我們預期形狀和尺度分別約為 2.5 和 30。>>> weibull_min.fit(data, floc=0) (2.3575922823897315, 0, 30.40650074451254)
方法
__len__
()值的數量(設限和未設限)。
interval_censored
(low, high)建立區間設限資料的
CensoredData
實例。left_censored
(x, censored)建立左設限資料的
CensoredData
實例。設限值的數量。
right_censored
(x, censored)建立右設限資料的
CensoredData
實例。