You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R spatstat中基于kppm对象列表实现包络模拟的问题

解决spatstat中kppm对象列表的包络模拟问题

方法1:正确处理kppm对象列表的包络分析

envelope.kppm默认仅支持单个kppm对象,直接传递列表会报错。无需转换为ppm列表再转回,用lapply()遍历列表逐个生成包络即可:

步骤示例

  1. 拟合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)))
})
  1. 自定义单元格内随机位移的模拟函数:
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)
}
  1. 遍历生成包络并合并结果:
# 批量生成包络
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参数:

修复方案

  1. 修改模拟函数,兼容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)
}
  1. 调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:50:46