【问题标题】:Problems in Numerical Integration through R [closed]通过 R 进行数值积分的问题
【发布时间】:2016-04-05 00:32:02
【问题描述】:

我有以下功能

f(x)∝|x| exp(-1/2 |x| )+1/(1+(x-40)^4 ),xϵR

我想通过辛普森方法(数值积分)、标准蒙特卡罗方法、接受拒绝抽样、重要性抽样、Metropolis-Hasting 算法、吉布斯抽样和贝叶斯算法找出 E(X) 和 E(X^3)使用 MCMC 的模型(我还没有决定)。

如何验证从不同方法获得的结果? 我试图用数学方法求解 E(X) 但找不到任何接近的形式。此功能可以分为不同的部分,如

absolute(x)*双指数密度 + 另一个利用 X 的更高幂 (4) 的反函数。 由于绝对 (x) 和范围 [-Inf, Inf] 我们总是必须将它划分为 [-Inf, 0] 和 [0, Inf]。通过按部分积分,我能够将第一部分视为(无限范围内的绝对(x)+(x^2/2))+这部分的积分无法在数学上找到。

所以我利用下面的代码得到数值积分结果为

Library(stats)
integrand <- function(x) {x*(abs(x)* exp(-0.5*abs(x))+(1/(1+(x-40)^4)))}
integrate(integrand, lower = -Inf, upper = Inf)

因此结果是 E(X)= 88.85766,绝对误差

例如,我从这些方法中获得的结果并不相似

(i) 通过辛普森方法我得到 E(X) = 0.3222642 和 E(X^3)=677.0711..

simpson_v2 <- function(fun, a, b, n=100) {
    # numerical integral using Simpson's rule
    # assume a < b and n is an even positive integer
    if (a == -Inf & b == Inf) {
        f <- function(t) (fun((1-t)/t) + fun((t-1)/t))/t^2
        s <- simpson_v2(f, 0, 1, n)
    } else if (a == -Inf & b != Inf) {
        f <- function(t) fun(b-(1-t)/t)/t^2
        s <- simpson_v2(f, 0, 1, n)
    } else if (a != -Inf & b == Inf) {
        f <- function(t) fun(a+(1-t)/t)/t^2
        s <- simpson_v2(f, 0, 1, n)
    } else {
        h <- (b-a)/n
        x <- seq(a, b, by=h)
        y <- fun(x)
        y[is.nan(y)]=0
        s <- y[1] + y[n+1] + 2*sum(y[seq(2,n,by=2)]) + 4 *sum(y[seq(3,n-1, by=2)])
        s <- s*h/3
    }
    return(s)
}

EX  <- function(x) x*(abs(x)* exp(-0.5*abs(x))+(1/(1+(x-40)^4)))
simpson_v2(EX, -Inf, Inf, n=100)

EX3 <- function(x) (x^3)*(abs(x)* exp(-0.5*abs(x))+(1/(1+(x-40)^4)))
simpson_v2(EX3, -Inf, Inf, n=100) 

(ii) 重要性抽样 我的提案密度是正常的,平均值=0,标准差=4。我应用的重要性抽样过程总结如下

假设我不能从 f(x) 中采样,这是真的,因为它没有众所周知的形式,并且 R 中没有内置函数可用于采样。因此,我建议使用另一个对数凹尾分布 N(0, 4) 来采样,这样我就不会估计 E(x),而是估计 E(x*f(x)/N(0,1))。我为此使用以下代码,它从 N(0,4) 中获取 100000 个样本

X <- rnorm(1e5, sd=4)
Y <- (X)*(abs(X)*exp(-0.5*abs(X))+(1/(1+(x-40)^4)))/(dnorm(X, sd=4))
mean(Y)

由于此代码需要从正态分布中随机抽样,因此每次我得到不同的答案,但它大约是 -0.1710694,与 0.3222642 几乎相似。我是从辛普森的方法中得到的。但是这些结果与积分()有很大的不同 E(X)= 88.85766。请注意,integrate() 使用自适应求积方法。这种方法与辛普森一家和重要性抽样不同吗?在比较这些方法时,我应该期望结果有什么相似性

【问题讨论】:

  • 这个问题太长了。另外,您如何建议从 -infinity 绘制到无穷大?只是有一个无限长的x轴?你想做某种转换吗?
  • 是的,这个问题太长了,但是我已经单独列出了每个问题,所以你可以回答你想回答的任何特定部分。但都与一个问题有关。我也一直对 [-Inf, Inf] 间隔感到困惑。起初,在 [-Inf, Inf] 上绘制函数是没有意义的。但这只是一个范围,函数可以通过更长的间隙 [-Inf, -1e20, -1e15, ...., +Inf] 绘制。如果不是,我应该假设有限区间来近似这个积分。
  • “我想在整个范围内可视化函数”。再次,您如何建议在有限屏幕上合并无限范围?仅仅因为你把它分成不同的部分并不意味着这就是这里处理问题的最佳方式。你也有很多与编程无关的问题。就目前而言,这个“问题”感觉“太宽泛”并且有被关闭的危险。
  • simpson_v2(integrand, 25, 50, n=1000) 是 88.843
  • 您未能提供随机变量的概率密度函数。或者您必须在非标准化版本中计算 E(1) 并除以它以获得正确的期望值。

标签: r math numerical-methods mcmc simpsons-rule


【解决方案1】:

首先,EXEX3 的定义是错误的,你错过了指数下的减号

好吧,这里有一些简化

更新

看起来你的EX 应该是40*\pi / \sqrt{2}

EX3 不是无穷大,我这里可能错了

更新 2

是的,EX3 是有限的,应该是 a^2*EX + \pi*a*3/\sqrt{2},其中a 等于 40

更新 3

如前所述,还需要规范化才能获得 EXEX3 的真实值

N = 8 + \pi/\sqrt{2}

计算积分除以N 以获得正确的矩。

【讨论】:

  • 支持分析解决方案。 40*pi/sqrt(2)88.85766
  • @Khashaa 谢谢!看起来EX3 也不错,integrate 和分析给出相同的142,438.8 答案
  • EX=5.2^(5/2)pi = 88.857658 看起来不错,正如 Khashaa 和 Severin 已经提到的那样。对于来自 (integral-calculator.com) 的 EX3,我得到的图表显示函数在 (-35, 0)、(0, 25)、(25, 55) 和这些区域之外具有一些行为几乎为零。所以基本上该区域必须有三个钟形曲线(-40、60)。当我试图在 R 中分别绘制 (-35, 0)、(0, 25)、(25, 60) 时。我在每个区域都得到一个钟形,但是对于 (0, 55), (-35, 55) 我没有分别为这些区域得到两条和三条曲线。我做错了什么?
  • 代码是curve((x^3)*(abs(x)* exp(-0.5*abs(x))+(1/(1+(x-40)^4) )), -35, 60)
  • 感谢@SeverinPappadeux 指出减号错误。
猜你喜欢
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 2016-07-12
  • 2016-12-16
  • 2016-08-11
  • 2018-01-17
  • 1970-01-01
  • 2017-03-16
相关资源
最近更新 更多