2013-02-28 4 views
6

Ich möchte den mittleren quadratischen Fehler (der mse() im hydroGOF Paket könnte verwendet werden) zwischen modellierten und beobachteten Spreads minimieren. Die Funktion wird wie folgt definiert:Optimiere eine Funktion einer Funktion in r

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

Ziel mse zwischen KV_CDS und C durch Verlassen Lambda einen freien Parameter in der KV_CDS Funktion zu minimieren ist.

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

Können Sie Ihre Frage ein wenig klären? Eine Funktion einer Funktion ist nur eine Funktion, die die Zusammensetzung der beiden Funktionen ist. Was ist c/C? Es ist schwer zu entziffern, was behoben ist und was ein Parameter aus dem gesamten Code ist, den Sie gepostet haben. –

+0

Ich möchte den MSE minimieren, aber der freie Parameter ist Lambda in der KV_CDS-Funktion. Alle anderen Parameter sind festgelegt. Es ist einfach in Excel den Solver zu verwenden, aber meine Daten sind ziemlich groß, daher versuche ich den Solver zu vermeiden. c ist der Datenrahmen und C sind Beobachtungen, denen ich das Modell anpassen möchte. Ich werde c in df umbenennen, um es lesbarer zu machen. Die Funktionen KV_PS und C_G sind nur Hilfefunktionen, um die Zielfunktion zu lösen. Entschuldigung, für das verwirrende Display. – New2R

+0

Ich sehe, Sie haben die Frage über die Anwendung von 'TestMSE' nach ID hinzugefügt. Ich würde vorschlagen, dass Sie es als eine getrennte Frage stellen, die es mehr Aufmerksamkeit bekommen würde. – Simon

Antwort

1

Dank dir Simon, kam ich zu einer Lösung:

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) 

oder:

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) 

Vielen Dank für Ihre Hilfe Jungs!

2

Sie werden eine Funktion schreiben, müssen die mittleren quadratischen Fehler zu minimieren, dass berechnet für diesen speziellen Fall, zum Beispiel:

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

... und dann können Sie optimize() verwenden, wie dies für Beispiel (Sie müssen den Bereich der möglicher Werte angeben, für Lambda - übrigens keine idealen Namen, weil es bedeutet, dass es eine Funktion sein könnte, wenn es tatsächlich nur eine Variable ist):

optimize(calcMSE,c(0,1)) 

Ich konnte den kompletten Test nicht machen, weil ich pbivnorm nicht installiert hatte, aber das sollte es für Sie tun.

+0

Danke für deine Idee Simon, aber ich bekomme immer "ungültigen Funktionswert in 'optimieren'". Was möglicherweise falsch ist, kann der Wert nicht Null sein, sonst die Funktionsfehler. Also habe ich 'optimize (calcMSE, low = 0.1, upper = 1.5)' und auch 'optimize (calcMSE, c (0.1, 1.5))' 'skaliert, aber die Fehlermeldung bleibt bestehen. – New2R

+0

@ New2R - mein Fehler. 'err^2/length (err)', wie ich es ursprünglich geschrieben hatte, gab den Vektor der quadratischen Fehler zurück, jeweils geteilt durch die Länge von 'err'. Ich hätte die Summe von 'err^2' geteilt durch die Länge von 'err' zurückgeben sollen. Ich habe meine Antwort entsprechend bearbeitet. – Simon