在R spatstat中基于kppm对象列表实现包络模拟的问题
解决spatstat中kppm对象列表的包络模拟问题
方法1:正确处理kppm对象列表的包络分析
envelope.kppm默认仅支持单个kppm对象,直接传递列表会报错。无需转换为ppm列表再转回,用lapply()遍历列表逐个生成包络即可:
步骤示例
- 拟合kppm对象列表(确保每个模型结构正确):
library(spatstat) # 生成5组网格点数据 grid_points <- runifpoint(100, win = owin(c(0,10), c(0,10)), nsim = 5) # 定义5x5单元格网格 cells <- tess(xgrid = seq(0,10,2), ygrid = seq(0,10,2)) # 批量拟合kppm模型 kppm_list <- lapply(grid_points, function(x) { kppm(x ~ 1, clusters = "Thomas", win = owin(c(0,10), c(0,10))) })
- 自定义单元格内随机位移的模拟函数:
sim_cell_shift <- function(model) { obs <- model$data # 匹配每个点所属单元格 cell_ids <- tile.index(obs, cells) # 按单元格拆分点集并随机位移 shifted_points <- rsplit(obs, cell_ids) |> lapply(function(p) { cell_win <- tiles(cells)[[attr(p, "split")]] shift(p, dx = runif(npoints(p), cell_win$xrange[1] - p$x, cell_win$xrange[2] - p$x), dy = runif(npoints(p), cell_win$yrange[1] - p$y, cell_win$yrange[2] - p$y)) }) |> do.call(c, args = _) return(shifted_points) }
- 遍历生成包络并合并结果:
# 批量生成包络 envelope_list <- lapply(kppm_list, function(kppm_obj) { envelope(kppm_obj, fun = Kest, nsim = 99, simulate = sim_cell_shift, savefuns = TRUE, verbose = FALSE) }) # 合并包络用于批量可视化(可选) combined_env <- do.call(bind.envelope, envelope_list) plot(combined_env)
方法2:修复自定义模拟函数导致的空模型异常
空模型(红色虚线)出现折角,是因为自定义函数未适配空模型的生成逻辑。需让函数兼容kppm和CSR空模型,或显式指定nullmodel参数:
修复方案
- 修改模拟函数,兼容kppm和ppm(空模型类型):
sim_cell_shift_csr <- function(model) { # 提取原始点数据,兼容kppm和ppm模型 obs <- if(inherits(model, "kppm")) model$data else model$data cell_ids <- tile.index(obs, cells) shifted_points <- rsplit(obs, cell_ids) |> lapply(function(p) { cell_win <- tiles(cells)[[attr(p, "split")]] shift(p, dx = runif(npoints(p), cell_win$xrange[1] - p$x, cell_win$xrange[2] - p$x), dy = runif(npoints(p), cell_win$yrange[1] - p$y, cell_win$yrange[2] - p$y)) }) |> do.call(c, args = _) return(shifted_points) }
- 调用
envelope()时显式指定空模型为CSR:
# 生成单个kppm的包络,修复空模型异常 fixed_envelope <- envelope(kppm_list[[1]], fun = Kest, nsim = 99, simulate = sim_cell_shift_csr, nullmodel = "random", # 强制使用CSR空模型 savefuns = TRUE) plot(fixed_envelope)
核心注意事项
- 单元格网格需提前定义并保持全局一致,避免模拟位移范围出错。
- 空模型本质是ppm类型的CSR模型,模拟函数需能正确提取其点数据。
- 显式指定
nullmodel = "random"可确保空模型的模拟逻辑符合标准CSR,避免异常折线。
内容的提问来源于stack exchange,提问作者proximacentauri
相关产品推荐
相关产品推荐

