MLE - Оптимизация с ограничениями как нелинейные функции переменных - PullRequest
0 голосов
/ 29 апреля 2020

У меня проблема со следующей оптимизацией. В частности, я хотел бы добавить следующее ограничение к проблеме MLE: (x - location)/scale > 0. Без этого ограничения LL равен Inf, а оптимизация L-BGFS-B дает следующую ошибку

library(PearsonDS)
x <- rpearsonIII(n=1000, shape = 5, location = 6, scale = 7)

dpearson3 <- function (x, shape, location, scale, log = FALSE) 
{
  gscale <- abs(scale)
  ssgn <- sign(scale)
  density <- dgamma(ssgn * (x - location), shape = shape, scale = gscale, log = log)

  return(density)

}

LL3 <- function(theta, x, display)
{
        shape <- as.numeric(theta[1])
        location <- as.numeric(theta[2])
        scale <- as.numeric(theta[3])

        tmp <- -sum(log(dpearson3(x, shape, location, scale, log = FALSE)))

        if (is.na(tmp)) +Inf else tmp
        if(display == 1){print(c(tmp, theta))}
        return(sum(tmp))
}

control.list <- list(maxit = 100000, factr=1e-12, fnscale = 1)

fit <- optim(par = param, 
               fn = LL3, 
               hessian = TRUE, 
               method = "L-BFGS-B",
               lower = c(0,-Inf,-Inf),
               upper = c(Inf,Inf,Inf),
               control = control.list,
               x = x, display = 1)

. Предположим, что я начинаю поиск с param <- c(100,1000,10), я получаю следующую ошибку

Error in optim(par = param, fn = LL3, hessian = TRUE, method = "L-BFGS-B", : L-BFGS-B needs finite values of 'fn'

Как решить проблему?

1 Ответ

0 голосов
/ 29 апреля 2020

Изменение функции MLE на

LL3 <- function(theta, x, display){
  shape <- as.numeric(theta[1])
  location <- as.numeric(theta[2])
  scale <- as.numeric(theta[3])

  tmp <- -sum(log(dpearson3(x, shape, location, scale, log = FALSE)))

  if(min((x-location)/scale) < 0) tmp = + 100000000000 # I added this line
  if (is.na(tmp)) +Inf else tmp
  if(display == 1){print(c(tmp, theta))}
  return(tmp)
}

- самая умная вещь, которую я мог найти. Таким образом я избегаю проблемы Inf. Любой лучший ответ?

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