2016-03-24 25 views
5

Tamam, bu bana 3 gün boyunca daha fazla güldü ve hala çözüme bir adım daha yaklaşmamaya başladı, burada şansımı deneyeceğim. Geçmişte R: Entegrasyon/İntegral R: Bulmak

, ben belirli bir sıralı veri kümesi için bazı kodlar yazdım ve böyle gider: MÜKEMMEL çalışır

n <- length(data) 
maxobs <- max(data) 
minobs <- min(data) 
FG <- function(m=NULL, h = NULL){ 
    n<- length(data) #Number of observations 
    if (m<minobs){FG = 0} else { 
     if (m >maxobs){FG = 1} else { 
        FG = sum(pnorm((m - data)/h)-pnorm((minobs-data)/h))/sum(pnorm((maxobs - data)/h)-pnorm((minobs-data)/h)) 
    }} 
    return(FG) 
} 

f<- function(m,h){ 
    f<- FG(m,h)^n 
    return(f) 
} 

##Integration 
max <- NULL 
delta<- function(h,max=maxobs){ 
    delta <- integrate(Vectorize(f), minobs, max, h)$value 
    return (delta) 
} 

. bir veri seçer Örneğin: (1,2,3,4,5) = c, tek Ancak

> delta(0.1, maxobs) 
[1] 0.6300001 

için doğru sonuç alır, şimdi her sıralanmış veri kümesi için genelleme çalışıyorum, bu yüzden Yaptığımın (açık olmak: Veri kümesi x önce egzersiz tüm bu işlevleri sıralanır)

FG <- function(x, m=NULL, h = NULL){ 
    n<- length(x) #Number of observations 
    maxobs <- max(x) 
    minobs <- min(x) 
    if (m<minobs){FG = 0} else { 
    if (m >maxobs){FG = 1} else { 
     FG = sum(pnorm((m - x)/h)-pnorm((minobs-x)/h))/sum(pnorm((maxobs - x)/h)-pnorm((minobs-x)/h)) 
    }} 
    return(FG) 
} 

f<- function(x,m,h){ 
    n <- length(x) 
    f<- FG(x,m,h)^n 
    return(f) 
} 

##Integration 
delta<- function(x,h,maxu= max(x)){ 
minobs <- min(x) 
    delta <- integrate(Vectorize(f), minobs, maxu, h)$value 
    return (delta) 
} 

Ama şimdi, delta(data,0.1) etmiyor

delta(data,0.1) 
[1] 0. 

verir Bana hiç mantıklı gelmiyor. Aynı işlev, aynı veri kümesi, ancak şimdi yanlış bir değerle. Neyi yanlış yapıyorum?

Herhangi bir yardım, değerli bir şekilde takdir edilecektir.

DÜZENLEME: Vectorize işlevine daha yakından incelemek ve işlevini entegre sonra, şimdi benim delta fonksiyonu kaydetmiştiniz:

delta<- function(x,h,maxu= max(x)){ 
minobs <- min(x) 
    delta <- integrate(Vectorize(f, vectorize.args= c("m","h")), minobs, maxu, h)$value 
    return (delta) 
} 

ama bu artık sadece başka hata ile sonuçlanır:

Error in integrate(Vectorize(f, vectorize.args = c("m", "h")), lower = minobs, : evaluation of function gave a result of wrong length

Vectorize'in bu tür hataları önlemesi gerektiğini düşünmüştüm?

cevap

6

Buradaki temel sorun, integrate'un ilk bağımsız değişken olarak tümleştirdiğiniz değişkene sahip olmanızı beklemesidir. İlk kod kümesinde, m üzerinden bütünleşiyorsunuz. İkinci sette, x üzerinden entegrasyon yapmaya çalışıyorsunuz. Şimdi

delta<- function(x,h,maxu= max(x)){ 
    minobs <- min(x) 
    g <- function(m) f(x,m,h) 
    return(integrate(Vectorize(g), minobs, maxu)$value) 
} 

İstediğiniz sonuçları

delta(data,0.1) 
# [1] 0.6300001 

Kaynağını inanıyoruz alırsınız:

kısa düzenlemek integrate için gerekli sırayla argümanları yerleştirmek için bir yardımcı işlevi yapmaktır ikinci hatanın, h üzerinden vektörleştirilmeye çalışılmasından dolayı, sadece m üzerinden sadece vektörü yapmak istediniz. Yukarıdaki yardımcı fonksiyon yaklaşımı, bu problemi ortadan kaldırır ve sadece entegre etmek istediğiniz değişkeni ortaya çıkarır. Ben Burada asıl yapmak için çalışıyoruz ne söyleyemem, ama aynı zamanda da uygulanması eşdeğer olmalıdır bu yeniden yazma sunarız ama belki de

Not kolay biraz takip etmek:

FG <- function(m, x, h) { 
    n <- length(x) 
    d <- function(t) pnorm((t-x)/h) 

    if(m < x[1]) return(0) 
    if(m > x[n]) return(1) 

    return(sum(d(m)-d(x[1]))/sum(d(x[n])-d(x[1]))) 
} 

f<- function(m, x, h){ 
    n <- length(x) 
    mapply(function(m) FG(m,x,h)^n, m) 
} 

delta<- function(x, h, lb=x[1], ub=x[length(x)]) { 
    return(integrate(f, lb, ub, x, h)$value) 
}