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 小时后未发生故障,实验也会在 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 实例。