我最初的目标是绘制单个点的种群,然后绘制一个凸包,包围 80% 的人口,以人口的质量为中心。
在尝试了许多想法之后,我想出的最佳解决方案是使用ggplot
's stat_density2d
. 虽然这对于定性分析很有用,但我仍然需要指出 80% 的边界。我开始寻找一种方法来勾勒 80% 的人口边界,但我可以以 80% 的概率工作密度边界来代替。
这里是我寻求帮助的地方。(用于)的bin
参数没有明确记录。如果我在下面的示例中设置 = 4,我是否正确地将中央(绿色)区域解释为包含 25% 的概率质量,而黄色、红色和绿色的组合区域代表 75% 的概率质量?如果是这样,通过将 bin 更改为 = 5,内接区域是否等于 80% 的概率质量?kde2d
stat_density2d
bin
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
我重复了一些测试用例并手动计算了排除的点[希望找到一种方法来根据它们所包含的 ..level.. 来计算它们] 但是考虑到数据的随机性(我的真实数据和测试数据)该区域外的点数stat_density2d
变化足以需要寻求帮助。
总而言之,是否有一种实用的方法可以在数据框中的中心 80% 的点人口周围绘制一个多边形?或者,除此之外,我是否可以安全使用stat_density2d
并将 bin 设置为 5 以产生 80% 的概率质量?
Bryan Hanson 的出色回答消除了我可以bin
在stat_density2d
. 结果看起来接近bin
4 到 6 左右的值,但正如他所说,实际功能是未知的,因此无法使用。
我使用 DWin 接受的答案中提供的 HDRegionplot 来解决我的问题。为此,我从包中添加了重心 ( COGravity
) 和多边形中的点 ( )以完成分析。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