在R的spatstat包中如何用单个模型正确拟合多个独立数据集?
你想要用mppm拟合一个所有参数在3个独立数据集间共享的通用模型,这个需求完全符合mppm固定效应模型的设计场景。你当前遇到的gamma系数差异和模拟结果问题,大概率是对subfits输出的误解,或者数据集结构的小问题,下面一步步帮你解决:
1. 先搞懂mppm固定效应模型的本质
当你用mppm且模型公式里没加随机效应项(比如(1|分组变量))时,默认拟合的就是全局共享参数的模型:不管是强度部分的协变量系数,还是MultiStrauss的gamma交互参数,所有数据集都用同一套估计值。
你看到subfits(model)里gamma有差异,其实是误解了这个函数的作用:subfits返回的是把全局估计的参数代入每个数据集后得到的拟合结果,不是每个数据集单独拟合的参数。你应该看coef(model),这里才会输出唯一的一套全局参数(包括gamma),而subfits只是全局参数在不同数据集上的应用表现而已。
2. 确保你的数据集结构一致
要让mppm顺利估计共享的gamma,你的3个ppp对象得满足两个条件:
- 标记的类型完全匹配:比如都是两种标记,标记的名称/取值完全一样(别一个用
c("A","B"),另一个用c("1","2")) - 每种标记组合在每个数据集中都有足够的点对:如果某个数据集里完全没有A-B类型的点对,
mppm就没法估计全局的gamma,只能给这个数据集单独赋值
你可以用lapply(list(NMJ1, NMJ2, NMJ3), marks)快速检查标记的一致性。
3. 优化你的拟合代码
你的数据构建可以更简洁,同时明确强化固定效应的设定:
# 构建包含3个ppp的hyperframe(不需要额外的X变量,除非你要用到它) data_hf <- hyperframe(Points = list(NMJ1, NMJ2, NMJ3)) # 定义MultiStrauss的交互距离矩阵 r_matrix <- matrix(c(120, 240, 240, 90), nrow = 2, ncol = 2) # 拟合全局共享参数的mppm模型 shared_model <- mppm(Points ~ marks * abs(sqrt(x^2 + y^2)), data = data_hf, interaction = MultiStrauss(r_matrix))
4. 验证共享参数是否生效
直接查看全局参数估计结果,确认是唯一的一套值:
# 查看所有全局参数(强度系数+gamma) coef(shared_model)
这里输出的应该是一组统一的参数,不会按数据集分开。
5. 正确模拟共享模型的结果
如果要生成符合这个通用模型的模拟样本,基于全局参数的模拟结果应该是同一模型的独立实现,只会有随机波动,不会有显著一致的差异:
# 生成3个模拟样本(对应原数据集的窗口) simulated_samples <- simulate(shared_model, nsim = 3) # 并排绘制模拟结果 plot(simulated_samples, nrows = 1, ncols = 3)
替代方案:合并数据集(谨慎使用)
如果你可以忽略数据集间的独立性(不推荐,除非你确定它们是同一过程的连续观测),也可以把3个数据集合并成一个大的点过程拟合:
# 合并3个ppp,添加标记区分原数据集 combined_ppp <- superimpose(NMJ1 = NMJ1, NMJ2 = NMJ2, NMJ3 = NMJ3, W = convexhull(NMJ1, NMJ2, NMJ3)) # 拟合合并后的模型 combined_model <- ppm(combined_ppp ~ marks * abs(sqrt(x^2 + y^2)), interaction = MultiStrauss(r_matrix))
但这种方法没有考虑原数据集的独立性,mppm的固定效应模型才是处理独立重复样本的标准方式。
内容的提问来源于stack exchange,提问作者Camille Gontier

