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экземпляр левоцензурированных данных.Количество цензурированных значений.
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. Thecensoredсписок указывает, какие значения в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)