Băng thông tối ưu cho ước tính đạo hàm sẽ khác với băng thông cho ước tính mật độ. Nói chung, mọi tính năng của mật độ đều có bộ chọn băng thông tối ưu riêng.
Nếu mục tiêu của bạn là giảm thiểu lỗi bình phương tích hợp trung bình (là tiêu chí thông thường) thì không có gì chủ quan về nó. Đó là vấn đề lấy được giá trị làm giảm thiểu tiêu chí. Các phương trình được đưa ra trong Phần 2.10 của Hansen (2009) .
Phần khó khăn là băng thông tối ưu là một hàm của chính mật độ, vì vậy giải pháp này không hữu ích trực tiếp. Có một số phương pháp xung quanh để cố gắng giải quyết vấn đề đó. Chúng thường xấp xỉ một số chức năng của mật độ bằng cách sử dụng xấp xỉ bình thường. (Lưu ý, không có giả định rằng chính mật độ là bình thường. Giả định là một số chức năng của mật độ có thể thu được giả định tính quy tắc.)
Trường hợp các giá trị gần đúng được áp đặt sẽ xác định mức độ tốt của bộ chọn băng thông. Cách tiếp cận thô sơ nhất được gọi là "quy tắc tham chiếu bình thường" áp đặt mức gần đúng ở mức cao. Phần cuối của Phần 2.10 trong Hansen (2009) đưa ra công thức sử dụng phương pháp này. Cách tiếp cận này được thực hiện trong hns()
chức năng từ ks
gói trên CRAN. Đó có lẽ là điều tốt nhất bạn sẽ nhận được nếu bạn không muốn viết mã của riêng mình. Vì vậy, bạn có thể ước tính đạo hàm của mật độ như sau (sử dụng ks
):
library(ks)
h <- hns(x,deriv.order=1)
den <- kdde(x, h=h, deriv.order=1)
Một cách tiếp cận tốt hơn, thường được gọi là bộ chọn "cắm trực tiếp", áp đặt xấp xỉ ở mức thấp hơn. Để ước tính mật độ thẳng, đây là phương pháp Sheather-Jones, được thực hiện trong R bằng cách sử dụng density(x,bw="SJ")
. Tuy nhiên, tôi không nghĩ rằng có một cơ sở tương tự có sẵn trong bất kỳ gói R nào để ước tính đạo hàm.
Thay vì sử dụng ước lượng nhân thẳng, bạn có thể tốt hơn với công cụ ước lượng đa thức cục bộ. Điều này có thể được thực hiện bằng cách sử dụng locpoly()
hàm từ ks
gói trong R. Một lần nữa, không có lựa chọn băng thông tối ưu nào được thực hiện, nhưng độ lệch sẽ nhỏ hơn so với các công cụ ước tính kernel. ví dụ,
den2 <- locpoly(x, bandwidth=?, drv=1) # Need to guess a sensible bandwidth