如何集成到Rcpp中以编写定义密度

时间:2019-07-01 08:45:10

标签: c++ r rcpp numerical-integration probability-density

一个相关的帖子是: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中的无穷大值之间进行积分。

0 个答案:

没有答案