将单个模型拟合到 spatstat 中的多个数据集时如何优化 r 参数?
How to optimize the r parameter when fitting a single model to several datasets in spatstat?
我想使用 spatstat
包将单个模型拟合到 R
中的几个独立数据集。在这里,我有 3 个独立的数据集(ppp
个名为 NMJ1
、NMJ2
和 NMJ3
的对象),我想在其中拟合一个通用模型。要走的路应该是使用 mppm
函数:
data <- listof(NMJ1,NMJ2,NMJ3)
data <- hyperframe(X=1:3, Points=data)
r <- matrix(c(120, 240, 240, 90), nrow = 2, ncol = 2)
model <- mppm(Points ~marks*abs(sqrt(x^2+y^2)), data, Strauss(r))
但是,r
是一个自由参数,我想优化一下。我开始做:
ll <- -Inf
r_hat <- 0
for (r in seq(from=0.5, to=10, by=0.05)){
fit1 <- ppm(NMJ1~marks*sqrt(x^2+y^2),Strauss(r))
fit2 <- ppm(NMJ2~marks*sqrt(x^2+y^2),Strauss(r))
fit3 <- ppm(NMJ3~marks*sqrt(x^2+y^2),Strauss(r))
if(logLik.ppm(fit1)+logLik.ppm(fit2)+logLik.ppm(fit3) > ll) {
ll <- logLik.ppm(fit1)+logLik.ppm(fit2)+logLik.ppm(fit3)
r_hat <- r
}
}
(即通过找到 r
的值优化我的 3 个数据集上的 3 个拟合的对数似然之和),它在没有警告的情况下运行;然而,这里我在每个数据集上拟合了 3 个独立模型,而我希望我的模型对所有这些模型都是相同的。
然后我尝试了:
ll <- -Inf
r_hat <- 0
for (r in seq(from=0.5, to=10, by=0.05)){
fit <- mppm(Points ~ marks*sqrt(x^2+y^2), data, Strauss(r))
ll_temp <- logLik.mppm(fit)
if(ll_temp > ll) {
ll <- ll_temp
r_hat <- r
}
}
其中 returns 以下警告:
Warning message:
In logLik.mppm(fit) :
log likelihood is not available for non-Poisson model; log-pseudolikelihood returned
除此警告外,r
的返回值似乎不符合实际(它们大于我的点之间的平均距离)。因此,我的问题如下:
- 使用
mppm
时,是否有一种“干净”的方法来优化 r
参数?
- 在统计方面,
r
可以分析计算吗(例如,根据我的点之间的距离分布)?
mppm
目前还没有以简洁的方式实现,也就是说,将模型拟合到多个点模式数据集。它在“待办事项”列表中。
(对于将模型拟合到单点模式数据集,请参阅下面的最后一段。)
除了一个 问题 之外,您的代码是正确的:它假设比较两个模型的对数伪似然值是有效的 r
.这并不总是正确的,因为默认情况下,ppm
和 mppm
使用边缘校正的边界方法,默认情况下,边界距离 rbord
选择等于交互距离 r
。在您的代码中,每个模型的 rbord
都不同,因此伪似然不具有严格的可比性(实际上模型基于不同的“样本量”)。
为避免此问题,您可以将边界距离 rbord
显式设置为等于将要使用的 r
的 maximum 值:
mppm(Points ~ something, Strauss(r), rbord=rmax)
或在对 mppm
的调用中指定另一个边缘校正,例如 correction="iso"
或 correction="none"
。这些策略中的任何一个都将确保伪似然值具有可比性。
您注意到通过您的搜索程序获得的 r
估计值是不现实的。这可能归因于上面讨论的问题。但有时当搜索域选择太大时也会发生这种情况(如果您允许软件尝试不切实际的值)。
另一个更快的选择是使用 mppm
来拟合具有 PairPiece
交互作用的模型,指定一系列跳跃点 r
,然后绘制结果拟合交互(从使用 fitin
的模型中提取)这将使您能够判断 r
的最合适值,或者至少是合适的 r
范围。它还为您提供了一种判断阈值类型交互模型是否合适的方法。请参见 the spatstat book.
中第 517 页的底部和图 13.19 的左面板
用行话来说,r
叫做不规则参数。正如 spatstat
包文档和 spatstat book 中所解释的,只有常规参数由 ppm
或 mppm
估计,不规则参数必须以其他方式确定。请参阅 spatstat 书的第 9.12 节和第 13.6.3 节。
因为 r
是距离阈值,所以似然或伪似然作为 r
的函数不是连续的。所以你的第二个问题的答案是严格的“否”,没有估计r
.
的解析公式
为了将模型拟合到单点模式数据集,有两个函数可以估计交互范围:profilepl
,它使用类似于您在上面实现的一个,以及 ippm
解析地求解得分方程。要将 Strauss 模型拟合到必须估计 r
的单个数据集,唯一支持的选项是 profilepl
,因为 Strauss 模型相对于 r
不可微分。关于相互作用范围估计量的统计性能,我们知之甚少。这仍然是一个研究问题。
我想使用 spatstat
包将单个模型拟合到 R
中的几个独立数据集。在这里,我有 3 个独立的数据集(ppp
个名为 NMJ1
、NMJ2
和 NMJ3
的对象),我想在其中拟合一个通用模型。要走的路应该是使用 mppm
函数:
data <- listof(NMJ1,NMJ2,NMJ3)
data <- hyperframe(X=1:3, Points=data)
r <- matrix(c(120, 240, 240, 90), nrow = 2, ncol = 2)
model <- mppm(Points ~marks*abs(sqrt(x^2+y^2)), data, Strauss(r))
但是,r
是一个自由参数,我想优化一下。我开始做:
ll <- -Inf
r_hat <- 0
for (r in seq(from=0.5, to=10, by=0.05)){
fit1 <- ppm(NMJ1~marks*sqrt(x^2+y^2),Strauss(r))
fit2 <- ppm(NMJ2~marks*sqrt(x^2+y^2),Strauss(r))
fit3 <- ppm(NMJ3~marks*sqrt(x^2+y^2),Strauss(r))
if(logLik.ppm(fit1)+logLik.ppm(fit2)+logLik.ppm(fit3) > ll) {
ll <- logLik.ppm(fit1)+logLik.ppm(fit2)+logLik.ppm(fit3)
r_hat <- r
}
}
(即通过找到 r
的值优化我的 3 个数据集上的 3 个拟合的对数似然之和),它在没有警告的情况下运行;然而,这里我在每个数据集上拟合了 3 个独立模型,而我希望我的模型对所有这些模型都是相同的。
然后我尝试了:
ll <- -Inf
r_hat <- 0
for (r in seq(from=0.5, to=10, by=0.05)){
fit <- mppm(Points ~ marks*sqrt(x^2+y^2), data, Strauss(r))
ll_temp <- logLik.mppm(fit)
if(ll_temp > ll) {
ll <- ll_temp
r_hat <- r
}
}
其中 returns 以下警告:
Warning message:
In logLik.mppm(fit) :
log likelihood is not available for non-Poisson model; log-pseudolikelihood returned
除此警告外,r
的返回值似乎不符合实际(它们大于我的点之间的平均距离)。因此,我的问题如下:
- 使用
mppm
时,是否有一种“干净”的方法来优化r
参数? - 在统计方面,
r
可以分析计算吗(例如,根据我的点之间的距离分布)?
mppm
目前还没有以简洁的方式实现,也就是说,将模型拟合到多个点模式数据集。它在“待办事项”列表中。
(对于将模型拟合到单点模式数据集,请参阅下面的最后一段。)
除了一个 问题 之外,您的代码是正确的:它假设比较两个模型的对数伪似然值是有效的 r
.这并不总是正确的,因为默认情况下,ppm
和 mppm
使用边缘校正的边界方法,默认情况下,边界距离 rbord
选择等于交互距离 r
。在您的代码中,每个模型的 rbord
都不同,因此伪似然不具有严格的可比性(实际上模型基于不同的“样本量”)。
为避免此问题,您可以将边界距离 rbord
显式设置为等于将要使用的 r
的 maximum 值:
mppm(Points ~ something, Strauss(r), rbord=rmax)
或在对 mppm
的调用中指定另一个边缘校正,例如 correction="iso"
或 correction="none"
。这些策略中的任何一个都将确保伪似然值具有可比性。
您注意到通过您的搜索程序获得的 r
估计值是不现实的。这可能归因于上面讨论的问题。但有时当搜索域选择太大时也会发生这种情况(如果您允许软件尝试不切实际的值)。
另一个更快的选择是使用 mppm
来拟合具有 PairPiece
交互作用的模型,指定一系列跳跃点 r
,然后绘制结果拟合交互(从使用 fitin
的模型中提取)这将使您能够判断 r
的最合适值,或者至少是合适的 r
范围。它还为您提供了一种判断阈值类型交互模型是否合适的方法。请参见 the spatstat book.
用行话来说,r
叫做不规则参数。正如 spatstat
包文档和 spatstat book 中所解释的,只有常规参数由 ppm
或 mppm
估计,不规则参数必须以其他方式确定。请参阅 spatstat 书的第 9.12 节和第 13.6.3 节。
因为 r
是距离阈值,所以似然或伪似然作为 r
的函数不是连续的。所以你的第二个问题的答案是严格的“否”,没有估计r
.
为了将模型拟合到单点模式数据集,有两个函数可以估计交互范围:profilepl
,它使用类似于您在上面实现的一个,以及 ippm
解析地求解得分方程。要将 Strauss 模型拟合到必须估计 r
的单个数据集,唯一支持的选项是 profilepl
,因为 Strauss 模型相对于 r
不可微分。关于相互作用范围估计量的统计性能,我们知之甚少。这仍然是一个研究问题。