【问题标题】: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 使异常值变得模糊,六边形分箱将它们变成整个六边形而不是单个点。整个网格上的核密度估计对大多数数据都做得很好,但是所有异常点都变成了小高斯“粉扑”,所以我想计算核密度估计并用它来为每个点分配颜色.这将在许多点重叠的地方产生与基于网格的方法基本相同的外观,但会使异常值作为离散点清晰可见。

标签: r kernel-density


【解决方案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 对你有用吗?上面的玩具示例对我不起作用,因为newdatainterp.surface 输出之间的尺寸不匹配。见stackoverflow.com/questions/43896337/…
猜你喜欢
  • 2015-01-29
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 2019-02-14
  • 2013-01-11
  • 2020-04-23
  • 2017-05-09
  • 1970-01-01
相关资源
最近更新 更多