2015-05-28 5 views
1

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

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) 

ответ

1

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

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

enter image description here

+0

6pool, спасибо очень много. Я понимаю, что мне нужно выбрать пропускную способность, например, CDF может интегрироваться в 1 (это единственное ограничение, которое нужно выполнить?). Таким образом, я также могу оптимизировать bandwidwth под этим ограничением. Я прав? – Lio