【问题标题】:R implemantion and optimization of a functionR函数的实现和优化
【发布时间】:2014-12-04 01:15:15
【问题描述】:

我有一个需要在 R 中实现的功能

L = Σ i=1->n  ( 1/β* e^(((µ-yi))/β) - e^(-e^((µ-yi)/β) ))

然后我必须在 R 中使用优化函数来找到最大化这个的 µβ 的值 功能。

给出y的数据。

           Y
1   5.539341
2   2.607342
3   2.675443
4   2.905286
5   3.657362
6   5.175831
7   3.830794
8   2.664615
9   5.741146
10  4.432348
11  3.326155
12  2.637661
13  3.306147
14  2.840939
15  3.559279

我想过

vraislogn <-
    function (p,y){
    logvrais=log(L)
    β=p[2]
    µ=p[1]
    return(-logvrais)}`
nlm(vraislogn,p=c(1,1),y=y)

当我将 p =c(1,1) 更改为例如 p=c(2,3) 时,我的估计值有所不同,并且我发现的最小函数是否定的,这是荒谬的!!!

【问题讨论】:

    标签: r optimization statistics


    【解决方案1】:

    为什么认为负值很荒谬?你的函数可能会变成负数。它甚至可以达到非常大的负值。如果存在局部最小值,则可以预期对起始值的敏感性。

    y <- unlist(read.table(text="           Y
    1   5.539341
    2   2.607342
    3   2.675443
    4   2.905286
    5   3.657362
    6   5.175831
    7   3.830794
    8   2.664615
    9   5.741146
    10  4.432348
    11  3.326155
    12  2.637661
    13  3.306147
    14  2.840939
    15  3.559279"))
    
    L <- function(p, y) {
      sum(1 / p[1] * exp((p[2] - y)/p[1]) - exp(-exp((p[2] - y)/p[1])))
    }
    
    library(optimx)
    optimx(par = c(1, 1), L, y=y, method=c( 'Nelder-Mead', 'BFGS', 'CG', 'L-BFGS-B', 'nlm', 
              'nlminb', 'spg', 'ucminf', 'newuoa', 'bobyqa', 'nmkb', 'hjkb', 'Rcgmin'))
    #                       p1            p2          value fevals gevals niter convcode  kkt1  kkt2 xtimes
    #Nelder-Mead -6.424696e-03  1.213437e+00 -1.797693e+308    359     NA    NA        0    NA    NA   0.00
    #BFGS        -2.688898e-02 -6.893257e+00 -4.304276e+205    413      5    NA        0 FALSE FALSE   0.02
    #CG          -2.164624e+06 -1.457184e+06  -2.111903e+00    200    101    NA        1  TRUE FALSE   0.00
    #L-BFGS-B     1.020495e-01  4.385857e-01  -1.500000e+01     13     13    NA        0  TRUE FALSE   0.00
    #nlm         -1.282396e-02 -1.191648e+00 -4.752890e+236     NA     NA     6        0 FALSE FALSE   0.00
    #nlminb       8.706765e-02  5.051164e-01  -1.500000e+01     16     57    15        0  TRUE FALSE   0.00
    #spg          1.000000e+00  1.000000e+00  -1.201022e+01      1     NA     1        3 FALSE FALSE   0.04
    #ucminf      -5.526900e-03  2.211903e+00 -3.797103e+279     20     20    NA        0 FALSE    NA   0.00
    #newuoa                 NA            NA  8.988466e+307     NA     NA    NA     9999    NA    NA   0.00
    #bobyqa       4.812801e-02  7.576366e-01  -1.500000e+01    121     NA    NA        0  TRUE  TRUE   0.00
    #nmkb                   NA            NA  8.988466e+307     NA     NA    NA     9999    NA    NA   0.00
    #hjkb         1.000000e+00  1.000000e+00  -1.201022e+01      1     NA     0     9999    NA    NA   0.00
    #Rcgmin                 NA            NA  8.988466e+307     NA     NA    NA     9999    NA    NA   0.00
    

    让我们将参数限制为正值:

    optimx(par = c(1, 1), L, y=y, 
           method=c( 'L-BFGS-B', 'nlminb', 'bobyqa'),
           lower=c(0,0))
    #                 p1        p2 value fevals gevals niter convcode kkt1  kkt2 xtimes
    #L-BFGS-B 0.11115122 0.2651588   -15     16     16    NA        0 TRUE FALSE      0
    #nlminb   0.08866507 0.5038754   -15     15     54    14        0 TRUE FALSE      0
    #bobyqa   0.05325943 0.7253612   -15    117     NA    NA        0 TRUE FALSE      0
    

    不。最小值仍然是负数。你的函数可能有错误吗?

    【讨论】:

    • 我从函数中提取总和时确实找到了答案。
    猜你喜欢
    • 2013-09-18
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多