我正在用不同的适合度测试来测试kppm级的对象。附加代码中的拟合优度测试在spatstat版本1.590-0中运行良好,但在最近的版本(1.61-0和1.61-0.019)中,有一个与rinterval相关的错误。
带有种子来复制错误的代码是:
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.590-0版本中,但通过将rinterval设置为0到0.25进行了修正。在1.61-0版本中,我将rinterval设置得更短,但是这个错误继续出现。
如果我使用10作为种子,dclf.test和mad.test工作得很好。
提前谢谢。
发布于 2019-10-07 09:17:04
感谢您给出了一个清晰的可复制的例子。我可以确认我也得到了错误。只是一个澄清的问题:使用相同的种子,行为是否从spatstat 1.59-0变为1.61-0?
我很有信心,我已经解释了错误发生的原因,但我不知道解决这个错误的最佳方法是什么。我会在那部分再给你回电。下面是解释:
你的模型的父母强度为3.78。该模型在一个扩展窗口中进行仿真,然后被限制在目标窗口(单位平方)。膨胀系数是4*scale,在这里,您的拟合模型有scale=0.05 (圆角)。因此,模拟窗口有面积(1+8*scale)^2=1.9,期望的父点数为3.78*1.9=7.2。泊松分布的父母数有时可能为零,这给你一个估计的K-函数,它是NA无处不在,所以改变rinterval没有帮助。如果扩展区域中只有一个或两个在目标模拟窗口中没有后代的父本,则NA K-函数也可能发生。总的来说,目标窗口中出现空点模式的概率是不可忽略的。
我将考虑如何最好地避开这个问题,而不使统计推断失效。
下面的代码说明了这个问题(从问题中的原始代码开始)
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-函数估计:
mean(np<=1)
#> [1] 0.016一个简单的解决方法是首先模拟模式,如上面所示,然后删除少于两点的模式并模拟新的模式。一旦您有了所需长度的模拟模式列表,就可以将这个列表作为simulate参数提供给envelope。一般来说,这并不一定是处理此问题的最佳方法,但在您的情况下,它很可能会带来很少的偏差。
https://stackoverflow.com/questions/58262441
复制相似问题