Передача нескольких начальных значений в nlminb - PullRequest
0 голосов
/ 17 февраля 2012

Я попробовал do.call и apply, и был похожий ответ nlminb, в котором использовался пакет plyr, но он все равно не помог. Поэтому я обращаюсь ко всем вам за любыми предложениями.

Я создал следующую функцию:

calloptim <- function( under,strike, rf, ttoe,par) {(-(under*par[1]
  -strike*exp(-rf*ttoe)*par[2]))^2}

, а затем использовал nlminb для оценки номинальной величины, сохраняя остальные аргументы постоянными:

nlminb(c(2,2), calloptim, under= 90, strike = 100, rf =0.05, ttoe=3)

, что дает:

$par
[1] 1.953851 2.043045

$objective
[1] 1.335531e-17

$convergence
[1] 0

$iterations
[1] 4

$evaluations
function gradient 
       6       10 

$message
[1] "X-convergence (3)"

при вводе другого начального значения, например

nlminb(c(5,5), calloptim, under= 90, strike = 100, rf =0.05, ttoe=3)

Я получаю разные оценки:

$par
[1] 4.885987 5.109036

$objective
[1] 2.464145e-14

$convergence
[1] 1

$iterations
[1] 2

$evaluations
function gradient 
      33        4 

$message
[1] "false convergence (8)"

И это нормально! Я математически понимаю, что происходит. На самом деле я хочу использовать разные начальные значения.

Моя проблема возникает, когда я пытаюсь передать несколько начальных значений в nlminb.

Я создаю матрицу:

f<- c(2,5,2,5)
dim(f) <- c(2,2)

> f
     [,1] [,2]
[1,]    2    2
[2,]    5    5

Но когда я передаю f начальному значению nlminb

nlminb(f, calloptim, under= 90, strike = 100, rf =0.05, ttoe=3)

Я получаю:

$par
[1] 3.452902 3.610530 2.000000 5.000000

$objective
[1] 3.010198e-19

$convergence
[1] 0

$iterations
[1] 4

$evaluations
function gradient 
      22       24 

$message
[1] "X-convergence (3)"

Итак, мой вопрос: как я могу передать несколько строк начальных значений в nlminb?

Спасибо за любые предложения!

Ржаной

1 Ответ

3 голосов
/ 18 февраля 2012

Поскольку ?nlminb говорит, что его первый аргумент должен быть числовым вектором, вам нужно apply его для каждой строки вашей матрицы f.

out <- apply(f, 1, nlminb, objective=calloptim, under=90, strike=100, rf=0.05, ttoe=3)

str(out)

List of 2
 $ :List of 6
  ..$ par        : num [1:2] 1.95 2.04
  ..$ objective  : num 1.34e-17
  ..$ convergence: int 0
  ..$ iterations : int 4
  ..$ evaluations: Named int [1:2] 6 10
  .. ..- attr(*, "names")= chr [1:2] "function" "gradient"
  ..$ message    : chr "X-convergence (3)"
 $ :List of 6
  ..$ par        : num [1:2] 4.89 5.11
  ..$ objective  : num 2.46e-14
  ..$ convergence: int 1
  ..$ iterations : int 2
  ..$ evaluations: Named int [1:2] 33 4
  .. ..- attr(*, "names")= chr [1:2] "function" "gradient"
  ..$ message    : chr "false convergence (8)"
...