一个相关的帖子是:How to use Rcpp to do numerical integration in C++ within R
我发现您可以使用RcppNumerical尝试执行此操作,请参见:https://www.r-bloggers.com/rcppnumerical-numerical-integration-and-optimization-with-rcpp/
但是,我在理解如何实现这一点时遇到了麻烦。我想在Rcpp中定义一个密度,为此,我通常在函数上进行数值积分,以便获得密度。
问题陈述:我正在努力如何从-Infinity到Infinity的函数之间进行积分,这对于找到密度的归一化常数是必不可少的。
特别是对于我的问题,我试图实现与exp(-(((x-mu)^ 4)/ 2)成正比的密度。
重现问题的代码:
// [[Rcpp::depends(RcppEigen)]]
// [[Rcpp::depends(RcppNumerical)]]
#include <RcppNumerical.h>
using namespace Numer;
using namespace Rcpp;
class target_exp_4_unnorm: public Func
{
private:
double mean;
public:
target_exp_4_unnorm(double mean_) : mean(mean_) {}
double operator()(const double& x) const
{
return exp(-pow(x-mean, 4) / 2);
}
};
// [[Rcpp::export]]
double target_exp_4_norm_constant(const double &mean) {
target_exp_4_unnorm f(mean);
double err_est;
int err_code;
return integrate(f, R_NegInf, R_PosInf, err_est, err_code);
}
// [[Rcpp::export]]
Rcpp::NumericVector target_density_exp_4_rcpp(Rcpp::NumericVector &x, const double &mean) {
// creating a vector f to store density values for each x
Rcpp::NumericVector f;
double norm_constant = target_exp_4_norm_constant(mean);
for (int i = 0; i < x.size(); ++i) {
f.push_back(exp(-pow(x[i]-mean, 4) / 2) / norm_constant);
}
return f;
}
特定问题或错误:
target_exp_4_norm_constant(0)
# returns NaN
在这里,在我上面的代码中:
target_exp_4_norm_constant
应该给我归一化常数target_density_exp_4
除以归一化常数后,应该给我密度。但是,当我尝试使用target_exp_4_norm_constant
时,总是得到NaN值,因为我试图将-Infinity集成到Infinity。但是,当我指定特定的值时,它将不起作用。有谁知道我该如何解决?
在基数R中,您可以使用integrate
函数轻松地做到这一点。
期望的行为:我可以在Rcpp中的无穷大值之间进行积分。