如何在对数似然函数中添加约束?

时间:2018-11-27 08:14:39

标签: r optimization mle log-likelihood

我有一个时间序列模型(INGARCH):

lambda_t = alpha0 + alpha1*(x_(t-1)) + beta1*(lambda_(t-1))

X_t ~ poisson (lambda_t)

其中t是观测值或数据的长度,alpha0,alpha1和beta1是参数。

X_t是数据序列,lambda_t是均值序列。

此模型的条件为alpha1 + beta1 < 1

据我估计,我想在代码中添加alpha1 + beta1 < 1的条件,在对数似然函数中添加一个while循环,但是该循环无法停止。

我该怎么做才能解决这个问题?是否有其他方法可以在不使用while循环的情况下添加约束alpha1 + beta1 < 1

下面是我的代码:

ll <- function(par) {
  h.new  = rep(0,n)
  #par[1] is alpha0 
  #par[2] is alpha1
  #par[3] is beta1
  while(par[2] + par[3] < 1){
  for (i in 2:n) {
    h.new[i] <- par[1] + par[2] * dat[i-1] + par[3] * h.new[i-1]

  }
  -sum(dpois(dat, h.new, log=TRUE))
  }
}

#simply generate a dataset as I have not found a suitable real dataset to fit in
set.seed(77)
n=400
dat <- rpois(n,36)

nlminb(start = c(0.1,0.1,0.1), lower = 1e-6, ll)

1 个答案:

答案 0 :(得分:1)

您暂时不更改par。尤其是,如果您同时打印了par[1]par[2],将会发现您无休止地打印了原始值0.1,因此您永远都陷在while中。 / p>

par是来自nlminb的每个调用中的单个不变对象。您只需要确保par不好,就返回非最小的值,因此nlminb不会继续朝该方向搜索:

ll <- function(par) {       
    #If alpha + beta > 1, this is terrible and return an infinite score
    #It may be better to throw an error if you get NaN values! The if will
    #fail anyway, but if you want to power through add checks:
    if( is.nan(par[2]) || is.nan(par[3]) || par[2]+par[3]>1) return(Inf)
    h.new  = rep(0,n)
    #remove while
    for (i in 2:n) {
        h.new[i] <- par[1] + par[2] * dat[i-1] + par[3] * h.new[i-1]
    }
    -sum(dpois(dat, h.new, log=TRUE))
}

算法nlminb(或任何最小化函数)大致适用:

  1. 设置参数以进行初始猜测
  2. 将参数发送到目标函数
  3. 猜测新参数:

    a。如果分数没有太大改善,则返回最小猜测值

    b。如果分数不错,请继续朝这个方向搜索

    c。否则,向其他方向搜索

  4. 使用新参数返回(2)

请注意,您必须为每组参数返回一个分数,而不必在目标函数中对其进行迭代。