`integrate_1d` 语法和交互式调试

`integrate_1d` syntax and interactively debugging it

我是 rstan/Stan 的初次尝试设置自定义可能性并使用 integrate_1d 整合它的用户。基于documentation,我设置我的被积函数如下:

// 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) ) );
  }

我正在尝试测试和调试此函数,因为当我 运行 我的模型时,它最终会导致评估对数似然的错误。为此,我希望能够以交互方式 运行 函数,传递我自己选择的参数。我正在尝试使用 rstan 的 expose_stan_functions 来执行此操作:

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 )

但是对 integrandintegrate_1d 的调用每次都抛出错误

Error: unexpected ','

就好像我用根本不正确的语法调用函数一样。 (在调用 integrate_1d 时,我不太确定如何处理 xc。我省略了它,因为文档(第 9.3.2.4 节)似乎建议它应该是 NaN对于不定积分。)

如果 expose_stan_functions 不是理想的方式,我也欢迎关于交互式调试 integrand 的完全不同的建议。

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