python-3.x 由累积风险函数值计算形状参数和尺度参数

z2acfund  于 2023-03-09  发布在  Python
关注(0)|答案(1)|浏览(223)

威布尔概率密度函数如下所示:

累积风险函数表示为:

现在,我有一个数据集,其中,tH 已知如下:

## Import libraries
from scipy.optimize import curve_fit
from scipy import stats
from scipy.optimize import minimize
import numpy as np
import matplotlib.pyplot as plt

## Load the dataset
t = np.array([4,        6,         8,       10])        ## Time data         
H = np.array([0.266919, 0.518181,  0.671102, 1.808351]) ## Cumulative Hazard

我希望找到上述数据集的形状参数(ρ)和尺度参数(λ)。
为了简化计算,我使用了下面的对数公式:

因此,时间向量和累积风险的对数可写成:

ln_t = np.log(t)   # log of time vector
ln_H = np.log(H)   # log of Cumulative Hazard

我采用了以下两种方法

方法-1:使用如下线性函数进行曲线拟合:

## Define a linear function
def ln_cum_hazard(LN_T, rho, myu):
    LN_H = rho * LN_T - myu
    return LN_H

## Model parameters
popt, pcov = curve_fit(ln_cum_hazard, ln_t, ln_H)

## Shape parameter
ρ = popt[0]
print("\n ρ (shape parameter) = \n", ρ)

## Scale parameter
λ = np.exp(popt[1]/popt[0])
print("\n λ (scale parameter) = \n", λ)

## Predicted values of H
H_pred = (t/λ)**ρ

## Plot H
plt.plot(t,H,'r',label = 'Actual Data')
plt.plot(t,H_pred,'b',label = 'Curve fit: scipy.optimize')
plt.legend()
plt.title('ρ = {} and λ = {}'.format(ρ,λ))
plt.xlabel('t')
plt.ylabel('H')
plt.show()

通过scipy.optimize进行曲线拟合,得到以下拟合曲线:

方法-2:通过stats.norm.logpdf()进行最大似然估计

## Define the linear function
def ln_cumulative_haz(params):
    rho = params[0]               # ρ (rho):    Shape parameter
    myu = params[1]               # λ (lambda): Scale parameter
    sd  = params[2]
      
    ## Linear function
    LN_H = rho * ln_t - myu

    ## Define the negative log likelihood function
    LL = -np.sum( stats.norm.logpdf(ln_H, loc = LN_H, scale=sd ) )

    return(LL)

## Inital parameters
initParams = [1, 1, 1]

## Minimize the negative log likelihood function
results = minimize(ln_cumulative_haz, initParams, method='Nelder-Mead')
  
## Model parameters
estParms = results.x

## Shape parameter
ρ = estParms[0]
print("\n ρ (shape parameter) = \n", ρ)

## Scale parameter
λ = np.exp(estParms[1]/estParms[0])
print("\n λ (scale parameter) = \n", λ)

## Predicted values of H
H_pred = (t/λ)**ρ

## Plot H
plt.plot(t,H,'r',label = 'Actual Data')
plt.plot(t,H_pred,'b',label = 'Curve fit: stats.norm.logpdf()')
plt.legend()
plt.title('ρ = {} and λ = {}'.format(ρ,λ))
plt.xlabel('t')
plt.ylabel('H')
plt.show()

通过stats.norm.logpdf()的MLE,我得到了以下曲线拟合:

两种方法对ρ(形状参数)和λ(尺度参数)的精度几乎相同。
现在我有以下3个疑问:
1.两种方法计算ρ和λ参数的程序是否正确?
1.为了定义负对数似然函数,我使用了“stats.norm.logpdf”。然而,数据的基本函数是两个参数的威布尔分布。这是正确的吗?
1.在Python中还有其他方法可以计算ρ和λ吗?
有人能帮我解开这些疑惑吗?

编辑-1:考虑scipy.stats.weibull_min

我应用下面的代码最小化负对数似然威布尔函数。

## Define the linear function
def ln_cumulative_haz_weibull(params):
    rho    = params[0]               # ρ (rho):    Shape parameter
    myu    = params[1]               # λ (lambda): Scale parameter
    shape  = params[2]
    sd     = params[3]
    
   

    ## Linear function
    LN_H = rho * ln_t - myu

    ## Calculate negative log likelihood
    LL = -np.sum( stats.weibull_min.logpdf(x = ln_H,
                                           c = shape,
                                           loc = LN_H,
                                           scale = sd ) )

    return(LL)

## Inital parameters
initParams = [1, 1, 1, 1]   ## params[i]

## Results of MLE
results = minimize(ln_cumulative_haz_weibull, initParams, method='Nelder-Mead')

## Model parameters
estParms = results.x

ρ = estParms[0]
print("\n ρ (shape parameter) = \n", ρ)

λ = np.exp(estParms[1]/estParms[0])
print("\n λ (scale parameter) = \n", λ)

##ln_H_pred = estParms[0] * ln_t - estParms[1]
##print("\n ln_H_pred = \n",ln_H_pred)

H_pred = (t/λ)**ρ
print("\n H_pred = ",H_pred)
## Plot ln(H)
plt.plot(t,H,'r',label = 'Actual Data')
plt.plot(t,H_pred,'b',label = 'Curve fit: stats.weibull_min.logpdf')
plt.legend()
plt.title('ρ = {} and λ = {}'.format(ρ,λ))
plt.xlabel('t')
plt.ylabel('H')
plt.show()

但是,使用stats.weibull_min.logpdf()的曲线拟合结果并不理想,如下所示:

我还收到一个错误,指出:
警告(来自警告模块):文件“C:\用户\用户\应用数据\本地\程序\Python\Python 37\库\站点包\脚本\优化\优化. py”,第597行numpy.max(numpy.abs(fsim[0] - fsim[1:]))〈= fatol):运行时警告:减法中遇到无效值
有没有人能帮帮我,我到底错在哪里?

6pp0gazn

6pp0gazn1#

我同意你的结论:
ρ(形状参数)= 1.914
λ(尺度参数)= 8.3568
拟合相当不错:

我不能说你画了什么。看看。

相关问题