嵌套积分可实现高斯密度的不完全卷积

时间:2019-05-28 09:59:08

标签: r nested convolution

g(x) = 1/(2*pi) exp ( - x^2 / 2)为均值为0和标准偏差为1的正态分布的密度。在某些计算中,纸上出现了形式为的积分

enter image description here

其中c> 0是一个正数。

由于我无法手动进行评估,因此我想到了将其近似并绘制的想法。我在R中尝试过此操作,因为R提供了dnorm函数和一个执行积分的函数。

您看到我需要数字积分n次,其中n将通过调用plot函数来选择。我的代码有一个for循环,可以迭代地创建那些“不完整”的卷积。

例如,即使n = 3和c = 1,这也会给我一个错误。 n = 2(因此是一个积分)起作用。

N = 3

ngauss <- function(x) dnorm(x , mean = 0, sd = 1)

convoluts <- list()
convoluts[[1]] <- ngauss

for (i in 2:N) {

 h <- function(y) {
   g <- function(z) {ngauss(y-z)*convoluts[[i-1]](z)}
   return(integrate(g, lower = -1, upper = 1)$value)
 }
 h <- Vectorize(h)

 convoluts[[i]] <- h

}

convoluts[[3]](0)

我得到的是:

  

错误:评估嵌套太深:无限递归/   options(expressions =)?

我知道这是一个艰苦的计算,但是对于“小” n,应该有类似的可能。

也许有人可以帮助我修复我的代码或提供建议,说明如何以更好的方式实现它。另一种更合适的语言也可以。

1 个答案:

答案 0 :(得分:1)

问题似乎在于integrate如何处理不同环境中的变量。特别是,它并没有真正在每次迭代中正确地处理i。代替使用

  h <- evalq(function(y) {
    g <- function(z) {ngauss(y - z) * convoluts[[i - 1]](z)}
    integrate(g, lower = -1, upper = 1)$value
  }, list(i = i))

完成这项工作,例如快速设置N <- 6可以

convoluts[[N]](0)
# [1] 0.03423872

由于您的积分只是N个独立标准法线之和的pdf(然后遵循N(0,N)),因此我们也可以通过设置lower = -Inf和{{ 1}}。然后有了upper = Inf,我们有了

N <- 4

因此,出于实用目的,当使用dnorm(0, sd = sqrt(N)) # [1] 0.1994711 convoluts[[N]](0) # [1] 0.1994711 时,最好使用c = Inf而不是手动计算。