2016-04-25 16 views
5

Tôi có một chức năng hạt nhân như vậy:Làm thế nào để ngoại suy vượt ra ngoài các điểm x được chuyển tới `ksmooth`?

x <- 1:100 
y <- rnorm(100, mean=(x/2000)^2) 
plot(x,y) 
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10) 
print(kernel$y) 

Nếu tôi cố gắng để dự đoán tại một điểm bên ngoài của dãy các giá trị x, nó sẽ cho tôi NaN, bởi vì nó đang cố gắng suy luận vượt ra ngoài dữ liệu:

x <- 1:100 
y <- rnorm(100, mean=(x/2000)^2) 
plot(x,y) 
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10, x.points=c(130)) 
print(kernel$y) 

> print(kernel$y) 
[1] NA 

Ngay cả khi tôi thay đổi range.x nó không nhúc nhích:

x <- 1:100 
y <- rnorm(100, mean=(x/2000)^2) 
plot(x,y) 
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10, range.x=c(1,200) , x.points=c(130)) 
print(kernel$y) 

> print(kernel$y) 
[1] NA 

làm thế nào để tôi có được ksmooth chức năng ngoại suy vượt ra ngoài dữ liệu? Tôi biết đây là một ý tưởng tồi trong lý thuyết, nhưng trong thực tế vấn đề này luôn luôn xảy ra.

+0

Tôi giả sử một câu hỏi phụ sẽ là: * Phạm vi '' làm gì? * Tài liệu dường như chỉ ra rằng đó là "phạm vi điểm được bao phủ trong đầu ra. " Nhưng nó dường như không có ảnh hưởng đến đầu ra ở đây? – Hunle

+1

Bạn đã cân nhắc sử dụng bkde2D {KernSmooth} để thay thế. Theo mặc định, điều này ngoại suy 1,5x băng thông theo mỗi hướng. Ngoại suy thêm về nguy hiểm của bạn, và chắc chắn rằng bạn hiểu những gì bạn đang làm và đó là những hạn chế. Nếu bạn thực sự cần ngoại suy, thì có lẽ bạn nên cân nhắc việc gắn dữ liệu vào một mô hình có mối quan hệ với thực tế và tạo thành một cơ sở hợp lý hơn để ngoại suy. – dww

+0

Tôi sẽ thử. Vấn đề là rất khó để chạy một số loại k-folds cross-validation khi không có ngoại suy, bởi vì bất cứ khi nào tôi chia kth fold thành train và test, một số ví dụ thử nghiệm chắc chắn nằm ngoài phạm vi các ví dụ đào tạo. Tôi có phải là người duy nhất thất vọng bởi điều này không? – Hunle

Trả lời

2

Để trả lời câu hỏi ở bên em, nhìn vào mã của ksmooth, range.x chỉ được sử dụng khi x.points không được cung cấp để giải thích lý do tại sao bạn không nhìn thấy nó được sử dụng. Hãy xem xét các mã trong ksmooth:

function (x, y, kernel = c("box", "normal"), bandwidth = 0.5, 
    range.x = range(x), n.points = max(100L, length(x)), x.points) 
{ 
    if (missing(y) || is.null(y)) 
     stop("numeric y must be supplied.\nFor density estimation use density()") 
    kernel <- match.arg(kernel) 
    krn <- switch(kernel, box = 1L, normal = 2L) 
    x.points <- if (missing(x.points)) 
     seq.int(range.x[1L], range.x[2L], length.out = n.points) 
    else { 
     n.points <- length(x.points) 
     sort(x.points) 
    } 
    ord <- order(x) 
    .Call(C_ksmooth, x[ord], y[ord], x.points, krn, bandwidth) 
} 

Từ đó chúng ta thấy rằng chúng ta cần phải không cung cấp x.points để đảm bảo rằng range.x được sử dụng. Nếu bạn chạy:

x <- 1:100 
y <- rnorm(100, mean=(x/2000)^2) 
plot(x,y) 
kernel <- ksmooth(x,y, kernel="normal", bandwidth=10, range.x=c(1,200)) 
plot(kernel$x, kernel$y) 

Bây giờ bạn sẽ thấy hạt nhân của bạn được đánh giá vượt quá 100 (mặc dù không lên đến 200). Việc tăng thông số băng thông cho phép bạn thậm chí xa hơn 100.

Các vấn đề liên quan