Для optimx () ​​с методом bobyqa, как установить начальное значение - PullRequest
1 голос
/ 03 июня 2019

Я пытался максимизировать свою вероятность с помощью пакета «optimx». Вот мой код С начальными значениями (5,5) и (1,1) я получил разную максимальную вероятность. Я также пробовал другой метод, например «Nelder = Mead», но предполагаемая логарифмическая вероятность различна при разных методах ...

library('optimx')
n=225
X = matrix(runif(225),ncol=1)
e2 = matrix(runif(225,0,2),ncol=1)

set.seed(123)

Это функция для генерации некоторых данных, которые я буду использовать

get_mls_basis<- function(p){

  depth <- ceiling(runif(1)*p)

  knot <- matrix(rep(0,depth+1),ncol=1)

  lr <- runif(1) > 0.5

  x <- matrix(rep(0,n),ncol=1)

  not_finished <- 1

  while (not_finished == 1) {
    data_indx = ceiling(runif(1)*n)
    var = matrix(rep(0,depth),ncol=1) 
    for (j in 1:depth) {
      not_ok <- 1
      while (not_ok == 1) {
        ind <- ceiling(runif(1)*p)
        if (!is.element (ind,var[1:j]))
        {
          var[j] <- ind
          not_ok <- 0
        }
      }
    }

    x_v <- as.matrix(X[data_indx, var])
    knot[1:depth] <- rgamma(depth,1,1)
    knot[1:depth] <- knot[1:depth] / sqrt(sum(knot^2))
    knot[depth+1] <- -x_v %*% knot[1:depth]

    ones <- matrix(rep(1,n),ncol=1)

    temp <- as.matrix(cbind(X[,var], ones)) %*% knot

    if (lr == 0) {
      for (i in 1:n)
      {
        temp[i] <- max(0,temp[i])
      }
    }
    else {
      for (i in 1:n)
      {
        temp[i] <- min(0,temp[i])
      }
    }

    x <- temp
    not_finished <- all(x==0)
  }

  mx <- mean(x)
  stx <- sd(x)
  x <- (x-mx)/stx
  x



}

Это моя логарифмическая вероятность

Lik1<-function(theta, basis){
  theta0=theta[1]
  theta1=theta[2]
  L=-n/2*log(theta0)-sum(basis/2)*log(theta1)-0.5/theta0*sum(e2/theta1^basis)
  return(L)
}
 basis1=get_mls_basis(1)

Здесь я использовал 5 в качестве начального значения

  optimx(par=c(5,5), Lik1,
         basis=basis1,method='bobyqa',control = list(maximize=TRUE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...