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

如何可视化spatstat中gam拟合的多点点过程模型变量效应?

问题

我正在使用spatstat(版本3.0-7)中的gam拟合多点点过程模型,调用形式为:

mppm(formula, data=hyperframe, eps=0.5, rbord=0.5, use.gam=TRUE)

该模型为泊松过程。我希望在拟合完成后绘制:

  • 类似mgcv::plot.gam风格的指定预测变量效应图
  • 空间趋势图

但使用相关函数时出现报错:

  • effectfun():Error: First argument 'model' should be a fitted model of class ‘ppm’, ‘kppm’, ‘lppm’, ‘dppm’, ‘rppm’ or ‘profilepl’
  • plot.mppm():Error: This calculation is not supported for GAM fits

我考虑了两种 workaround 方案:

spatstat中的子拟合方法

  • 为hyperframe中的每个模式单独用ppm重新拟合模型(因subfits对gam无效),但可能需为每个模式独立调整k参数
  • 对每个单独拟合的ppm模型使用effectfun()和plot(),但担心各模式的样条形状不同,增加解读难度

修改mppm并使用mgcv

  • 运行指定的use.gam=TRUE的mppm模型
  • 通过my_model$Fit$moadf提取mppm对象中的数据框
  • 使用mppm内部调用的形式,用mgcv::gam拟合模型:
gam(fmla, family = quasi(link = log, variance = mu), weights = .mpl.W * caseweight, data = moadf, subset = (.mpl.SUBSET == "TRUE"), control = ctrl)
  • 此时可使用mgcv函数绘制所需的预测变量效应图

我的问题:上述方案是否可行?哪种更优?或有无其他更好的方法实现需求?

回答

方案可行性分析

两种方案都可行,但各有优劣:

  1. 子拟合方法
    • 可行,但缺点明显:每个模式单独拟合ppm会破坏原mppm模型的整体推断逻辑(原模型是在统一框架下估计所有模式的参数、共享部分结构),而且每个模式调k参数会大幅增加工作量,不同模式的样条差异也确实会让结果解读变得混乱,除非你本来就想对比各模式的独立效应,否则不推荐。
  2. 提取moadf用mgcv重拟合
    • 完全可行,这其实是利用了mppm(use.gam=TRUE)内部本来就调用mgcv::gam的机制。提取的moadf包含了原模型的所有加权、子集信息,用相同的公式和参数重拟合后,得到的模型结果和原mppm的核心估计一致,此时直接用mgcv::plot.gam就能生成你要的效应图,空间趋势图也可以通过predict.gam结合网格数据再可视化实现。

更优方案推荐

优先选第二种方案,理由:

  • 保留了原mppm的统一建模框架,参数估计和原模型一致,不会出现子拟合带来的推断偏差
  • 直接复用mgcv的成熟绘图功能,完全满足你的可视化需求
  • 不需要额外调整大量参数,工作量远小于子拟合方法

额外提示

重拟合时注意:

  • 确保fmla和原mppm的公式完全一致
  • ctrl参数可以直接从原mppm模型中提取(my_model$Fit$ctrl),避免手动设置出错
  • 绘制空间趋势图时,可以用spatstat::as.mask生成研究区域的网格,然后将网格坐标作为新数据传入predict.gam,再用image.plot或ggplot2可视化预测值

内容的提问来源于stack exchange,提问作者Filippo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:00:59