spatstat 非齐次 K、F 和 G 函数中的意外行为

Unexpected behavior in spatstat inhomogeneous K-, F- and G-functions

我有一个大约有 84,000 个点的点阵图。 Quadrat 测试表明强度不均匀,我尝试了不同的内核带宽,并在 K-、F- 和 G-函数的非均匀实现中得到了非常奇怪的行为。下面是inhomogeneous F-function plot的例子。显然,估计的 F 函数在距离范围内不会达到 1,而泊松过程只是平坦的。 F 函数也应该增加,所以下降是奇数。在 Finhom() 函数中手动指定更长范围的 r 时,该函数仍然不会计算超出建议范围 2000.

很遗憾,我无法共享我的数据。然而,我设法用一个公认的非常简单的单位正方形上的点模式示例重现了一些错误:

library(spatstat) # version 1.57-1
# define point pattern
ex <- as.ppp(data.frame(x = c(.9, .25, .29, .7, .72, .8, .72, .85), 
                        y = c(.1, .25, .29, .5, .5, .1, .45, .08)), 
                        W = owin(c(0,1), c(0,1)))

plot(ex) 
# testing inhomogeneity
quadrat.test(ex, 3, 3, method = "M", nsim = 500) # p around 0.05
# set bandwidth
diggle <- bw.diggle(ex)
# suggested bandwidth of 0.028

# estimate inhomogeneous F-function
Fi <- Finhom(ex, sigma = diggle)
plot(Fi, main ="Finhom for ex pattern")

附上剧情here。与我的真实数据类似,该图在 r = 0.5 处停止评估,趋于平坦并且不会一直上升到 1。 有趣的是,当直接通过 Finhom() 函数中的 lambda 参数提供强度时,行为会发生变化:

lambda_ex <- density(ex, sigma = diggle, at = "points")
Fi_lambda <- Finhom(ex, lambda = lambda_ex)
plot(Fi_lambda, main ="Finhom w/ lambda directly")

这里,函数表现 as expected。

我的问题是:

  1. 为什么在 Finhom() 函数中直接提供的强度与内部估计的强度之间存在差异?

  2. 这里 F 函数的奇怪行为可能是什么原因?代码问题还是用户错误? (旁注,G 函数和 K 函数也 return 奇怪的行为,为了让这个问题简短一些,我专注于 F 函数)

谢谢!

正如 Adrian Baddeley 在另一个答案中指出的那样,这本身并不是 Finhom 中的错误。你会期望

Fi <- Finhom(ex, sigma = diggle)

应该等同于

lambda_ex <- density(ex, sigma = diggle, at = "points")
Fi_lambda <- Finhom(ex, lambda = lambda_ex)

但是,这些命令隐含了参数 lmin 的不同值。在第一种情况下,lambda 在 window 中随处估计,并使用最小值。在第二种情况下,仅使用给定的 lambda 值来查找最小值。那当然可以完全不同。 lmin 的重要性在下面的代码中说明(请注意,数据和非齐次泊松之间的差异在所有情况下都属于同一类型)。

关于估计停止在 r=0.5 的另一部分并不奇怪,因为使用了边界校正并且 window 是单位平方。当r=0.5时,整个window就是"shaved off",所以没有数据剩下了。

library(spatstat)
#> spatstat 1.56-1.031       (nickname: 'Psycho chicken') 
X <- swedishpines
lam <- density(X, at = "points", sigma = 10)
lam_min <- min(lam)
plot(Finhom(X, lmin = lam_min), legend = FALSE, col = 1, main = "Finhom for different values of lmin")
s <- 2^(1:3)
for(i in seq_along(s)){
  plot(Finhom(X, lmin = lam_min/s[i]), col = i+1, add = TRUE)
}
s <- c(1,s)
legend("topleft", legend = paste0("min(lam)/", s), lty = 1, col = 1:length(s))

reprex package (v0.2.1)

于 2018-11-24 创建

"inhomogeneous"函数KinhomGinhomFinhom涉及对点过程的空间变化强度进行调整。它们仅在 (a) 强度已被准确估计,并且 (b) 点过程满足某些证明调整计算合理的技术假设的情况下才起作用(请参阅帮助文件中的参考资料,或 spatstat 书的相关部分)。

density(ex, sigma=bw.diggle) 的图显示了估计强度中非常高的峰和非常低的谷,表明数据平滑不足,因此 (a) 不满足。使用 bw.scottbw.CvL 获得的结果表现得更好。 (请记住 bw.diggle 是为集群模式设计的。)例如,我用

得到了一个相当不错的图
plot(Finhom(ex, sigma=bw.CvL))

是的,当 'lambda' 作为像素图像和数字向量给出时,结果不同似乎有点令人不安。正如 Ege 解释的那样,这是因为计算重要参数 lmin 的默认值的规则不同。这并不是真正的错误——GinhomFinhom 的代码的原作者是这样设计的;我会咨询他们是否应该改变它的建议。同时,如果指定lmin.

的值,则可以使两次计算一致