在r中优化函数的函数

时间:2013-02-28 17:49:33

标签: r optimization minimize

我希望尽量减少建模和观察到的点差之间的均方误差(可能会使用mse()包中的hydroGOF)。该函数定义为:

    KV_CDS <- function(Lambda, s, sigma_S){
     KV_CDS = (Lambda * (1 + s)) / exp(-s * sigma_S) - Lambda^2)
}

目标是通过在KV_CDS函数中保留Lambda一个自由参数来最小化KV_CDS和C之间的mse

df <- data.frame(C=c(1,1,1,2,2,3,4),
                 Lambda=c(0.5),s=c(1:7),
                 sigma_S=c(0.5,0.4,0.3,0.7,0.4,0.5,0.8),
                 d=c(20,30,40,50,60,70,80), 
                 sigma_B=0.3, t=5, Rec=0.5, r=0.05)

2 个答案:

答案 0 :(得分:2)

您需要编写一个函数来最小化计算此特定情况的均方误差,例如:

calcMSE <- function (Lambda) 
{
        d <- df # best not to use -df- as a variable because of confusion with
                # degrees of freedom
        err <- d$C - KV_CDS(Lambda, d$s, d$sigma_S, d$d, d$sigma_B, d$t, d$Rec, d$r)
        sum(err^2) / length(err)
}

...然后您可以使用optimize(),例如这样(您需要为Lambda指定可能值的范围 - 顺便说一句,这不是一个理想的名称,因为它暗示它可以当它实际上只是一个变量时是一个函数):

optimize(calcMSE,c(0,1))

我无法完成全部测试,因为我没有安装pbivnorm,但这应该是为你做的。

答案 1 :(得分:1)

感谢Simon,我找到了解决方案:

  d <- df

  TestMSE <- function(LR)
    {

     D <- KV_CDS(LR, d$s, d$sigma_s, d$D, d$sigma_B, d$t, d$Rec, d$r)
      mse(d$C, D)
     }

  optimize(TestMSE,lower = 0.1, upper =1.5)

或:

TestMSE2 <- function(LR)
    {
 D <- KV_CDS(LR, d$s, d$sigma_s, d$D, d$sigma_B, d$t, d$Rec, d$r)
      mean((d$C- D)^2)
     }

  optimize(TestMSE2,lower = 0.1, upper =1.5)

感谢您的帮助!