如何正确解释ggplot的stat_density2d

jcl*_*use 11 r ggplot2

我最初的目标是绘制一个单独的点群,然后绘制一个凸起的船体,其中80%的人口集中在人口的质量上.

在尝试了一些想法之后,我想出的最佳解决方案是使用ggplot's stat_density2d.虽然这对于定性分析非常有用,但我仍然需要指出80%的边界.我开始寻找一种方法来勾勒出80%的人口边界,但我可以使用80%的概率密度边界.

这是我在寻求帮助的地方.(使用者)的bin参数没有明确记录.如果我在下面的例子中设置= 4,我是否正确地将中心(绿色)区域解释为包含25%概率质量而组合的黄色,红色和绿色区域表示75%概率质量?如果是这样,通过将bin更改为= 5,那么内接区域是否会等于80%的概率质量?kde2dstat_density2dbin

set.seed(1)
n=100

df <- data.frame(x=rnorm(n, 0, 1), y=rnorm(n, 0, 1))

TestData <- ggplot (data = df) +
  stat_density2d(aes(x = x, y = y, fill = as.factor(..level..)), 
  bins=4, geom = "polygon", ) +
  geom_point(aes(x = x, y = y)) +
  scale_fill_manual(values = c("yellow","red","green","royalblue", "black"))

TestData
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我重复了一些测试用例并手动计算了被排除的点[希望找到一种方法来计算它们基于...它们被包含在内的......等级]但是考虑到数据的随机性(我的真实数据和测试数据)该stat_density2d区域以外的点数变化足以保证寻求帮助.

总而言之,是否有一种实用的方法可以在数据框中的80%中心点周围绘制多边形?或者说,我可以安全使用stat_density2d并将bin设置为5以产生80%的概率质量?


布莱恩汉森的优秀答案消除了模糊的概念,即我可以传递一个未记录的bin参数stat_density2d.结果看起来接近bin4到6左右的值,但正如他所说,实际功能是未知的,因此无法使用.

我使用了DWin接受的答案中提供的HDRegionplot来解决我的问题.为此,我添加了一个重心(COGravity)并指向包中的polygon(pnt.in.poly)SDMTools以完成分析.

library(MASS)
library(coda)
library(SDMTools)
library(emdbook)
library(ggplot2)


theme_set(theme_bw(16))
set.seed(1)
n=100

df <- data.frame(x=rnorm(n, 0, 1), y=rnorm(n, 0, 1))

HPDregionplot(mcmc(data.matrix(df)), prob=0.8)
with(df, points(x,y))
ContourLines <- as.data.frame(HPDregionplot(mcmc(data.matrix(df)), prob=0.8))
df$inpoly <- pnt.in.poly(df, ContourLines[, c("x", "y")])$pip

dp <- df[df$inpoly == 1,]
COG100 <- as.data.frame(t(COGravity(df$x, df$y)))
COG80 <- as.data.frame(t(COGravity(dp$x, dp$y)))

TestData <- ggplot (data = df) +
  stat_density2d(aes(x = x, y = y, fill = as.factor(..level..)), 
  bins=5, geom = "polygon", ) +
  geom_point(aes(x = x, y = y, colour = as.factor(inpoly)), alpha = 1) +
  geom_point(data=COG100, aes(COGx, COGy),colour="white",size=2, shape = 4) +
  geom_point(data=COG80, aes(COGx, COGy),colour="green",size=4, shape = 3) +
  geom_polygon(data = ContourLines, aes(x = x, y = y), color = "blue", fill = NA) +
  scale_fill_manual(values = c("yellow","red","green","royalblue", "brown", "black", "white", "black", "white","black")) +
  scale_colour_manual(values = c("red", "black"))
TestData 
nrow(dp)/nrow(df) # actual number of population members inscribed within the 80% probability polgyon
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

42-*_*42- 2

package:emdbook 中的 HPDregionplot 应该可以做到这一点。它确实使用 MASS::kde2d 但它标准化了结果。我认为它的缺点是它需要 mcmc 对象。

library(MASS)
library(coda)
HPDregionplot(mcmc(data.matrix(df)), prob=0.8)
with(df, points(x,y))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述