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 <- 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