2012-02-17 117 views
0

我試過了do.call並應用,並且有一個類似的使用plyr包的nlminb答案,但仍然不行。所以我向你們提出任何建議。將多個起始值傳遞給nlminb

我已經創建了以下功能:

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

並且那OK!我從數學角度理解發生了什麼。實際上我想用不同的起始值。

我嘗試將多個起始值傳遞給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?

感謝您的任何建議!

黑麥

回答

3

由於?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)"