Я оцениваю вероятность расселения вида по ландшафту с координатной сеткой при заданном ядре расселения (функции расстояния) с максимальным расстоянием расселения. Я пытаюсь рассчитать вероятность рассредоточения от области к области, как описано в уравнении. 8 из этой статьи (в открытом доступе) . Это включает в себя четырехкратное интегрирование, оценивая значение функции рассеивания для каждой возможной комбинации исходной и целевой точек в исходной и целевой ячейках соответственно.
Я реализовал это с помощью adaptIntegrate
из пакета cubature
следующим образом для исходной ячейки A, целевой ячейки B и упрощенного ядра рассеивания, где рассеивание равно 1, когда межточечное расстояние > 1,25, и 0 в противном случае. Это показано графически ниже, где красная область ячейки B недостижима, поскольку ни одна точка в ячейке A не находится на расстоянии 1,25.
library(cubature)
f <- function(xmin, xmax, ymin, ymax) {
adaptIntegrate(function(x) {
r <- sqrt((x[3] - x[1])^2 + (x[4] - x[2])^2)
ifelse(r > 1.25, 0, 1)
},
lowerLimit=c(-0.5, -0.5, xmin, ymin),
upperLimit=c(0.5, 0.5, xmax, ymax),
maxEval=1e5)
}
f(xmin=1.5, xmax=2.5, ymin=-0.5, ymax=0.5)
# $integral
# [1] 0.01949567
#
# $error
# [1] 0.001225998
#
# $functionEvaluations
# [1] 100035
#
# $returnCode
# [1] 0
Я получаю другой интеграл, когда рассматриваю целевую ячейку C, расположенную на том же расстоянии, но выше, а не справа от ячейки A.
f(xmin=-0.5, xmax=0.5, ymin=1.5, ymax=2.5)
# $integral
# [1] 0.01016105
#
# $error
# [1] 0.0241325
#
# $functionEvaluations
# [1] 100035
#
# $returnCode
# [1] 0
Почему эти интегралы такие разные (0.01949567
против 0.01016105
)? Я неправильно закодировал? Изменение допуска и максимального количества оценок, по-видимому, не имеет большого значения. В качестве альтернативы, есть ли лучший подход к кодированию решения этой проблемы?
Я понимаю, что вопросы об общем подходе, вероятно, лучше подходят для stats.stackexchange.com, но я разместил здесь, так как подозреваю, что может быть что-то, что я упускаю из виду с самим кодированием.
EDIT: для случая
A -> B
вложенный integrate
возвращает решение, аналогичное первому решению adaptIntegrate
. Для случая A -> C
возвращается Error in integrate(function(ky) { : the integral is probably divergent
.
g <- function(Bx, By, Ax, Ay) {
r <- sqrt((Ax - Bx)^2 + (Ay - By)^2)
ifelse(r > 1.25, 0, 1)
}
integrate(function(Ay) {
sapply(Ay, function(Ay) {
integrate(function(Ax) {
sapply(Ax, function(Ax) {
integrate(function(By) {
sapply(By, function(By) {
integrate(function(Bx) g(Bx, By, Ax, Ay), 1.5, 2.5)$value # Bx
})
}, -0.5, 0.5)$value # By
})
}, -0.5, 0.5)$value # Ax
})
}, -0.5, 0.5)$value # Ay
# [1] 0.019593