【问题标题】:CDF depending on the bandwidth used in kernel density estimation?CDF取决于内核密度估计中使用的带宽?
【发布时间】:2015-08-11 04:38:37
【问题描述】:

当我更改内核密度估计中的带宽时,我不知道为什么 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)

【问题讨论】:

    标签: r kernel bandwidth kernel-density cumulative-sum


    【解决方案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")
    

    【讨论】:

    • 6pool,非常感谢。我的理解是我必须选择一个带宽,例如 CDF 可以集成到 1(是唯一要满足的约束吗?)。所以,我也可以在这个约束下优化带宽。我说的对吗?
    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 2015-10-07
    • 2021-07-11
    • 2015-09-22
    • 2016-07-19
    • 2017-12-13
    • 2017-12-31
    • 1970-01-01
    相关资源
    最近更新 更多