【问题标题】:implementation of transformed KDE in R在 R 中实现转换的 KDE
【发布时间】:2015-12-27 23:52:38
【问题描述】:

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

1) 正则方法(我们观察到 KDE 的边界偏差接近于零)

# sample from exponential distribution
obs=rexp(5e2)
hist(obs,freq=FALSE)
k=density(obs)
lines(k$x,k$y)

2) 转型方法

# 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)

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

我得到了这个可怕的东西

【问题讨论】:

  • 你猜你应该使用pseudo.k$x而不是obs来绘制t.density
  • 刚刚试了一下,结果还是很糟糕...
  • 是的,但是t.density的计算是否正确?
  • 嗯,我是用 KDE 估计伪 obs 的分布,然后除以原始值,这似乎忠实于上面的公式...
  • pseudo.k$x 不起作用,因为它处理转换后的空间,而我们想要在原始空间中绘制一个图

标签: r plot distribution kernel-density


【解决方案1】:

我可以在不使用任何转换的情况下使用 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")

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 2019-09-19
    • 2021-12-21
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多