如何获得特定点的核密度估计值?
Posted
技术标签:
【中文标题】如何获得特定点的核密度估计值?【英文标题】:How can I get the value of a kernel density estimate at specific points? 【发布时间】:2013-04-18 14:08:48 【问题描述】:我正在尝试处理 R 中过度绘图的方法,我想尝试的一件事是绘制单个点,但根据其邻域的密度对它们进行着色。为了做到这一点,我需要计算每个点的 2D 内核密度估计。然而,标准的核密度估计函数似乎都是基于网格的。是否有用于计算我指定的特定点的 2D 内核密度估计的函数?我会想象一个以 x 和 y 向量作为参数并返回密度估计向量的函数。
【问题讨论】:
alpha 混合或更标准的分箱方法(如六边形分箱)不够用有什么具体原因吗? 我希望异常值作为单个点清晰可见。 Alpha belnding 使异常值变得模糊,六边形分箱将它们变成整个六边形而不是单个点。整个网格上的核密度估计对大多数数据都做得很好,但是所有异常点都变成了小高斯“粉扑”,所以我想计算核密度估计并用它来为每个点分配颜色.这将在许多点重叠的地方产生与基于网格的方法基本相同的外观,但会使异常值作为离散点清晰可见。 【参考方案1】:如果我了解您想要做什么,可以通过将平滑模型拟合到网格密度估计值,然后使用它来预测您感兴趣的每个点的密度。例如:
# Simulate some data and put in data frame DF
n <- 100
x <- rnorm(n)
y <- 3 + 2* x * rexp(n) + rnorm(n)
# add some outliers
y[sample(1:n,20)] <- rnorm(20,20,20)
DF <- data.frame(x,y)
# Calculate 2d density over a grid
library(MASS)
dens <- kde2d(x,y)
# create a new data frame of that 2d density grid
# (needs checking that I haven't stuffed up the order here of z?)
gr <- data.frame(with(dens, expand.grid(x,y)), as.vector(dens$z))
names(gr) <- c("xgr", "ygr", "zgr")
# Fit a model
mod <- loess(zgr~xgr*ygr, data=gr)
# Apply the model to the original data to estimate density at that point
DF$pointdens <- predict(mod, newdata=data.frame(xgr=x, ygr=y))
# Draw plot
library(ggplot2)
ggplot(DF, aes(x=x,y=y, color=pointdens)) + geom_point()
或者,如果我只是改变 n 10^6 我们得到
【讨论】:
是的,这正是我想要的。谢谢! 实际上,黄土模型可能会导致值过度平滑。内核密度已经在进行平滑处理。有没有办法从网格值中进行双线性(或双三次)插值? 如果你小心地将 span 参数设置为 loess 到一个相当低的值,你会得到我想的几乎你想要的行为。可能还有其他方法。【参考方案2】:我最终找到了我正在寻找的精确函数:interp.surface
来自 fields
包。来自帮助文本:
使用双线性权重将矩形网格上的值插入到任意位置或另一个网格。
【讨论】:
我知道这是旧的...但是fields::interp.surface
对你有用吗?上面的玩具示例对我不起作用,因为newdata
和interp.surface
输出之间的尺寸不匹配。见***.com/questions/43896337/…。以上是关于如何获得特定点的核密度估计值?的主要内容,如果未能解决你的问题,请参考以下文章