2013-02-28 36 views
6

Tôi muốn giảm thiểu sai số bình phương trung bình (mse() trong gói hydroGOF có thể được sử dụng) giữa các mẫu được quan sát và được quan sát. Các chức năng được định nghĩa là:Tối ưu hóa chức năng của một hàm trong r

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

Mục đích là để giảm thiểu mse giữa KV_CDS và C bằng cách để lại Lambda một tham số tự do trong hàm 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) 
+0

Bạn có thể làm rõ câu hỏi của mình một chút không? Hàm của hàm chỉ là hàm là thành phần của hai hàm. C/C là gì? Thật khó để giải mã những gì đã được sửa và thông số từ tất cả mã bạn đã đăng là gì. –

+0

Tôi muốn giảm thiểu MSE nhưng tham số miễn phí là Lambda trong hàm KV_CDS. Tất cả các tham số khác đều được sửa. Nó rất dễ dàng trong Excel bằng cách sử dụng Solver, nhưng dữ liệu của tôi là khá lớn, vì vậy tôi cố gắng tránh Solver. c là khung dữ liệu và C là các quan sát mà tôi muốn phù hợp với mô hình. Tôi sẽ đổi tên c thành df để làm cho nó dễ đọc hơn. Hàm KV_PS và C_G chỉ là các hàm trợ giúp để giải quyết hàm đích. Xin lỗi, cho màn hình khó hiểu. – New2R

+0

Tôi thấy bạn đã thêm câu hỏi về việc áp dụng 'TestMSE' theo ID. Tôi đề nghị bạn hỏi nó như một câu hỏi riêng biệt, điều này sẽ khiến nó chú ý hơn. – Simon

Trả lời

1

Nhờ bạn Simon, tôi đi đến một giải pháp:

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) 

hay:

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) 

Thanks for guys giúp đỡ của bạn!

2

Bạn sẽ cần phải viết một chức năng để giảm thiểu để tính toán giá trị trung bình bình phương lỗi cho trường hợp cụ thể này, ví dụ:

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) 
} 

... và sau đó bạn có thể sử dụng optimize(), như thế này cho Ví dụ (bạn cần phải xác định phạm vi của các giá trị có thể cho Lambda - tình cờ không phải là một tên lý tưởng vì nó ngụ ý rằng nó có thể là một chức năng khi nó thực sự chỉ là một biến):

optimize(calcMSE,c(0,1)) 

Tôi không thể làm bài kiểm tra hoàn chỉnh vì tôi không cài đặt pbivnorm nhưng điều này nên làm điều đó cho bạn.

+0

Cảm ơn ý tưởng của bạn Simon, nhưng tôi luôn nhận được "giá trị hàm không hợp lệ trong 'tối ưu hóa'". Điều gì có thể sai, giá trị không thể bằng không nếu không thì lỗi chức năng. Vì vậy, tôi đã bẫy 'tối ưu hóa (calcMSE, thấp hơn = 0,1, trên = 1,5)' và cũng đã thử 'tối ưu hóa (calcMSE, c (0,1,1,5))', nhưng thông báo lỗi vẫn còn. – New2R

+0

@ New2R - lỗi của tôi. 'err^2/length (err)', như tôi đã viết ban đầu, đã trả về vectơ của các lỗi bình phương, mỗi phần chia cho độ dài của 'err'. Tôi đáng lẽ phải trả lại số tiền 'err^2' chia cho độ dài' err'. Tôi đã chỉnh sửa câu trả lời của mình cho phù hợp. – Simon

Các vấn đề liên quan