`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 )
但是对 integrand
和 integrate_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
我是 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 )
但是对 integrand
和 integrate_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