1

我有一个时间序列模型(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 循环,但循环无法停止。

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

以下是我的代码:

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)
4

1 回答 1

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

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

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

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

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

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

于 2018-11-27T08:43:01.153 回答