如何计算 R 中给定分布的期望值?

How to calculate expected value of a given distribution in R?

提问人:Aku-Ville Lehtimäki 提问时间:10/6/2023 最后编辑:ThomasIsCodingAku-Ville Lehtimäki 更新时间:10/6/2023 访问量:84

问:

我遇到了一个问题,乍一看似乎根本没有问题。

我想编写一个函数,它将采用分布名称和参数作为参数,并返回给定分布的预期值。在我的代码中,我将使用参数 alpha = 0.2 和 beta = 0.3 的 Beta 分布。此分布的预期值为:0.2 / (0.2 + 0.3) = 0.2 / 0.5 = 0.4

最简单的方法似乎是采样:

estimatedExpectedValue <- function(distribution, parameters) {
  do.call(get(paste0("r",distribution)), as.list(c(10000, parameters))) %>% mean
}

estimatedExpectedValue("beta",c(0.2,0.3))
[1] 0.4006945

虽然这很容易实现,但样本均值“仅”是期望值的最大似然估计值,因此它总是有一些误差。这取决于上下文,这是否重要。

那么我们也知道,期望值的定义是:

\int_{-\infty}^{\infty} x \cdot f(x) , dx

...其中 f(x) 是密度函数,在 R 中我们可以进行数值积分,因此:

expectedValueFromIntegration <- function(distribution, parameters) {
  fnToBeIntegrated <- Vectorize(
    function(x) {x * do.call(get(paste0("d",distribution)), as.list(c(x, parameters)))},
    vectorize.args = c("x"))
  
  integrate(fnToBeIntegrated, lower = -Inf, upper = Inf)
}

expectedValueFromIntegration("beta",c(0.2,0.3))
Error in integrate(fnToBeIntegrated, lower = -Inf, upper = Inf) : 
  non-finite function value

但是,正如你所看到的,由于某种原因,dbeta 在某个时候放弃了 NaN,而集成函数不喜欢它。我很清楚对 Beta 分布的支持从 0 开始,到 1 结束,但在支持之外的密度应该是 0,从数学上讲,如果我们只是在实轴上积分,那么对于任何分布(即使是离散分布),一切都应该很好。

但是,在 R 中,如果我通过支持进行集成,它就会起作用:

expectedValueFromIntegration <- function(distribution, parameters) {
  fnToBeIntegrated <- Vectorize(
    function(x) {x * do.call(get(paste0("d",distribution)), as.list(c(x, parameters)))},
    vectorize.args = c("x"))
  
  integrate(fnToBeIntegrated, lower = 0, upper = 1)
}

expectedValueFromIntegration("beta",c(0.2,0.3))
0.4 with absolute error < 1.9e-05

但是,现在我需要知道(即输入)对分布的支持,或者至少创建一个某种查找表,因为据我所知,R 有不同分布的支持信息无处存储,我说得对吗?

有没有第三种方法可以做到这一点?我正在寻找一种通用的方法,因为我不喜欢做ifelse-structure,并且对每个发行版使用不同的方法。

r 数学 随机 数值积分 概率分布

评论

1赞 Stéphane Laurent 10/6/2023
beta 分布范围为 0 到 1。相应地更改集成边界。
0赞 Stéphane Laurent 10/6/2023
也许 search.r-project.org/CRAN/refmans/distributions3/html/......

答:

3赞 ThomasIsCoding 10/6/2023 #1

如果需要分布的支持,可以使用(分位数函数)通过指定为分位数来求解支持。q*c(0,1)


以下是一些示例,您可以根据自己的编码风格对其进行自定义

# support of beta distribution
> qbeta(0:1, 0.2, 0.3)
[1] 0 1

# support of gamma distribution
> qgamma(0:1, 0.2)
[1]   0 Inf

# support of norm distribution
> qnorm(0:1)
[1] -Inf  Inf

评论

0赞 Aku-Ville Lehtimäki 10/6/2023
当然,这(再次)比我想象的要容易。