CensoredData#
- class scipy.stats.CensoredData(uncensored=None, *, left=None, right=None, interval=None)[source]#
这个类的实例表示删失数据。
实例可以传递给连续单变量 SciPy 分布的
fit
方法,以进行最大似然估计。单变量连续分布中唯一理解CensoredData
的方法是fit
方法。CensoredData
的实例不能传递给诸如pdf
和cdf
等方法。当无法得知精确值,但已知其上限和/或下限时,则称观测值是删失的。 传统的术语是
左删失:观测值低于某个值,但不知道低多少。
右删失:观测值高于某个值,但不知道高多少。
区间删失:观测值位于两个值之间的某个区间内。
左删失、右删失和区间删失的数据可以用
CensoredData
表示。为了方便起见,提供了类方法
left_censored
和right_censored
,以从单个一维测量数组和相应的布尔数组创建CensoredData
实例,以指示哪些测量值是被删失的。类方法interval_censored
接受两个一维数组,它们保存区间的下限和上限。- 参数:
- uncensored类数组,1D
未删失的观测值。
- left类数组,1D
左删失的观测值。
- right类数组,1D
右删失的观测值。
- interval类数组,2D,形状为 (m, 2)
区间删失的观测值。每行
interval[k, :]
表示第 k 个区间删失的观测值的区间。
方法
__len__
()值的数量(删失的和未删失的)。
interval_censored
(low, high)创建区间删失数据的
CensoredData
实例。left_censored
(x, censored)创建左删失数据的
CensoredData
实例。已删失值的数量。
right_censored
(x, censored)创建右删失数据的
CensoredData
实例。注释
在输入数组 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)