繁体   English   中英

R:使用重要性采样进行蒙特卡洛集成

[英]R: monte carlo integration using Importance Sampling

我有一个整体来评估

      "x^(-0.5)" ; x in [0.01,1] 

为此,我正在使用重要性采样MC:理论上说,必须使用近似PDF来计算期望值(几乎可以肯定地收敛到积分的均值)

绘制给定的积分,和指数PDF,仅基于该地块后,我选择了rexpdexp生成PDF -我的代码如下所示-

#Without Importance Sampling
set.seed(1909)
X <- runif(1000,0.01,1)
Y <- X^(-0.5)
c( mean(Y), var(Y) )

#Importance sampling Monte Carlo
w <- function(x) dunif(x, 0.01, 1)/dexp(x,rate=1.5)
f <- function(x) x^(-0.5)
X= rexp(1000,rate=1.5)
Y=w(X)*f(X)
c( mean(Y), var(Y) )

有人可以确认我的想法是否正确吗? 如果错了,我应该怎么做呢? 请阐明-我已经了解了理论,但是实践证明对我来说是有问题的。

对于不是那么简单的积分,

1.) f(x) = [1 + sinh(2x)ln(x)] ^-1我仅在观察图后才选择正常的PDF = g(x) (均值= 0.5和SD = 5)作为近似值。 我为此编写了类似的代码,但是它说NaN是在重要性抽样的情况下产生的。 (这在理想情况下意味着未定义的函数,但我不知道如何解决)。

2.) f(x,y) = exp(-x ^ 4-y ^ 4)

如何为上述函数选择g(x,y)

通常,您的方法似乎是正确的,但是对于要集成的域,您必须格外小心。 在您的原始示例中,值rexp(1000, 1.5)大约20%大于1。函数dexp(x, rate=1.5)不是间隔[0,1]上的密度函数。 您必须除以pexp(1, rate=1.5) 因此,这就是我对重要性抽样示例的处理方式:

#Importance sampling Monte Carlo
w <- function(x) dunif(x, 0.01, 1)/dexp(x,rate=1.5) * pexp(1, rate=1.5)
f <- function(x) x^(-0.5)
X <- rexp(1000,rate=1.5)
X <- X[X<=1]
Y <- w(X)*f(X)
c(mean(Y), var(Y))

在您的第二个示例中,相同的原因导致了问题。 您得到负X,因此得到log(X)的NA值。 此外,您的法线函数应以0.5为中心,且方差较小。 这是我的方法:

#Without Importance Sampling
set.seed(1909)
X <- runif(1000,0.01,1)
Y <- (1+sinh(2*X)*log(X))^(-1)
c(mean(Y), var(Y))

#Importance sampling Monte Carlo
w <- function(x) dunif(x, 0.01, 1)/dnorm(x, mean=0.5, sd=0.25) * (1-2*pnorm(0, mean=0.5, sd=0.25))
f <- function(x) (1+sinh(2*x)*log(x))^(-1)
X <- rnorm(1000, mean=0.5, sd=0.25)
Y1 <- w(X)
Y2 <- f(X)
Y <- Y1*Y2
Y <- Y[!(is.na(Y2)&Y1==0)]
c(mean(Y), var(Y))

在您的第二个示例中,我不太了解y是什么。 它只是一个常数吗? 那么也许威布尔分布可能起作用。

编辑:关于您在评论中的其他问题。 (1)任何概率密度函数都应积分为1。因此dexp(x, rate=1.5)不是区间[0,1]上的密度函数,它仅积分为pexp(1, rate=1.5) 但是功能

dexp01 <- function(x, rate){
  dexp(x, rate=rate)/pexp(1, rate=rate)
}

实际上集成到1:

integrate(dexp, 0, 1, rate=1.5)
integrate(dexp01, 0, 1, rate=1.5)

这就是包含概率分布函数的理由。 如果您使用不同的间隔,例如[0.3,8],则必须相应地调整功能:

dexp0.3_8 <- function(x, rate){
  dexp(x, rate=rate)/(pexp(8, rate=rate)-pexp(0.3, rate=rate))
}
integrate(dexp0.3_8, 0.3, 8, rate=1.5)

(2)在这里,我选择方差,以便rnorm(1000, .5, .25)中大约95%的值在从0到1的区间内(此区间之外的许多值肯定会增加方差)。 但是,我不确定这是分布函数的最佳选择。 重要性函数的选择是我不太熟悉的问题。 您可以在CrossValidated询问 下一个问题也一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM