我正在尝试使用python实现matlab代码。
在Matlab中,魏布尔分布的置信区间如下:
<div class="btn-margin">
<a class="btn btn-green" href="https://myneobuxportal.blogspot.com/p/answer-gamer-quiz-v2.html">
Click Here To See Answers
</a>
</div>
在scipy中,我找不到与wbllike函数等效的函数。似乎该功能未实现。相反,我尝试自己实现wblike函数。到目前为止,对数似然的负数很容易获得,如下所示:
CI = 0.95 %
p = [scale_hat shape_hat];
[nlogl,avar]=wbllike(p,y_ordered);
[qmid,qlo,qup]=wblinv(1-1/nCount,p(1),p(2),avar,1-CI);
我发现python中有statsmodels包,它提供了GeneralLikelyhoodModel。但不知道如何使事情正常进行。 我研究了一点http://rlhick.people.wm.edu/posts/estimating-custom-mle.html#statsmodels网站,但还是徒劳。
任何建议都会有所帮助。
答案 0 :(得分:0)
以下是我前一段时间写的笔记本的一部分。它的目标是审查Weibull回归,因此需要明确指定的exog,例如一堆。
它还包含一个针对logsf的变通方法,在我的旧scipy版本中不起作用。
def weibull_min_logsf(x, c, scale=1):
x = x / scale
return -np.power(x, c)
from statsmodels.base.model import GenericLikelihoodModel
class WeibullModel(GenericLikelihoodModel):
def __init__(self, endog, exog, censored=None, **kwds):
super(WeibullModel, self).__init__(endog, exog, **kwds)
if censored is not None:
self.censored = censored.astype(int)
else:
self.censored = np.zeros(len(self.endog), np.int)
self.k_params = self.exog.shape[1] + 1
def loglike(self, params):
params_ex = params[:-1]
params_shape = params[-1]
m = self.exog.dot(params_ex)
llf = (1 - self.censored) * stats.weibull_min.logpdf(self.endog, params_shape, scale=m)
#stats.weibull_min.logsf overflows in my older version of scipy, changed in newer versions
#llf2 = self.censored * stats.weibull_min.logsf(self.endog, params_shape, scale=m)
llf += self.censored * weibull_min_logsf(self.endog, params_shape, scale=m)
return llf.sum()
def _get_distribution(self, params, exog):
"""similar to a predict method
"""
params_ex = params[:-1]
params_shape = params[-1]
m = exog.dot(params_ex)
return stats.weibull_min(params_shape, scale=m)
mod = WeibullModel(data['duration'], np.ones(len(data)))
res = mod.fit(start_params=np.ones(2))
print(res.summary())