【发布时间】: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