scipy.stats.weibull_min.fit() - 如何处理右删失数据?

时间:2017-12-14 04:33:03

标签: python python-3.x scipy statistics weibull

非截尾(完整)数据集

我正在尝试使用scipy.stats.weibull_min.fit()函数来拟合一些生命数据。示例生成的数据包含在values下面。

values = np.array(
    [10197.8, 3349.0, 15318.6, 142.6, 20683.2, 
    6976.5, 2590.7, 11351.7, 10177.0, 3738.4]
)

我尝试使用该功能:

fit = scipy.stats.weibull_min.fit(values, loc=0)

结果:

(1.3392877335100251, -277.75467055900197, 9443.6312323849124)

与名义beta和eta值相差不远1.4和10000。

右删失数据

威布尔分布因其处理右删失数据的能力而众所周知。这使其对可靠性分析非常有用。如何在scipy.stats内处理正确删除的数据?也就是说,曲线拟合尚未出现故障的数据呢?

输入表单可能如下所示:

values = np.array(
    [10197.8, 3349.0, 15318.6, 142.6, np.inf, 
    6976.5, 2590.7, 11351.7, 10177.0, 3738.4]
)

或者可能使用np.nan或仅使用0

两个np解决方案都在抛出RunTimeWarning,并且绝对不会接近正确的值。我使用数值 - 例如0-1 - 删除RunTimeWarning,但返回的参数显然存在缺陷。

其他软件

在某些可靠性或生命周期分析软件(minitablifelines)中,必须有两列数据,一列用于实际数字,另一列用于指示项目是否已失败然而。例如:

values = np.array(
    [10197.8, 3349.0, 15318.6, 142.6, 0, 
    6976.5, 2590.7, 11351.7, 10177.0, 3738.4]
)

censored = np.array(
    [True, True, True, True, False,
    True, True, True, True, True]
)

我在文档中看不到这样的路径。

1 个答案:

答案 0 :(得分:1)

老问题,但如果有人遇到这个问题,有一个新的 Python 生存分析包 surpyval 可以处理这个问题,以及其他审查和截断的情况。对于您在上面提供的示例,它只是:

import surpyval as surv
values = np.array([10197.8, 3349.0, 15318.6, 142.6, 6976.5, 2590.7, 11351.7, 10177.0, 3738.4])

# 0 = failed, 1 = right censored
censored = np.array([0, 0, 0, 0, 0, 1, 1, 1, 0])

model = surv.Weibull.fit(values, c=censored)
print(model.params)

(10584.005910580288, 1.038163987652635)

您可能还对威布尔图感兴趣:

model.plot(plot_bounds=False)

Weibull plot

完全公开,我是surpyval的创造者