不能在多类型点模式上使用 mppm

Can't use mppm on multitype point patterns

我正在尝试将 MultiStraussHardcore 交互拟合到 spatstat (flu) 中的示例数据集之一。我为所有类型和点模式保持相同的交互和硬核半径。我正在 运行宁以下块:

library(spatstat)
library("optimbase")

flusubset <- flu[1:4]
typelist <- lapply(lapply(flusubset$pattern, marks), levels)
stopifnot(length(unique(typelist))==1)
num_marks <- length(typelist[[1]])
iradii <- 50*ones(num_marks)
hradii <- 3*ones(num_marks)
Int <- anylist()
for (i in 1:dim(flusubset)[1]) {
  Int[[i]] <- MultiStraussHard(iradii=iradii, hradii=hradii)
}
Int <- as.hyperframe(Int)
multmodel <- mppm(pattern ~ 1, data=flusubset, interaction=Int)

每次我运行 mppm,我都会得到以下错误

Error in (function (d, tx, tu, par) : data and model do not have the same possible levels of marks

我也包含了追溯。

12. stop("data and model do not have the same possible levels of marks")
11. (function (d, tx, tu, par) { r <- par$iradii h <- par$hradii ...
10. do.call(fun, usedargs)
9. do.call.matched(pairpot, list(d = matrix(, 0, 0), tx = marks(X)[integer(0)], tu = marks(P)[integer(0)], par = potpars))
8. evalPairPotential(X, U, EqualPairs, pairpot, potpars, Reach)
7. evaluate(X, P, E, interaction$pot, interaction$par, correction = correction, splitInf = splitInf, ..., Reach = Reach, precomputed = precomputed, savecomputed = savecomputed)
6. evalInterEngine(X = X, P = P, E = E, interaction = interaction, correction = correction, splitInf = splitInf, ..., precomputed = precomputed, savecomputed = savecomputed)
5. evalInteraction(X, P, E, interaction, correction, ..., splitInf = splitInf, precomputed = precomputed, savecomputed = savecomputed)
4. mpl.prepare(Q, X, P, trend, interaction, covariates, want.trend, want.inter, correction, rbord, "quadrature points", callstring, subsetexpr = subsetexpr, allcovar = allcovar, precomputed = precomputed, savecomputed = savecomputed, covfunargs = covfunargs, weightfactor = weightfactor, ...
3. mpl.engine(Q, trend = trend, interaction = interaction, ..., covariates = covariates, correction = correction, rbord = rbord, use.gam = use.gam, allcovar = allcovar, preponly = TRUE, forcefit = TRUE)
2. bt.frame(Yi, ~1, inter, ..., covariates = covariates, allcovar = TRUE, use.gam = use.gam, vnamebase = itags[j], vnameprefix = itags[j])
1. mppm(pattern ~ 1, data = flusubset, interaction = Int)

我试过为每个单独的点模式用 ppm 拟合 MultiStraussHardcore 模型,我没有遇到任何问题。我已经确认每个点模式的可能级别是相同的。我还验证了交互和硬核半径矩阵具有正确的尺寸(两者均为 2x2),并且包含交互对象的超帧是正确的尺寸。谢谢!

感谢您对问题的详细描述和可重现的示例。这让我的事情变得非常简单。

您确实发现了一个小错误(文档不一致)。如果在 for 循环中替换

,则您的代码运行没有错误
MultiStraussHard(iradii=iradii, hradii=hradii)

来自

typ <- levels(marks(flu$pattern[[1]]))
MultiStraussHard(iradii=iradii, hradii=hradii, types=typ)

MultiStraussHard 的文档说参数 types 是可选的,但目前仅适用于 ppm 调用。我会看看是否可以将类型的自动检测扩展到 mppm,这样您的原始代码就可以在 spatstat.

的未来版本中使用

此问题已在 spatstat 的最新开发版本中得到修复,可从 github repository