2016-03-24 17 views
5

Ok, vì vậy điều này khiến tôi bối rối hơn 3 ngày và sau khi vẫn chưa tiến gần hơn đến giải pháp, tôi sẽ thử vận ​​may của mình ở đây.Tích hợp/Tích phân trong R: Tìm bắt

Trong quá khứ, tôi đã viết một số mã cho một tập dữ liệu được sắp xếp trong cụ thể và nó đi như thế này:

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

mà hoạt động hoàn hảo. Ví dụ: nếu người dùng chọn dữ liệu: = c (1,2,3,4,5), người dùng sẽ nhận được kết quả chính xác cho

> delta(0.1, maxobs) 
[1] 0.6300001 

Tuy nhiên, bây giờ tôi đang cố gắng tổng quát dữ liệu cho mỗi tập dữ liệu được sắp xếp, vì vậy những gì tôi đã làm được (phải rõ ràng: các tập dữ liệu x được sắp xếp trước thực hiện tất cả những chức năng này)

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

Nhưng bây giờ, delta(data,0.1) cho

delta(data,0.1) 
[1] 0. 

nào doesn không có ý nghĩa với tôi. Hàm tương tự, cùng một tập dữ liệu, nhưng bây giờ có giá trị sai. Tôi đang làm gì sai?

Mọi trợ giúp sẽ được đánh giá cao.

EDIT: Sau khi tham gia một cái nhìn gần gũi hơn với các chức năng Vectorize và chức năng tích hợp, bây giờ tôi đã thay đổi nội dung hàm delta tôi để:

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

nhưng điều này bây giờ chỉ cần dẫn đến lỗi khác:

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

Tôi nghĩ Vectorize có nghĩa vụ ngăn chặn các lỗi như vậy?

Trả lời

6

Vấn đề chính ở đây là integrate hy vọng bạn có biến mà bạn đang tích hợp làm đối số đầu tiên. Trong tập mã đầu tiên, bạn đang tích hợp trên m. Trong tập thứ hai, bạn đang cố gắng tích hợp trên x.

Tóm lược sửa đổi ngắn nhất là để thực hiện một chức năng helper để đặt các đối số theo thứ tự cần thiết cho integrate:

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

Bây giờ bạn sẽ nhận được kết quả mong muốn

delta(data,0.1) 
# [1] 0.6300001 

Tôi tin nguồn lỗi thứ hai của bạn là do cố gắng vector hóa trên h, trong khi bạn thực sự chỉ muốn vector hóa trên m. Cách tiếp cận hàm trợ giúp ở trên cũng loại bỏ vấn đề này bằng cách chỉ hiển thị biến mà bạn muốn tích hợp.

Lưu ý rằng tôi không thể nói những gì bạn đang thực sự cố gắng để làm ở đây, nhưng tôi cũng sẽ cung cấp cho viết lại này cần được tương đương với thực hiện, nhưng có lẽ là một chút dễ dàng hơn để làm theo:

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) 
} 
Các vấn đề liên quan