我有一个具有三个参数的模型,即:beta > 0、gamma > 0 和 phi > 0。给定数据 T,我能够评估 3 个参数的 MLE。
但是,我还要验证 (i) gamma = 1; 的情况,这一点非常重要。(ii) beta = 1 和 (iii) gamma = 1,beta = 1。
因此,我希望能够在情况 (i)、(ii) 和 (iii) 下评估 MLE。
我确信有一种方法可以轻松评估它,而无需在 StatsModels 中为 GenericLikelihoodModel 编写 4 个不同的类,但我就是想不通。
我用于具有 3 个参数的通用模型的代码如下,它运行良好,因为我正在使用本文中的数据来验证实现。
import math
import numpy
from statsmodels.base.model import GenericLikelihoodModel
def log_likelihood_WPLP(T, beta, gamma, phi):
n = len(T) - 1
ret = n * (numpy.log(phi) + numpy.log(beta) + numpy.log(gamma)) + \
(beta - 1) * numpy.log(T[1]) + (gamma - 1) * numpy.log( T[1] ** beta) - phi * T[1] ** (beta * gamma) + \
sum([(beta - 1) * numpy.log(T[i]) + (gamma - 1) * numpy.log(T[i] ** beta - T[i-1] ** beta) - \
phi * (T[i] ** beta - T[i-1] ** beta) ** gamma for i in range(2, n+1)])
return ret
class WeibullPowerLawTRP(GenericLikelihoodModel):
def __init__(self, endog, exog=None, **kwds):
if exog is None:
exog = numpy.zeros_like(endog)
super(WeibullPowerLawTRP, self).__init__(endog, exog, **kwds)
def nloglikeobs(self, params):
beta, gamma, phi = numpy.exp(params[0]), numpy.exp(params[1]), numpy.exp(params[2])
return -log_likelihood_WPLP(self.endog, beta=beta, gamma=gamma, phi=phi)
def fit(self, start_params=None, maxiter=10000, maxfun=5000, **kwds):
if start_params is None:
start_params = numpy.array([-.5, -.5, -.5])
return super(WeibullPowerLawTRP, self).fit(start_params=start_params,
maxiter=maxiter, maxfun=maxfun, **kwds)
T = [ 0, 1, 4, 305, 330, 651, 856, 996, 1016, 1155, 1520, 1597,
1729, 1758, 1852, 2070, 2073, 2093, 2213, 3197, 3555, 3558, 3724, 3768,
4103, 4124, 4170, 4270, 4336, 4416, 4492, 4534, 4578, 4762, 5474, 5573,
5577, 5715, 6424, 6692, 6830, 6999]
model = WeibullPowerLawTRP(T, model='WPLP')
result = model.fit()
print(result.summary())
beta, gamma, phi = numpy.exp(result.params)
alpha = phi ** (1/gamma) / (math.gamma(1+1/gamma))
print(f"α = {alpha:.4f}\n"
f"β = {beta:.4f}\n"
f"γ = {gamma:.4f}\n")
提前致谢!干杯,亚历山大