如何可视化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函数绘制所需的预测变量效应图
我的问题:上述方案是否可行?哪种更优?或有无其他更好的方法实现需求?
回答
方案可行性分析
两种方案都可行,但各有优劣:
- 子拟合方法
- 可行,但缺点明显:每个模式单独拟合
ppm会破坏原mppm模型的整体推断逻辑(原模型是在统一框架下估计所有模式的参数、共享部分结构),而且每个模式调k参数会大幅增加工作量,不同模式的样条差异也确实会让结果解读变得混乱,除非你本来就想对比各模式的独立效应,否则不推荐。
- 可行,但缺点明显:每个模式单独拟合
- 提取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
相关产品推荐
相关产品推荐

