R - 重要性采样来解决积分

时间:2014-03-06 04:18:25

标签: r statistics probability

我已经提到这些链接 - herehere。后一个链接是我的一个问题,但结果并不完全正确。

因此,我正在创建一个问题,尝试回答它的新尝试。

  • 我有以下积分

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

    要使用重要性采样MC集成解决此问题,需要选择与功能图

  • 大致相同的重要性pdf

我的R代码解决了同样的问题:

#function 1 - importance sampling
w <- function(x) dunif(x,0.01,1)/dbeta(x,0.7,1)
f <- function(x) x^(-0.5)
X <- rbeta(1000,0.7,1)
Y <- w(X)*f(X)
c(mean(Y),var(Y))

真正的积分值 - 1.8

使用上面的重要性采样代码 - 1.82(我的重要性PDF是 Beta(0.7,1)

这很好,所以我假设代码是正确的。

  • 现在我有了这个整体

    [1+sinh(2x)ln(x)]^-1 ;in x=[0.8,3]

我的代码是:

#function 2 
w <- function(x) dunif(x,0.01,1)/dnorm(x,0.5,0.25)
f <- function(x) (1+sinh(2*x)*log(x))^(-1)
X <- rnorm(1000,0.5,0.25)
Y <- w(X)*f(X)
Y <- Y[!is.na(Y)]
c(mean(Y),var(Y))

真积分值 ~0.601

执行上述代码的价值 ~3.25(我的重要性PDF 正常(0.5,sd = 0.25)


我做错了什么?

1)将函数评估为f(x)。

2)从重要性PDF g(x)生成在间隔之间截断的样本。

3)得到平均值(f(x)/ g(x)),这是积分。


EDITS

根据Nishanth的建议,代码中的更改如下:

 set.seed(19)
 w <- function(x) dunif(x,0.8,3)/dnorm(x,0.8,1.49)
 f <- function(x) (1+sinh(2*x)*log(x))^(-1)
 X <- rnorm(1000,0.8,1.49)
 X <- X[X > 0.8 & X < 3]
 Y <- w(X)*f(X)
 c(mean(Y),var(Y))

然而,即使估计接近实际值,也不会发生方差减少(与强力MC和分层抽样相比)

此外,如果有人想验证重要性PDF的选择,则上传要集成的功能的图。 enter image description here

1 个答案:

答案 0 :(得分:1)

重量函数的选择在重要性抽样中起着至关重要的作用。为了获得更快的收敛,必须调整参数 - 当不存在适当的反函数时,这主要是临时的。我会对您的代码进行以下更改:

> w <- function(x) dunif(x,0.3,8)/dnorm(x,0.3,0.4)
> f <- function(x) (1+sinh(2*x)*log(x))^(-1)
> X <- rnorm(1000,0.3,0.4)
> X <- X[X > 0.3 & X < 8]
> Y <- w(X)*f(X)
> c(mean(Y),var(Y))
[1] 0.703766099 0.005848816