威布尔概率密度函数如下所示:
累积风险函数表示为:
现在,我有一个数据集,其中,t 和 H 已知如下:
## 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):运行时警告:减法中遇到无效值
有没有人能帮帮我,我到底错在哪里?
1条答案
按热度按时间6pp0gazn1#
我同意你的结论:
ρ(形状参数)= 1.914
λ(尺度参数)= 8.3568
拟合相当不错:
我不能说你画了什么。看看。