【问题标题】:How to add constraint into loglikelihood function?如何在对数似然函数中添加约束?
【发布时间】:2019-04-28 22:27:28
【问题描述】:

我有一个时间序列模型(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)

【问题讨论】:

  • 不客气,但无需在答案中表示感谢。通过投票和接受答案来表示帮助,以便其他用户看到它是有用的。祝你剩下的问题好运。

标签: r optimization mle log-likelihood


【解决方案1】:

您在此期间根本不会更改par。特别是,如果您在其中打印了par[1]par[2],您会看到您无休止地打印原始值0.1 - 因此您将永远停留在while

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. 猜测新参数:

    一个。如果分数没有提高多少,则返回最小化猜测

    b.如果分数不错,继续往这个方向搜索

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

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

注意你必须为每组参数返回一个分数,你不要在目标函数中迭代它们。

【讨论】:

  • 感谢您的评论,@kabanus。有什么方法可以限制 par[2] + par[3]
  • @Miyazaki 答案确切地显示了如何做到这一点。请仔细阅读所有内容。
  • 特别是,我添加您的函数的第一行就是这样做的。
  • 感谢您的澄清,我已经再次运行代码,但它返回错误 if (par[2] + par[3] > 1) return(inf) : missing value where TRUE/ FALSE需要如何避免错误?
  • @Miyazaki 你很可能得到NaN 值,添加了检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多