spatstat 版本 1.61-0 中 class kppm 对象的拟合优度测试问题

Problem with Goodness-Of-Fit tests for objects of class kppm in spatstat version 1.61-0

我正在对 class kppm 的对象使用不同的拟合优度测试。附加代码中的拟合优度在 spatstat 1.59-0 版本中运行良好,但在最新版本(1.61-0 和 1.61-0.019)中,存在与 rinterval.[=18 相关的错误=]

复制错误的带有种子的代码是:

library(spatstat)

#### Seed to recreate the same results ####
set.seed(1234)
#### Model from Thomas process ####
Data.Example <- rThomas(5, 0.05, 10) # kappa, scale, mu

#### Fitting a Thomas model ####
DE.fit.Thomaskppm <- kppm(Data.Example, ~ 1, "Thomas")

#*********************************************************
#### Goodness-of-fit test                             ####
#*********************************************************
####Using Dao-Genton test ####

#Thomas model
set.seed(100000)
dg.test(DE.fit.Thomaskppm, rinterval = c(0, 0.25))

#### Diggle-Cressie-Loosmore-Ford test ####

#Thomas model
set.seed(100000)
dclf.test(DE.fit.Thomaskppm, rinterval = c(0, 0.2))

#### Maximum Absolute Deviation Tests ####

#Thomas model
set.seed(100000)
mad.test(DE.fit.Thomaskppm, rinterval = c(0, 0.2))

错误是:

 Error in envelopeTest(Yi, ..., nsim = nsimsub, alternative = alternative,  : 
  Some function values were infinite, NA or NaN at distances r up to 0.25 units. Please specify a shorter ‘rinterval’ 

此错误出现在版本 1.59-0 中,但已通过将 rinterval 从 0 设置为 0.25 来修复。在 1.61-0 版本中,我将 rinterval 设置得更短,但仍然出现此错误。

如果我使用 10 作为种子,

dclf.testmad.test 工作正常。

提前致谢。

感谢您提供清晰的可重现示例。我可以确认我也收到了错误。只是一个澄清的问题:使用相同的种子,行为是否从 spatstat 1.59-0 更改为 1.61-0?

我非常有信心我能解释错误发生的原因,但我不确定解决它的最佳方法是什么。我会尽力就那部分回复你。现在进行解释:

您的模型 parent 强度为 3.78。该模型在扩展window中模拟,然后限制在目标window(单位正方形)。扩展因子为 4*scale,其中您的拟合模型具有 scale=0.05(四舍五入)。因此模拟的 window 有面积 (1+8*scale)^2=1.9 并且预期的 parent 点数是 3.78*1.9=7.2。 parent 的泊松分布数有时可能为零,这会为您提供估计的 K-function,即到处都是 NA,因此更改 rinterval 无济于事。 NA K-function 也可能发生,如果你在扩展区域中只有一两个 parent 并且在目标模拟 window 中没有后代。总体而言,目标 window 中空点模式的概率为 non-negligible.

我会考虑如何在不使统计推断无效的情况下最好地规避这个问题。

下面的代码说明了问题(从问题的原始代码开始)

library(spatstat)

#### Seed to recreate the same results ####
set.seed(1234)
#### Model from Thomas process ####
Data.Example <- rThomas(5, 0.05, 10) # kappa, scale, mu

#### Fitting a Thomas model ####
DE.fit.Thomaskppm <- kppm(Data.Example, ~ 1, "Thomas")

模拟拟合模型并提取点数:

s <- simulate(DE.fit.Thomaskppm, nsim = 1000, verbose = FALSE)
np <- sapply(s, npoints)
summary(np)
#>    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#>    0.00   30.00   45.00   47.52   63.00  167.00

找出产生纯 NA K-function 估计的 1 点或更少点的模式比例:

mean(np<=1)
#> [1] 0.016

一个简单的解决方法是先模拟如上图所示的模式,然后删除少于两个点的模式并模拟新的模式。获得所需长度的模拟模式列表后,您可以将此列表作为 envelopesimulate 参数提供。这不是通常处理此问题的最佳方法,但在您的情况下,它很可能会引入很少的偏差。