2013-02-28 14 views
6

Chciałbym zminimalizować błąd średniokwadratowy (można użyć pakietu mse() w pakiecie hydroGOF) między modelowanymi i obserwowanymi rozkładami. Funkcja ta jest określona jako:Optymalizacja funkcji funkcji r

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

Celem jest zminimalizowanie mse pomiędzy KV_CDS i C, pozostawiając wolną lambda parametru w funkcji 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

Czy możesz nieco wyjaśnić swoje pytanie? Funkcja funkcji jest po prostu funkcją składającą się z dwóch funkcji. Czym jest c/C? Trudno jest odszyfrować to, co jest naprawione, a co jest parametrem ze wszystkich opublikowanych przez Ciebie kodów. –

+0

Chcę zminimalizować MSE, ale darmowym parametrem jest Lambda w funkcji KV_CDS. Wszystkie pozostałe parametry są stałe. W Excelu jest to łatwe przy użyciu Solvera, ale moje dane są dość duże, więc staram się unikać Solvera. c jest ramką danych, a C to obserwacje, które chcę dopasować do modelu. Zmieni nazwę c na df, aby była bardziej czytelna. Funkcja KV_PS i C_G są tylko funkcjami pomocy do rozwiązania funkcji celu. Przepraszamy, za mylące wyświetlanie. – New2R

+0

Widzę, że dodano pytanie dotyczące stosowania 'TestMSE' według identyfikatora. Sugerowałbym, żebyś zadał to jako osobne pytanie, które zwróciłoby na to większą uwagę. – Simon

Odpowiedz

1

Dzięki Wam Simon, doszedłem do rozwiązania:

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) 

lub:

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) 

Dzięki za pomoc chłopaki!

2

Musisz napisać funkcję, aby zminimalizować który oblicza średnią kwadratu błędu w tym konkretnym przypadku, na przykład:

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

... i wtedy można użyć optimize(), tak dla instancji (trzeba określić zakres możliwych wartości dla Lambda - nawiasem mówiąc nie jest to idealne imię, ponieważ oznacza to, że może to być funkcja, gdy jest to rzeczywiście tylko zmienna):

optimize(calcMSE,c(0,1)) 

Nie mogłem wykonać pełnego testu, ponieważ nie miałem zainstalowanego pbivnorm, ale powinno to zrobić dla ciebie.

+0

Dziękuję za pomysł, Simon, ale zawsze otrzymuję "nieprawidłową wartość funkcji w" optymalizacji ". Co może być źle, wartość nie może wynosić zero, inaczej błędy funkcji. Tak więc przeszedłem 'optimize (calcMSE, lower = 0.1, upper = 1.5)' i również wypróbowałem 'optimize (calcMSE, c (0.1.1.5))', ale komunikat o błędzie pozostaje. – New2R

+0

@ New2R - mój błąd. 'err^2/length (err)', tak jak napisałem to pierwotnie, zwracało wektor kwadratów błędów, każdy podzielony przez długość 'err'. Powinienem był zwrócić sumę 'err^2' podzieloną przez długość' err'. Odpowiednio zredagowałem swoją odpowiedź. – Simon