【问题标题】:Base R Function Convolution基 R 函数卷积
【发布时间】:2017-04-29 02:59:24
【问题描述】:

我正在构建一个函数集合,这些函数从两个独立随机变量的 pdf 中返回概率密度函数 (pdf)。

最常见的例子是独立随机变量 XY 的总和,由它们的 pdf 卷积给出。

post 之后,我定义了以下函数,该函数将一对 pdf 作为参数,并返回它们的卷积:

dSumXY <- function(dX, dY){

  # Create convolution of distributions.
  dReturn <- function(z){
    integrate( function(x,z){
      dX(x) * dY(z - x) },
      -Inf, Inf, z)$value
  }

  # Vectorize convolution.
  dReturn <- Vectorize(dReturn)

  return(dReturn)  
}

这在以下示例中按预期工作:

# Define pdfs of two (identical) uniform [-1,1] distributions
unifX <- function(x) dunif(x, min = -1, max = 1)
unifY <- function(x) dunif(x, min = -1, max = 1)

# Find convolution of their pdfs.
convXY <- dSumXY(unifX, unifY)

# Plot the convolved pdf.
plot(seq(-3,3,by = 0.1), convXY(seq(-3,3,by = 0.1) ), type = 'l')

# Sample from the distribution
convSample <- runif(10000, min = -1, max = 1) + runif(10000, min = -1, max = 1)

# Plot density of sample.
lines( density(convSample) , col = "red" )

更一般地说,这适用于许多均匀分布对的组合,但是当我尝试对一对 Uniform[1,2] 分布进行卷积时,我没有得到真正的结果:

# Define pdfs of two (identical) uniform [1,2] distributions
unifX2 <- function(x) dunif(x, min = 1, max = 2)
unifY2 <- function(x) dunif(x, min = 1, max = 2)

# Find convolution of their pdfs.
convXY2 <- dSumXY(unifX2, unifY2)

# Plot the convolved pdf.
plot(seq(1,5,by = 0.1), convXY2(seq(1,5,by = 0.1) ), type = 'l')

# Sample from the distribution
convSample2 <- runif(10000, min = 1, max = 2) + runif(10000, min = 1, max = 2)

# Plot density of sample.
lines( density(convSample2) , col = "red" )

特别是,(有一点概率知识!)很明显,两个 Uniform[1,2] 变量之和的 pdf 在 3.75 处应为非零;特别是它应该等于 1/4。不过

# This should be equal to 1/4, but returns 0.
convXY2(3.75)

我已经在两台不同的机器上尝试过这个并复制了同样的问题,所以我很想看看问题是从哪里引起的。

提前致谢。

【问题讨论】:

    标签: r convolution probability-density


    【解决方案1】:

    问题来自 Integrate 函数,该函数正在努力解决该函数具有紧凑支持这一事实,但是,它被要求在无限范围内进行积分。如果将积分范围更改为函数支持的范围(即 [1,2]),则它没有问题。

    【讨论】:

    • 所以这是我考虑过的,但我不明白为什么它可以处理一些示例(例如 Uniform[-1,1] 的第一种情况),但不能处理其他情况。为什么它可以处理一些具有紧凑支持的功能,而不能处理其他功能?
    • 如果你使用 Uniform(x,x+1) 重复计算,那么它在 -1
    • 嗨 Rob,所以我同意对于 x 的许多选择(在您的示例中)它是有效的:我认为您的观察是正确的:-1
    • 我不认为这是一个错误,一般来说,我认为不可能将函数与 (-inf,inf) 上的紧凑支持进行数字集成,例如在我上面的例子中考虑 x=10^1000 。查看 QUADPACK Integrate 所基于的基础包的文档,该文档建议在任何不连续性或导数奇点处打破积分。有时它可能会奏效,但我认为这只是运气。
    • 我确实阅读了 Integrate 的帮助,实际上它确实强调了集成一个“在几乎所有范围内近似恒定(特别是零)的函数,结果和错误可能估计可能严重错误”。令我惊讶的是,nearly all' includes the case of doing the convolution of two Unif[1,2] variables over the range [0,6]. I personally wouldn't call 5/6 of a domain 几乎全部...但我想这就是我!感谢您强调这个稳定性问题......现在的问题是我该如何解决它!
    【解决方案2】:

    dunif 以整数交易...

    dunif(.9, 1, 2)
    [1] 0
    
    dunif(1, 1, 2)
    [1] 1
    
    dunif(1.5, 1, 2)
    [1] 1
    
    dunif(2, 1, 2)
    [1] 1
    
    dunif(2.1, 1, 2)
    [1] 0
    

    如果您只对函数使用整数然后进行插值,您会得到预期的答案。

    convXY2(2)
    [1] 0
    
    convXY2(3)
    [1] 1
    
    convXY2(4)
    [1] 0
    
    z <- 3.75
    remainder <- z %% 1
    convXY2(floor(z))*(1-remainder) + convXY2(ceiling(z))*(remainder) 
    [1] 0.25
    

    您的函数适用于其他连续分布,因此您可能只需要在包装函数中考虑这种特定情况。或者使用 dunif 以外的其他东西,它可以根据你给出的精度有效地划分你的概率。

    dunif2 <- function(x, min, max) { if (x >= min & x <= max) { return(10^-nchar(strsplit(as.character(x), "\\.")[[1]][[2]])) } else { return(0) } }
    
    dunif2(1.45, 1, 2)
    [1] 0.01
    
    dunif2(1.4, 1, 2)
    [1] 0.1
    

    【讨论】:

    • 这不是意味着 convXY2(3.5) 会返回 0 吗?但它确实返回 0.5,这是预期的值。
    • 这是真的。我只能说这是一个更简单的修复,不需要更改您的 dSumXY 函数。
    猜你喜欢
    • 2014-07-12
    • 2020-06-07
    • 1970-01-01
    • 2016-06-12
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多