如何在python / scipy中优化二项式对数似然的参数?

时间:2014-03-07 15:47:16

标签: python r scipy statsmodels mle

我正在转换一些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中的示例不同。

我的问题是:

  1. 在其他地方,我已经看到'由于精确丢失,未必实现所需的错误。'是一种表现不佳的可能性函数 - 任何人都可以告诉我这是这种情况吗?我该如何解决?

  2. 我应该尝试一些其他优化方法吗?它们需要将导数传递给minimize()方法 - 如何为LL函数定义渐变(如果必要的话,是粗体)?我看到了一个使用statsmodel GenericLikelihoodModel的例子,但对exog / endog感到困惑......

0 个答案:

没有答案