【问题标题】:R: monte carlo integration using Importance SamplingR:使用重要性采样的蒙特卡洛积分
【发布时间】:2014-03-30 10:04:10
【问题描述】:

我有一个积分要评估

      "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 仅在观察绘图后,我才选择 normal PDF = g(x)(平均值 = 0.5 和 SD = 5)作为近似值。我为它写了一个类似的代码,但它说在重要性采样的情况下会产生 NaN。 (理想情况下这意味着未定义的函数,但我不知道如何解决)。

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

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

【问题讨论】:

    标签: r statistics pdf-generation probability


    【解决方案1】:

    一般来说,您的方法似乎是正确的,但您必须更加小心要集成的域。在您的原始示例中,大约 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 是什么。它只是一个常数吗?那么也许威布尔分布可能会起作用。

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

    【讨论】:

    • 首先感谢您积极而详细的解释。更多问题:1)pexp 是 PDF,知道了。但是选择包含它的动机或基础是什么?如果我的区间在 [0.3,8] 中的 x 之间,这有关系吗? 2)我在提到平均值时犯了一个错误,我确实取了0.5。但是,如何决定较小的方差?我在想我可能理解错误的概念 - 选择的 PDF 应该或多或少地涵盖要评估的积分是否正确?还是必须遵循曲线和峰,并更加重视峰的大部分?
    • 另外,第二个例子是双积分。如果我有多个变量 - 例如 x^2 + y^2 --x,y in[-1,1] 或 exp^(x+y) 或上述函数。我如何为这些选择 PDF?并且鉴于我们没有标准函数来从 R 中的这些生成样本,我是否必须从另一种方法生成样本?也许,接受 - 拒绝? (我意识到这是很长的问题,但我会非常感谢能够巩固我脑海中概念的解释)
    猜你喜欢
    • 2012-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2016-03-21
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多