Как добавить ограничение в функцию правдоподобия? - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть модель временного ряда (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)

1 Ответ

0 голосов
/ 27 ноября 2018

Вы не меняете 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. Угадайте новые параметры:

    a.если оценка не улучшилась, верните минимизированное предположение

    b.если оценка хорошая, продолжайте искать в этом направлении

    c.иначе, поиск в другом направлении

  4. Вернитесь к (2) с новыми параметрами

Обратите внимание, что вы должны возвращать счет для каждого наборапараметров, вы не перебираете их в целевой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...