CDF取决于核密度估计中使用的带宽?
CDF depending on the bandwidth used in kernel density estimation?
我不知道为什么当我在核密度估计中改变带宽时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)
关于带宽的影响,你是对的。随着带宽增加,估计器的偏差增加,而方差减小。计算带宽有一些经验法则。我在下面给出了一个,你可以看到在适当的带宽下,估计的密度曲线接近正态分布。向量化你的函数会给你一个加速
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")
我不知道为什么当我在核密度估计中改变带宽时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)
关于带宽的影响,你是对的。随着带宽增加,估计器的偏差增加,而方差减小。计算带宽有一些经验法则。我在下面给出了一个,你可以看到在适当的带宽下,估计的密度曲线接近正态分布。向量化你的函数会给你一个加速
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")