当我改变内核密度估计中的带宽时,我不知道为什么cdf有不同的值。在下面的代码中,我从高斯分布生成随机数,并估计数据在选择不同带宽(h)时的核密度。当我对pdf进行集成时,得到的值与1大致不同。因此,看起来pdf取决于在核密度估计中使用的带宽。然而,我发现内核去容估计中的因子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)发布于 2015-05-28 15:42:32
关于带宽的影响,你是对的。随着带宽的增加,估计器的偏差增大,方差减小。计算带宽有一些经验法则。下面我给出一个,你可以看到,在适当的带宽下,估计的密度曲线接近于精确的正常值。对你的功能进行矢量法会使你加速。
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")

https://stackoverflow.com/questions/30510492
复制相似问题