scipy.stats.

CensoredData#

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

此類別的實例代表設限資料。

實例可以傳遞給 SciPy 連續單變數分佈的 fit 方法,以進行最大概似估計。唯一理解 CensoredData 的單變數連續分佈方法是 fit 方法。CensoredData 的實例不能傳遞給諸如 pdfcdf 等方法。

當無法得知精確值,但已知其上限和/或下限時,則稱觀測值為設限。傳統術語為:

  • 左設限:觀測值低於特定值,但未知低多少。

  • 右設限:觀測值高於特定值,但未知高多少。

  • 區間設限:觀測值落在兩個值之間的區間中的某處。

左設限、右設限和區間設限資料可以使用 CensoredData 表示。

為了方便起見,提供了類別方法 left_censoredright_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 表示所有類型的設限和未設限資料,但通常使用 uncensoredleftright 分別表示未設限、左設限和右設限的觀測值更方便。

範例

在最一般的情況下,設限資料集可能包含左設限、右設限、區間設限和未設限的值。例如,在這裡我們建立一個包含五個觀測值的資料集。其中兩個是未設限的(值為 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 實例。

num_censored()

設限值的數量。

right_censored(x, censored)

建立右設限資料的 CensoredData 實例。