Синтаксис `integrate_1d` и интерактивная его отладка - PullRequest
0 голосов
/ 24 января 2020

Я первый пользователь rstan / Stan, пытающийся настроить пользовательскую вероятность и интегрировать ее, используя integrate_1d. Основываясь на документации , я настроил свою функцию интегрирования следующим образом:

// internal function to integrate over z 
// integrate_1d is super picky: the argument types need to be real, real, 
    real[], real[], int[]
// e.g., cannot use vectors in place of real[] or int[]

real integrand( real x,  // the observed Z-stat; value at which to evaluate integral
              real xc,
              real[] theta,
              real[] x_r,
              int[] x_i ){

    // separate the parameters
    real zeta = theta[1];
    real eta = theta[2];
    real vi = theta[3];

    // significance indicator
    int signif; 
    signif = fabs(x) > 1.96;

    return( (1/eta) * (1 - signif) + signif ) * exp( normal_lpdf( x | zeta, sqrt(vi) ) );
  }

Я пытаюсь протестировать и отладить эту функцию, потому что она в конечном итоге приводит к ошибкам в оценке лог-вероятности, когда Я запускаю свою модель. С этой целью я хочу иметь возможность запускать функцию в интерактивном режиме, передавая аргументы по своему выбору. Я пытаюсь использовать для этого expose_stan_functions rstan:

code = "functions{

  real integrand( real x,  // the observed Z-stat
                  real xc,
                  real[] theta,
                  real[] x_r,
                  int[] x_i ){

    // separate the parameters
    real zeta = theta[1];
    real eta = theta[2];
    real vi = theta[3];

    // significance indicator
    int signif; 
    signif = fabs(x) > 1.96;

    return( (1/eta) * (1 - signif) + signif ) * exp( normal_lpdf( x | zeta, sqrt(vi) ) );
  }
}"

expose_stan_functions(stanc(model_code = code))

integrand(1, {1,1,1}, real[], int[], 1e-8)

integrate_1d( integrand, negative_infinity(), positive_infinity(), {1, 1, 1}, real[], int[], 1e-8 )

, но при вызовах integrand и integrate_1d ошибка каждого выброса

Ошибка: неожиданная ', '

, как будто я вызываю функции с принципиально неправильным синтаксисом. (При вызове integrate_1d я не совсем знал, что делать с xc. Я его опустил, потому что документация (раздел 9.3.2.4), похоже, предполагает, что для неопределенного интеграла должно быть NaN.)

Я также приветствую совершенно разные предложения по интерактивной отладке integrand, если expose_stan_functions не идеальный способ для go.

1 Ответ

1 голос
/ 25 января 2020

Функция integrate_1d является функцией Stan / C ++, поэтому, если вы хотите вызвать ее из R, вам нужно указать другую функцию, которая ее вызывает. В вашем случае вы могли бы сделать

code = "functions{

  real integrand( real x,  // the observed Z-stat
                  real xc,
                  real[] theta,
                  real[] x_r,
                  int[] x_i ){

    // separate the parameters
    real zeta = theta[1];
    real eta = theta[2];
    real vi = theta[3];

    // significance indicator
    int signif; 
    signif = fabs(x) > 1.96;

    return( (1/eta) * (1 - signif) + signif ) * exp( normal_lpdf( x | zeta, sqrt(vi) ) );
  }

  real area(real[] theta, data real[] x_r) {
    int x_i[0];
    return integrate_1d(integrand, negative_infinity(), positive_infinity(),
                        theta, x_r, x_i, 1e-8);
  }
}"

library(rstan)
expose_stan_functions(stanc(model_code = code))
area(theta = rep(1, 3), x_r = double()) # yields 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...