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