Я использую функцию int2
в пакете R rmutil
для численного вычисления двойных интегралов. Функция, которую я хочу интегрировать, представляет собой двумерную функцию нормальной плотности вероятности :
![enter image description here](https://i.stack.imgur.com/9zmCH.png)
, которая имеет две переменные (x и y) и пять параметров. Если я скажу, скажем, mu_x = mu_y = 0, sigma_x = sigma_y = 1 и rho = 0.5, я могу кодировать функцию в R следующим образом:
f1 <- function(x, y) 1/(sqrt(3) * pi) * exp(-2/3 * (x^2 + y^2 - x*y))
I тогда интегрируйте функцию с помощью int2
следующим образом:
rmutil::int2(f1, a=c(-Inf,-Inf), b=c(Inf,Inf))
[1] 0.9999998
Хорошо: точное значение интеграла равно 1.
Однако мне нужно иметь возможность многократно интегрировать вышеуказанную функцию для разных значения вышеуказанных параметров. Я попытался сделать это следующим образом:
bvtnorm <- function(x, y, mu_x = 0, mu_y = 0, sigma_x = 1, sigma_y = 1, rho = 0.5) {
function(x, y)
1 / (2 * pi * sigma_x * sigma_y * sqrt(1 - rho ^ 2)) *
exp(- 1 / (2 * (1 - rho ^ 2)) * ((x - mu_x) / sigma_x) ^ 2 +
((y - mu_y) / sigma_y) ^ 2 - 2 * rho * (x - mu_x) * (y - mu_y) /
(sigma_x * sigma_y))
}
f2 <- bvtnorm(x, y)
Мы можем проверить, что f1
и f2
возвращают одинаковые значения для одинаковых x
и y
входов:
f1(1, 1)
[1] 0.0943539
f2(1, 1)
[1] 0.0943539
Тем не менее, когда я запускаю int2
на f2
следующим образом, он не может интегрироваться:
rmutil::int2(f2, a=c(-Inf,-Inf), b=c(Inf,Inf))
[1] NaN
Я определил переменные параметров для отправки в bvtnorm
глобально, используя mu_x <<- 0
, mu_y <<- 0
, sigma_x <<- 1
, sigma_y <<- 1
и rho <<- 0.5
, чтобы их значения были видны в функциональной среде rmutil::int2
, но это не сработало. Когда я изучил исходный код rmutil::int2
, я обнаружил вероятную причину: в этой функции есть вызов функции C с использованием .C
. Я предполагаю, что даже глобальные переменные в R не видны для C функций, вызываемых внутри R, и, таким образом, функция C не сможет оценить bvtnorm
(через f2
, через rmutil::int2
), потому что mu_x
, mu_y
и др. c. неизвестны. Таким образом, мой вопрос:
Есть ли способ сделать переменные в среде R видимыми для C функций, вызываемых из R?
Я предполагаю, что один из возможных решением было бы изменить функцию rmutil::int2
и функцию C, которые она вызывает для отправки параметров mu_x, mu_y и т. д. c. к функции C. Тем не менее, я бы хотел, по возможности, избегать изменения чужого кода в существующем пакете CRAN.