Оптимизация функции функции в r
Я хотел бы свести к минимуму среднюю квадратную ошибку (mse()
на hydroGOF
пакет может использоваться) между моделируемыми и наблюдаемыми спредами. Функция определяется как:
KV_CDS <- function(Lambda, s, sigma_S){
KV_CDS = (Lambda * (1 + s)) / exp(-s * sigma_S) - Lambda^2)
}
цель состоит в том, чтобы свести к минимуму mse
между KV_CDS и C, оставив лямбда свободный параметр в функции KV_CDS.
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 ответов
вам нужно написать функцию для минимизации, которая вычисляет среднюю квадратную ошибку для этого конкретного случая, например:
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
установлен, но это должно помочь тебе.
благодаря вам, Симон, я пришел к решению:
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)
Спасибо за помощь ребята!