当我更改内核密度估计中的带宽时,我不确切知道为什么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)
答案 0 :(得分: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")