Kernel Density Estimation - 将图例比例更改为每平方米的密度

Posted

技术标签:

【中文标题】Kernel Density Estimation - 将图例比例更改为每平方米的密度【英文标题】:Kernel Density Estimation - change legend scale to density per m² 【发布时间】:2020-08-26 21:56:43 【问题描述】:

我在 R 中计算了一个物种的核密度估计 (KDE),我正在使用来自 spatstatants 数据集(蚁巢) /em> 在这里为简单起见,我想要一个图例比例,其中包含每个测量单位(例如 m²)的蚁巢数量。如果我理解正确,KDE 图例显示了 0 到 1 之间的概率密度,我如何将这个概率转换为“真实世界”密度,例如每平方米的点数(蚁巢)?

enter image description here

这里是例子:

require("spatstat")
data(ants)
dat <- ants

# estimate bandwith
h_cox <- bw.diggle(dat)

# calculate KDE
kd_cox <- density(dat, h_cox, diggle=TRUE, se=TRUE, eps=diff(dat$window$xrange)/500)

# Plot KDE, contours and points
plot(kd_cox$estimate, main="KDE ants bw.diggle")
contour(kd_cox$estimate, labels="", add=TRUE, col=gray(.5)) 
points(dat)

【问题讨论】:

您正在使用spatstat 包中的函数density.ppp,它是泛型函数density 的一个方法。 density.ppp 的帮助说它计算了点模式的强度的内核估计,以“每单位面积的点数”表示。所以,这个功能已经在做你想做的事了。您只需要确保点模式数据以米为单位。 @EgeRubak 的答案解释了如何。 请注意,概率密度不是介于 0 和 1 之间的值。Probabilities 是介于 0 和 1 之间的值。概率 density 是一个函数必须对其进行积分以获得概率值。概率密度可以大于1。概率密度图下的总面积或体积等于1。 @AdrianBaddeley:谢谢你的解释!我应该更仔细地阅读帮助页面。 【参考方案1】:

感谢您对示例数据提出明确的问题。

library(spatstat)

原始ants 数据以 0.5 英尺为单位给出:

ants
#> Marked planar point pattern: 97 points
#> Multitype, with levels = Cataglyphis, Messor 
#> window: polygonal boundary
#> enclosing rectangle: [-25, 803] x [-49, 717] units (one unit = 0.5 feet)

因此,原始帖子中的代码以点数给出强度 每“平方 0.5 英尺”,即每“四分之一平方英尺”的点数。 使用不带参数的rescale 来获得通常的脚:

ants_ft <- rescale(ants)
ants_ft
#> Marked planar point pattern: 97 points
#> Multitype, with levels = Cataglyphis, Messor 
#> window: polygonal boundary
#> enclosing rectangle: [-12.5, 401.5] x [-24.5, 349.5] feet

使用rescale 与转换因子和名称来获取米:

ants_m <- rescale(ants_ft, 3.2808399, "m")
ants_m
#> Marked planar point pattern: 97 points
#> Multitype, with levels = Cataglyphis, Messor 
#> window: polygonal boundary
#> enclosing rectangle: [-3.81, 122.3772] x [-7.4676, 106.5276] m

研究区域的面积和每平方米的平均点数:

area(ants_m)
#> [1] 9962.028
intensity(ants_m)
#> Cataglyphis      Messor 
#> 0.002911054 0.006825920
intensity(unmark(ants_m))
#> [1] 0.009736973

使用dat &lt;- ants_m 重新运行原始代码会给你 每平方米点数的估计强度:

dat <- ants_m
# estimate bandwith
h_cox <- bw.diggle(dat)
#> Warning: Berman-Diggle Cross-Validation criterion was minimised at right-hand
#> end of interval [0, 7.11]; use argument 'hmax' to specify a wider interval for
#> bandwidth 'sigma'
# calculate KDE
kd_cox <- density(dat, h_cox, diggle=TRUE, se=TRUE, eps=diff(dat$window$xrange)/500)
# Plot KDE, contours and points
plot(kd_cox$estimate, main="KDE ants bw.diggle")
contour(kd_cox$estimate, labels="", add=TRUE, col=gray(.5)) 
points(dat)

【讨论】:

感谢您的详细回答。问题解决了。 是否有直观的方法来反查,是否估算出合理的密度? 是的,您可以计算应该接近 npoints / area 的平均强度 (mean(kd_cox$estimate)) 或应该接近总点数的积分 (integral(kd_cox$estimate))。跨度>

以上是关于Kernel Density Estimation - 将图例比例更改为每平方米的密度的主要内容,如果未能解决你的问题,请参考以下文章

核密度估计Kernel Density Estimation(KDE)概述 密度估计的问题

用深度学习做crowd density estimation

泡泡一分钟:Geometric and Physical Constraints for Drone-Based Head Plane Crowd Density Estimation

R语言绘制核密度图实战(Kernel Density Plot)

R008 基本图形-核密度图plot(density())

Qcom android L ro.sf.lcd_density属性修改