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

cnh2zyt3  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(147)

我被一个起初似乎根本没有问题的问题卡住了。
我想写一个函数,它将采用分发名称和参数作为参数,并返回给定分发的预期值。在我的代码中,我将使用Beta分布,参数alpha = 0.2,beta = 0.3。该分布的期望值为: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

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

...其中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结构,并为每个发行版使用不同的方法。

67up9zun

67up9zun1#

如果你需要分布的支持,你可以使用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

相关问题