我正在转换一些R代码(不是我的)来估计选择模型的参数到Python。我的Python版本没有收集到与某些测试数据的R版本相同的参数,我不知道为什么。
R代码定义对数似然函数(L),然后使用nlm()函数估计参数:
L <- function(p, y1, m, i1, i0)
-sum(dbinom(y1, m, 1/(1 + i0 %*% p/i1 %*% p), log=TRUE))
out <- nlm(L, s, y1=y1, m=n, i1=idx1, i0=idx0)
对于一组测试数据,这会产生参数估计值:
[1] 0.014302792 0.001703516 0.002347832 0.035365775 0.517465153 0.063503823 0.005776879
在python中我写了(我相信是)一个等效的对数似然函数(它返回与测试参数的R版本相同的值)并尝试使用scipy.optimize.minimize()代替nlm() :
def LL(p, *args):
y1=args[0]
m=args[1]
i1=args[2]
i0=args[3]
i0p=np.dot(i0,p)
i1p=np.dot(i1,p)
P=1/(1 + np.divide(i0p,i1p))
# y1 are observed successes in pairwise comparison experiment
# m the number of trials, P the probability of success in one trial.
# I'm fairly sure these inputs are the same in python and R versions
return -np.sum(stats.binom.logpmf(y1, m, P))
out = scipy.optimize.minimize(LL, s, args=(y1,n,idx1,idx0))
但是,在运行时,minimize()似乎不成功:
out:
status: 2
success: False
njev: 21
nfev: 201
hess_inv: array([[1, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 1, 0],
[0, 0, 0, 0, 0, 0, 1]])
fun: -273.75549396685
x: array([ 0.14285714, 0.14285714, 0.14285714, 0.14285714, 0.14285714,
0.14285714, 0.14285714])
message: 'Desired error not necessarily achieved due to precision loss.'
jac: array([ 27.99998093, -552.99998856, -500.49999237, 111.99997711,
671.99995422, 255.49996948, -14.00000381])
其他方法(例如'Powell')报告成功,但参数与R中的示例不同。
我的问题是:
在其他地方,我已经看到'由于精确丢失,未必实现所需的错误。'是一种表现不佳的可能性函数 - 任何人都可以告诉我这是这种情况吗?我该如何解决?
我应该尝试一些其他优化方法吗?它们需要将导数传递给minimize()方法 - 如何为LL函数定义渐变(如果必要的话,是粗体)?我看到了一个使用statsmodel GenericLikelihoodModel的例子,但对exog / endog感到困惑......