최대 분산 거리를 가진 분산 커널 (거리의 함수)을 고려할 때 격자가있는 풍경을 따라 종의 분산 확률을 추정합니다. 나는 면적 - 면적 분산 확률을 식에 기술 된대로 계산하려고 시도하고있다. 8 of this (open access) paper. 이것은 소스 및 표적 세포의 각각의 가능한 소스 및 타겟 포인트의 조합에 대한 분산 함수의 값을 평가하는 4 중 적분을 포함한다.adaptIntegrate와의 통합 불일치
I는 다음과 같이 셀 B 타겟팅 소스 셀 A를 들어, cubature
패키지 adaptIntegrate
이것을 구현하며 한 분산이 1 인 단순 분산 커널시 간 점 거리 별도로> 1.25 0. 이 그림은 아래에 그래픽으로 표시되어 있습니다. 셀 A의 점이 1.25 내에 있지 않기 때문에 셀 B의 빨간색 영역에 도달 할 수 없습니다.
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
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에 더 적합하다는 것을 알았지 만 코딩 자체가 간과되는 부분이있을 수 있으므로 여기에 게시했습니다.
편집 :
integrate
중첩 된 A -> B
경우를 들어 는 첫 번째
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
@ Julius 감사합니다. 몬테카를로 통합이 나아갈 수있는 것처럼 보입니다. 'r'값을 어떻게 지켰는지 알려주시겠습니까? (파일에'cat '할 수는 있지만 더 빠른 방법이 있습니까?) 다른 사람들이'adaptIntegrate' 불일치에 대한 이유에 대해 좀 더 통찰력을 갖게 될 경우를 대비하여 좀 더 오랫동안 질문을 계속할 것입니다. – jbaums
@jbaums, 확실히, 나는'rs <- numeric (100035); 함수 앞에'cnt <- 1','rs [cnt] << -r; 함수 내에서 cnt << - cnt + 1'. – Julius