R中spatstat点格局空间随机性分析envelope函数报错求解
报错根因
触发Window containing simulated patterns is not a subset of data window报错的直接原因是观测点模式与模拟点模式的分析窗口不统一:
- 创建
coords.ppp_1时手动传入的是覆盖瑞典全域的矩形坐标范围作为窗口,没有绑定瑞典实际国界多边形 - 后续模拟完全空间随机点时使用的
sw是瑞典国界转换得到的不规则多边形窗口,范围小于前述矩形窗口,不满足envelope函数要求的「模拟点窗口必须完全包含于观测点窗口」的校验规则。
原有代码还存在一处逻辑问题:模拟点数量取的是去重前的原始点个数,但实际分析用的是去重后的点集,二者样本量不一致会导致结果偏差。
修正方案
直接将瑞典国界多边形作为观测点模式的窗口,统一分析边界,修正后可运行代码如下:
library(rworldmap) library(sp) library(spatstat) library(maptools) # 读取并投影瑞典边界 worldmap <- getMap(resolution = "high") sweden <- worldmap[which(worldmap$SOVEREIGNT == "Sweden"),] crs.laea <- CRS("+proj=utm +zone=33 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs") sweden_proj <- spTransform(sweden, crs.laea) # 转换为spatstat兼容的owin对象,添加snap参数修复微小拓扑裂隙 sw <- as.owin(sweden_proj, snap = 1e-5) # 观测点坐标 x <- c(669894, 669894, 669894, 671088, 671117, 671117, 671117, 670513, 670513, 670513, 669921, 669310, 669310, 669310, 669303, 629720, 630318, 630925, 630925, 630925) y <- c(7116684, 7116684, 7116684, 7116706, 7114900, 7114900, 7114900, 7114896, 7114896, 7114896, 7114888, 7115473, 7115473, 7115473, 7116075, 7131172, 7131180, 7131190, 7131190, 7131190) # 关键修正:创建ppp对象时直接绑定瑞典国界窗口,不再手动设置矩形范围 coords.ppp_1 <- ppp(x, y, window = sw) # 去除重复点 coords.ppp <- unique(coords.ppp_1) # 校验:确认所有点都落在研究区窗口内,正常运行应返回TRUE all(inside.owin(coords.ppp$x, coords.ppp$y, sw)) # 模拟与包络线计算 n <- npoints(coords.ppp) # 取去重后的实际点数量作为模拟样本量 ex <- expression(runifpoint(n, win = sw)) set.seed(1) res <- envelope(coords.ppp, Gest, nsim = 99, simulate = ex, verbose = FALSE, savefuns = TRUE) plot(res)
补充说明
- 如果转换owin时提示多边形拓扑错误,可先运行
sweden_proj <- rgeos::gBuffer(sweden_proj, byid=TRUE, width=0)修复边界自相交、裂隙等问题后再做转换 - 所有基于spatstat的点模式分析都必须保证观测点、模拟点的分析窗口完全一致,手动设置矩形窗口仅适用于研究区本身为矩形的采样场景,针对不规则研究区必须传入实际边界作为窗口,否则分析结果会存在系统性偏差。
内容的提问来源于stack exchange,提问作者ZsReka
相关产品推荐
相关产品推荐

