2013-02-28 59 views
6

我想在建模和观察的点差之间最小化均方误差(可能使用hydroGOF包中的mse())。该函数被定义为:在r中优化函数的功能

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

的目标是通过留下LAMBDA一个自由参数在KV_CDS函数以最小化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) 
+0

你能澄清一下你的问题吗?函数的函数只是一个函数,它是两个函数的组成部分。什么是C/C?要解密什么是固定的,以及您发布的所有代码的参数是什么很难。 – 2013-02-28 18:37:49

+0

我想最小化MSE,但免费参数是KV_CDS函数中的Lambda。所有其他参数都是固定的。在使用Solver的Excel中很容易,但是我的数据非常大,所以我尽量避免使用Solver。 c是数据帧,C是我想要适合模型的观测值。我会将c重命名为df以使其更具可读性。函数KV_PS和C_G只是帮助函数来解决目标函数。对不起,混淆的显示。 – New2R 2013-02-28 19:08:59

+0

我看到你已经添加了通过ID应用'TestMSE'的问题。我建议你把它作为一个单独的问题,这会让它更受关注。 – Simon 2013-03-01 19:51:59

回答

1

感谢你西蒙,我来到了一个解决方案:

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) 

感谢您的帮助家伙!

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,但是这应该为您做。

+0

感谢您的想法西蒙,但我总是收到“无效的功能价值在'优化'”。什么可能是错误的,值不能为零,否则功能错误。所以我调查了优化(calcMSE,lower = 0.1,upper = 1.5)'并且尝试了'optimize(calcMSE,c(0.1,1.5))',但是错误信息依然存在。 – New2R 2013-03-01 10:46:15

+0

@ New2R - 我的错误。 'err^2/length(err)',正如我最初写的那样,正在返回平方误差向量,每个误差除以'err'的长度。我应该返回'err^2'的总和除以'err'的长度。我相应地编辑了我的答案。 – Simon 2013-03-01 19:47:40