在r中优化函数的功能
我想在建模和观察的点差之间最小化均方误差(可能使用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)
感谢你西蒙,我来到了一个解决方案:
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)
感谢您的帮助家伙!
你需要编写一个函数,以尽量减少计算平均值的这种特殊情况下均方误差,如:
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
,但是这应该为您做。
感谢您的想法西蒙,但我总是收到“无效的功能价值在'优化'”。什么可能是错误的,值不能为零,否则功能错误。所以我调查了优化(calcMSE,lower = 0.1,upper = 1.5)'并且尝试了'optimize(calcMSE,c(0.1,1.5))',但是错误信息依然存在。 – New2R 2013-03-01 10:46:15
@ New2R - 我的错误。 'err^2/length(err)',正如我最初写的那样,正在返回平方误差向量,每个误差除以'err'的长度。我应该返回'err^2'的总和除以'err'的长度。我相应地编辑了我的答案。 – Simon 2013-03-01 19:47:40
你能澄清一下你的问题吗?函数的函数只是一个函数,它是两个函数的组成部分。什么是C/C?要解密什么是固定的,以及您发布的所有代码的参数是什么很难。 – 2013-02-28 18:37:49
我想最小化MSE,但免费参数是KV_CDS函数中的Lambda。所有其他参数都是固定的。在使用Solver的Excel中很容易,但是我的数据非常大,所以我尽量避免使用Solver。 c是数据帧,C是我想要适合模型的观测值。我会将c重命名为df以使其更具可读性。函数KV_PS和C_G只是帮助函数来解决目标函数。对不起,混淆的显示。 – New2R 2013-02-28 19:08:59
我看到你已经添加了通过ID应用'TestMSE'的问题。我建议你把它作为一个单独的问题,这会让它更受关注。 – Simon 2013-03-01 19:51:59