【发布时间】:2021-11-19 17:00:27
【问题描述】:
我想使用 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
}
}
返回以下警告:
Warning message:
In logLik.mppm(fit) :
log likelihood is not available for non-Poisson model; log-pseudolikelihood returned
除了这个警告之外,r 的返回值似乎并不现实(它们大于我的点之间的平均距离)。因此,我的问题如下:
- 在使用
mppm时,是否有一种“干净”的方式来优化r参数? - 在统计方面,
r是否可以通过分析计算(例如,根据我的点之间的距离分布)?
【问题讨论】: