基于R语言spatstat分析带标记点模式:绿点相对白点的聚集性检验
问题:判断绿点相对白点的聚集性分析方法
我有一份数据集,计划使用R语言的spatstat包进行分析。观测区域为一个多边形,数据的标记为数值型的0和1:标记为0的点(圆形)显示为白色,标记为1的点显示为绿色。我希望分析绿色标记点的分布情况,通过Moran检验或其他量化方法判断其是否存在聚集性。但我的需求是:并非分析绿点相对于整个多边形区域的聚集性,而是判断绿点是否相对白点聚集,请问如何应用Moran检验或其他量化方法完成该分析?
我认为标记为1的点的位置类似事故点呈随机分布,而所有点的位置是固定的(构成多边形),我将其视为观测窗口。
现有代码
x = c(3,0.5,1,0,0,0,2,2.5,5.5, 16,21,26,28,40, 47, 52, 58, 60, 65, 63, 63, 75, 77, 78, 75) y = c(116,106,82.5,64,40,35,25,17.5,5,5,5,8,10,8, 14, 14, 10, 0, 0, 17, 20, 24, 30, 50, 116) p <- owin(poly = cbind(x, y)) point_pattern = as.ppp(deviation_binary_locations_marks, p) marks(point_pattern) <- as.factor(deviation_binary_locations_marks[, "APOD"]) table(marks(point_pattern)) plot(point_pattern,which.marks="APOD", main="Point pattern for gene APOD", chars = c("o","o"), bg = c("white", "green"),pch = 21, size = 0.75, cols = c("black", "green"), leg.side=c("left"))
点模式可视化

可行的分析方法
1. 交叉K函数(Cross K-function)
spatstat自带的crossK函数是分析两类点空间关联的标准工具,直接匹配你的需求:
- 计算K₁₀(r):距离任意白点r范围内的绿点数量期望,用于判断绿点是否倾向于聚集在白点周围
- 代码示例:
# 分离两类点 green <- subset(point_pattern, marks == 1) white <- subset(point_pattern, marks == 0) # 计算交叉K函数,i=1对应绿点,j=0对应白点 cross_k <- crossK(point_pattern, i = 1, j = 0) # 绘图对比实际值与完全空间随机(CSR)的期望值 plot(cross_k, main = "绿点相对于白点的交叉K函数", xlab = "距离r", ylab = "K₁₀(r)")
- 解读:若某一距离r处的实际K值显著高于CSR虚线,说明该尺度下绿点相对白点聚集;低于则说明两者相互排斥。
2. 空间自相关分析(Moran's I)
Moran's I可量化二元标记的空间关联,针对你的需求可按以下方式操作:
- 将所有点的标记(1=绿,0=白)作为变量,计算全局或局部Moran's I,聚焦绿点与周边点的关联
- 代码示例(需加载
spdep包):
library(spdep) # 提取点坐标和标记变量 coords <- coordinates(point_pattern) marks_var <- as.integer(marks(point_pattern)) # 构建空间权重矩阵(这里取距离5以内的邻居,可根据实际调整) neighbors <- dnearneigh(coords, d1 = 0, d2 = 5) weight <- nb2listw(neighbors, style = "W") # 全局Moran's I检验,判断整体是否存在聚集 moran.test(marks_var, weight) # 局部Moran's I,查看每个绿点的局部关联情况 local_moran <- localmoran(marks_var, weight) green_local_moran <- local_moran[marks_var == 1, ]
- 解读:局部Moran's I值显著为正的绿点,说明其周边区域绿点占比更高,即相对白点聚集;显著为负则说明周边白点更多。
3. 最近邻距离检验
通过对比绿点到最近白点的实际距离与随机分布下的期望距离,判断绿点是否偏向白点:
- 代码示例:
# 计算每个绿点到最近白点的距离 actual_dist <- nndist(green, white) # 生成与绿点数量相同的随机点,计算其到最近白点的距离 random_green <- rpoint(npoints(green), win = p) random_dist <- nndist(random_green, white) # Wilcoxon秩和检验,判断实际距离是否显著小于随机期望 wilcox.test(actual_dist, random_dist, alternative = "less")
- 解读:若检验结果显著(p值<0.05),说明绿点到白点的距离比随机情况更近,即相对白点聚集;反之则是排斥。
关键注意事项
- 确认观测窗口的准确性:多边形窗口需完全覆盖所有点,后续分析结果才可靠
- 若白点本身在窗口内分布不均匀,建议使用
crossKinhom(非齐次交叉K函数)替代crossK,消除白点分布异质性的影响
内容的提问来源于stack exchange,提问作者MK Huda
相关产品推荐
相关产品推荐

