scipy.stats.

CensoredData#

класс scipy.stats.CensoredData(uncensored=None, *, left=None, правый=None, интервал=None)[источник]#

Экземпляры этого класса представляют цензурированные данные.

Экземпляры могут передаваться в fit метод непрерывных одномерных распределений SciPy для оценки максимального правдоподобия. only метод одномерных непрерывных распределений, который понимает CensoredData является fit метод. Экземпляр CensoredData нельзя передавать методам, таким как pdf и cdf.

Наблюдение считается цензурированные когда точное значение неизвестно, но известна верхняя и/или нижняя граница. Обычная терминология такова:

  • левоцензурированные: наблюдение ниже определённого значения, но неизвестно, насколько.

  • право-цензурированные: наблюдение находится выше определенного значения, но неизвестно, насколько именно.

  • интервально-цензурированные: наблюдение лежит где-то в интервале между двумя значениями.

Лево-, право- и интервально-цензурированные данные могут быть представлены CensoredData.

Для удобства, методы класса left_censored и right_censored предоставляются для создания CensoredData экземпляр из одномерного массива измерений и соответствующего булева массива, указывающего, какие измерения являются цензурированными. Метод класса interval_censored принимает два одномерных массива, которые содержат нижнюю и верхнюю границы интервалов.

Параметры:
uncensoredarray_like, 1D

Нецензурированные наблюдения.

leftarray_like, 1D

Наблюдения с левым цензурированием.

правыйarray_like, 1D

Право-цензурированные наблюдения.

интервалarray_like, 2D, с формой (m, 2)

Интервально-цензурированные наблюдения. Каждая строка interval[k, :] представляет интервал для k-го интервально-цензурированного наблюдения.

Методы

__len__()

Количество значений (цензурированных и нецензурированных).

interval_censored(low, high)

Создать CensoredData экземпляр данных с интервальным цензурированием.

left_censored(x, censored)

Создать CensoredData экземпляр левоцензурированных данных.

num_censored()

Количество цензурированных значений.

right_censored(x, censored)

Создать CensoredData экземпляр данных с правосторонним цензурированием.

Примечания

Во входном массиве интервалнижняя граница интервала может быть -inf, и верхняя граница может быть inf, но хотя бы один должен быть конечным. Когда нижняя граница -inf, строка представляет собой лево- цензурированное наблюдение, а когда верхняя граница равна inf, строка представляет собой право-цензурированное наблюдение. Если длина интервала равна 0 (т.е. interval[k, 0] == interval[k, 1], наблюдение рассматривается как нецензурированное. Таким образом, можно представить все типы цензурированных и нецензурированных данных в interval, но обычно удобнее использовать uncensored, left и правый для нецензурированных, лево-цензурированных и право-цензурированных наблюдений соответственно.

Примеры

В самом общем случае набор цензурированных данных может содержать значения, которые являются левоцензурированными, правоцензурированными, интервально-цензурированными и нецензурированными. Например, здесь мы создаем набор данных с пятью наблюдениями. Два нецензурированы (значения 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. The 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.

Создать 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)