2013-02-28 27 views
6

bir fonksiyon bir fonksiyonu optimize model ve gözlenen yayılır arasındaki hatayı (kullanılabilecek hydroGOF Paket mse() kare).Yani en aza indirmek istiyorum r

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

hedef KV_CDS işlevinde lambda serbest bırakarak parametresi ile KV_CDS ve C arasında mse en aza indirmek için: işlev olarak tanımlanır.

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

Sorunuzun Biraz açıklık getirebilir? Bir işlevin işlevi, iki işlevin bileşimi olan bir işlevdir. C/C nedir? Neyin düzeltildiğini ve gönderdiğiniz tüm kodlardan bir parametrenin ne olduğunu çözmek çok zor. –

+0

MSE'yi en aza indirmek istiyorum ancak KV_CDS işlevindeki serbest Parametre Lambda'dır. Diğer tüm parametreler sabittir. Çözücü kullanarak Excel'de kolaydır, ancak verilerim oldukça geniştir, bu yüzden Çözücü'den kaçınmaya çalışıyorum. c, veri şemasıdır ve C modeli takmak istediğim gözlemlerdir. Daha okunabilir hale getirmek için c'yi df'ye yeniden adlandıracağım. KV_PS ve C_G fonksiyonu sadece hedef fonksiyonu çözmek için yardımcı fonksiyonlardır. Üzgünüz, kafa karıştırıcı ekran için. – New2R

+0

Görünüşe göre TestMSE'yi ID ile uygulama hakkında soru eklediniz. Bunu ayrı bir soru olarak sormanızı öneririm, ki bu daha fazla dikkat çekerdi. – Simon

cevap

1

Sayenizde Simon, sana bir çözüm geldi:

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) 

ya:

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) 

teşekkürler yardım çocuklar için!

2

Bunu ortalama Bu özel durumla hatayı karesi hesaplar aza indirmek için bir işlev yazmak gerekir, örneğin:

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

... sonra bunun gibi, optimize() kullanabilirsiniz

optimize(calcMSE,c(0,1)) 
: - örneği (o ima çünkü aslında sadece bir değişken olduğunda bir işlev olabileceğini tesadüfen değil ideal isim size Lambda için olası değerler aralığı belirtmek gerekir) Ben yüklü pbivnorm yoktu çünkü

ben tam testini yapamadı ama bu sizin için bunu yapmak gerektiğini.

+0

Fikriniz için teşekkürler Simon, ama her zaman "optimizasyonda geçersiz işlev değeri" alıyorum. Ne yanlış olabilir, değer sıfır aksi takdirde işlev hataları olamaz. Bu yüzden 'optimize (calcMSE, düşük = 0.1, = 1.5 üst) 'da güvenilir' optimize (calcMSE, c (0.1,1.5))' scalled, ancak hata iletisi kalır. – New2R

+0

@ New2R - hatam. 'Başlangıçta karesi alınmış hataların vektörü err' 'uzunluğuna bölünmesi, her dönen, bu yazılı olduğu gibi err^2/uzunluk (ERR)'. Err^2'nin toplamı, err'nin uzunluğuna bölünmüş olmalıydı. Cevabımı buna göre düzenledim. – Simon

İlgili konular