CDF в зависимости от полосы пропускания, используемой при оценке плотности ядра?

Я не знаю точно, почему cdf имеет разные значения, когда я изменяю пропускную способность в оценке плотности ядра. В приведенном ниже коде я генерирую случайные числа из гауссовского распределения и оцениваю плотность ядра данных при выборе различных полос пропускания (h). Когда я интегрирую pdf, я получаю разные значения, более или менее далекие от 1. Таким образом, кажется, что CDF зависит от полосы пропускания, используемой при оценке плотности ядра. Тем не менее, я полагал, что коэффициент 1 / nh в оценке плотности ядра гарантирует, что PDF-файл интегрируется до 1. Если пропускная способность является проблемой, как я могу определить его, чтобы гарантировать, что результирующий PDF-файл интегрируется до 1?

g<-1
n<-1000
set.seed(g)
df <- data.frame(x=sort(rnorm(n,0,1))) 

library(functional)

gaussianKernel <- function(u) exp(-u^2/2)/(2*pi)^.5

densityFunction <- function(x, df, ker, h){
    difference = t(t(df) - x)/h
    W = sum(apply(difference, 1, ker)) / (nrow(df)*h)
}

myDensityFunction <- Curry(densityFunction, df=df, ker=gaussianKernel, h=2)

vect<-vector()
for (i in 1:length(df$x)){
f<-myDensityFunction(df$x[i])
vect<-c(vect,f)
}

f <- approxfun(df$x, vect, yleft = 0, yright = 0)
integrate(f, -Inf, Inf)

person Lio    schedule 28.05.2015    source источник


Ответы (1)


Вы правы насчет эффекта пропускной способности. По мере увеличения полосы пропускания смещение оценщика увеличивается, а дисперсия уменьшается. Есть несколько практических правил для расчета пропускной способности. Я привожу один ниже, и вы можете видеть, что при правильной полосе пропускания расчетная кривая плотности приближается к точной норме. Векторизация ваших функций даст вам ускорение

kernel <- function(u) exp(-u^2/2) / (2*pi)^.5
dens <- Vectorize(function(x, df, ker, h) {
    1/(h*nrow(df)) * sum(ker((df-x)/h))
}, vec="x")

b <- 1.06*(min(1, IQR(df$x)/1.34))*n^(-1/5)  # bandwidth rule-of-thumb
vect <- dens(df$x, df=df, kernel, b)
f <- approxfun(df$x, vect, yleft=0, yright=0)
integrate(f, -Inf, Inf)
# 0.9991092 with absolute error < 0.00012

nvals <- dnorm(df$x)
plot(df$x, nvals)
points(df$x, vect, col="azure3")

введите описание изображения здесь

person Rorschach    schedule 28.05.2015
comment
6pool, спасибо вам большое. Я понимаю, что мне нужно выбрать полосу пропускания, такую ​​как CDF может интегрироваться до 1 (это единственное ограничение, которое нужно удовлетворить?). Таким образом, я также могу оптимизировать пропускную способность при этом ограничении. Я прав? - person Lio; 29.05.2015