转换KDE在R中的实现

转换KDE在R中的实现,r,plot,distribution,kernel-density,R,Plot,Distribution,Kernel Density,我遵循的步骤是在有界支持上实现转换的核密度估计(KDE)[0,+inf[。我们使用转换技巧来避免传统KDE在有界支持上的边界偏差(在这种情况下,接近零)。基本上,KDE将权重分配给不存在的观测值(在支持之外),因此它严重低估了边界处的PDF(如下图所示) 1)常规方法(我们观察到KDE接近零的不良边界偏差) 2)转换方法 而不是像我应该得到的那样得到类似下面蓝线的东西 我得到了这个可怕的东西 我可以在我愚蠢的时候使用KDE而不使用任何转换,因为它是无限的。下面是一些有效的代码: # eve

我遵循的步骤是在有界支持上实现转换的核密度估计(KDE)
[0,+inf[
。我们使用转换技巧来避免传统KDE在有界支持上的边界偏差(在这种情况下,接近零)。基本上,KDE将权重分配给不存在的观测值(在支持之外),因此它严重低估了边界处的PDF(如下图所示)

1)常规方法(我们观察到KDE接近零的不良边界偏差)

2)转换方法

而不是像我应该得到的那样得到类似下面蓝线的东西

我得到了这个可怕的东西
我可以在我愚蠢的时候使用KDE而不使用任何转换,因为它是无限的。下面是一些有效的代码:

# everything before is the same
# 2) estimate the density of the pseudo obs with KDE
pseudo.k=approxfun(density(pseudo.obs))
# 3) estimate the density of the original obs
seq=seq(min(obs),max(obs),length.out=500)
t.density=as.numeric(vector(length=length(seq)))
for (i in 1:length(seq)){
x=seq[i]
t.density[i]=pseudo.k(log(x))/x
}
# plot result
lines(seq,t.density,col="red")

你猜你应该使用类似于
pseudo.k$x
的东西,而不是
obs
来绘制
t.density
。刚刚尝试过,它仍然会给出糟糕的结果……是的,但是
t.density
的计算正确吗?我正在用KDE估计伪obs的分布,然后除以原始值,w它似乎忠实于上面的公式…
pseudo.k$x
不起作用,因为它处理的是变换后的空间,而我们需要在原始空间中绘制
# 1) log transform the obs
pseudo.obs=log(obs)
# 2) estimate the density of the pseudo obs with KDE
pseudo.k=density(pseudo.obs,n=length(obs))
# 3) estimate the density of the original obs
t.density=pseudo.k$y/obs
# plot estimation
lines(obs,t.density)
# everything before is the same
# 2) estimate the density of the pseudo obs with KDE
pseudo.k=approxfun(density(pseudo.obs))
# 3) estimate the density of the original obs
seq=seq(min(obs),max(obs),length.out=500)
t.density=as.numeric(vector(length=length(seq)))
for (i in 1:length(seq)){
x=seq[i]
t.density[i]=pseudo.k(log(x))/x
}
# plot result
lines(seq,t.density,col="red")