2013-02-28 56 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