【问题标题】:Extracting data points within overlapping kdes using R 'ks' package使用 R 'ks' 包提取重叠 kdes 内的数据点
【发布时间】:2017-01-11 00:52:03
【问题描述】:

我正在使用 R 中的 ks 包,并且想要确定哪些位置数据点落在重叠的 2d 内核轮廓区域内(我正在比较两个不同物种家庭范围的 UD)。下面有一个例子(修改自:http://www.rdocumentation.org/packages/ks/versions/1.5.3/topics/plot.kde?)。

我要生成的是一个列表,其中列出了 fhatx 轮廓内的所有 y 点(例如黑线内的黄点)。反之亦然,我想要一个落在 fhaty 等高线内的 x 坐标列表。

library(ks)
x <- rmvnorm.mixt(n=100, mus=c(0,0), Sigmas=diag(2), props=1)
Hx <- Hpi(x)
fhatx <- kde(x=x, H=Hx) 
y <- rmvnorm.mixt(n=100, mus=c(0.5,0.5), Sigmas=0.5*diag(2), props=1)
Hy <- Hpi(y)
fhaty <- kde(x=y, H=Hy)
contourLevels(fhatx, cont=c(75, 50, 25))
contourSizes(fhatx, cont=25, approx=TRUE)
plot(fhatx, cont=c(50,95), drawpoints=TRUE)
plot(fhaty, cont=c(50,95), col=3, drawpoints=TRUE,col.pt="yellow", add=TRUE)

【问题讨论】:

  • 您应该向reproducible example 提供可用于测试可能解决方案的样本数据。更容易为您提供帮助,让您更清楚想要的结果是什么。
  • 你是对的,谢谢。我用一个可重现的例子更新了它。

标签: r polygon kde


【解决方案1】:

kde 的输出可以转换为栅格,然后您可以使用rasterToPolygons 函数从那里提取任何轮廓。将点转换为 sp 包可识别的格式后,您可以使用 gIntersection 函数查看空间对象之间的任何类型的交集。

您最终会得到两个 SpatialPoints 对象 x.inYy.inX,它们包含包含在 fhaty 50% 轮廓内的 x 点,反之亦然。可以使用coordinates(...) 将这些点的坐标提取到一个数组中。

这可能不是最优雅的解决方案,但如果kde 函数释放的数组不太大,它应该可以正常工作。

我希望这会有所帮助。

第 1 步:将输出从 kde 转换为光栅对象

# for the x kde
arrayX <- expand.grid(list(fhatx$eval.points[[1]],fhatx$eval.points[[2]]))
arrayX$z <- as.vector(fhatx$estimate)
rasterX <- rasterFromXYZ(arrayX)
# for the y kde
arrayY <- expand.grid(list(fhaty$eval.points[[1]],fhaty$eval.points[[2]]))
arrayY$z <- as.vector(fhaty$estimate)
rasterY <- rasterFromXYZ(arrayY)

STEP 2:在 0 到 100 之间重新缩放栅格,然后将 50 等高线内的所有像元转换为 1。当然等高线可以更改为 95 或其他值

#for raster x
rasterX <- rasterX*100/rasterX@data@max
rasterX[rasterX[]<=50,] <- NA
rasterX[rasterX[]>50,] <- 1
#[enter image description here][1]for raster y
rasterY <- rasterY*100/rasterY@data@max
rasterY[rasterY[]<=50,] <- NA
rasterY[rasterY[]>50,] <- 1

第三步:提取50%轮廓对应的多边形

polyX50<-rasterToPolygons(rasterX, n=16, na.rm=T, digits=4, dissolve=T)
polyY50<-rasterToPolygons(rasterY, n=16, na.rm=T, digits=4, dissolve=T)

第 4 步:将点转换为空间对象以使用 sp 库

x.points <- SpatialPoints(x)
y.points <- SpatialPoints(y)

第 5 步:定位与一个多边形或另一个多边形相交的点

#x points falling in fhatx 50 contour
x.inY <- gIntersection(x.points, polyY50)
#y points falling in fhatx 50 contour
y.inX <- gIntersection(y.points, polyX50)

剧情

par(mfrow=c(1,2))
plot(fhatx, cont=c(50,95), col="red")
plot(fhaty, cont=c(50,95), col="green",add=TRUE)
plot(x.points, col="red", add=T)
plot(y.points, col="green", add=T)

plot(fhatx, cont=c(50,95), col="red")
plot(fhaty, cont=c(50,95), col="green",add=TRUE)
plot(x.inY, col="red", add=T)
plot(y.inX, col="green", add=T)

【讨论】:

  • 完美。谢谢。
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
相关资源
最近更新 更多