2015-05-28 39 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

你说的对带宽的影响是正确的。随着带宽的增加,估计量的偏差增加,而方差减小。有一些经验法则来计算带宽。我在下面给出一个,你可以看到,在适当的带宽下,估计的密度曲线接近确切的法线。矢量化的功能,会给你一个加速

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(是满足的唯一约束?)。所以,我也可以在这个约束下优化带宽。我对么? – Lio