R:使用重要性采样的蒙特卡罗积分

时间:2014-02-27 06:27:07

标签: r statistics pdf-generation probability

我有一个评估

的积分
      "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)

1 个答案:

答案 0 :(得分:4)

通常,您的方法似乎是正确的,但您必须对要集成的域更加谨慎。在原始示例中,大约20%的值rexp(1000, 1.5)高于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是什么。它只是一个常数吗?那么也许Weibull分布可能有效。

编辑:关于评论中的其他问题。 (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。你的下一个问题也是如此。