scipy.stats.

CensoredData#

scipy.stats.CensoredData(未截尾=, *, =, =, 区间=)[源代码]#

此类的实例表示截尾数据。

可以将实例传递给连续单变量 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, with shape (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 中哪些值为审查。p>

>>> 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.

使用 CensoredData 实例创建 right_censored 方法。受限的值是值等于 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 实例。