使用R''提取重叠kdes内的数据点。包

时间:2016-09-02 20:31:48

标签: r polygon kde

我在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)

1 个答案:

答案 0 :(得分:0)

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

最终得到两个SpatialPoints对象x.inYy.inX,其中包含50%fhaty轮廓中的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)

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

步骤3:提取对应于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)