【问题标题】:Applying a function to find high density area of a distribution (coding)应用函数查找分布的高密度区域(编码)
【发布时间】:2017-03-24 16:18:20
【问题描述】:

背景:

最近,我遇到了an R function called HDIofICDF另见下文),它为任何分布(单峰曲线)提供了两个极限值,例如从一个极限值到另一个极限值覆盖该分布 95% 的高密度区域。

代码要求用户放置分布的Inverse cdf。对于 R 识别的分布,这是通过“qdistribution name”例如qfqchisq 等和“,”以及“qdistribution name”所需的参数来实现的。例如,对于 F 分布,可以通过以下方式找到两个极限值:

HDIofICDF( qf , df1 = 10 , df2 = 90 ) 或者对于卡方分布,可以使用:HDIofICDF( qchisq, df = 10)

编码问题:

假设我创建了自己的发行版并拥有此发行版的 Inverse cdf。我的 Inverse cdf(类似于 R 中的“qdistribution name”)是在我使用时给出的(仅作为一个例子来展示我的 Inverse cdf 使用的参数):

invcdf.posterior(p = .025, t = 2.81, N1 = 10, N2 = 10, rscale = 1 )

现在:鉴于我的 invcdf.posterior 及其上面的参数,我如何使用 HDIofICDF 函数来获取我的分布的两个极限值?

这是我的 R 代码:

HDIofICDF = function( ICDFname , credMass=0.95 , tol=1e-8 , ... ) {

 incredMass = 1.0 - credMass
 intervalWidth = function( lowTailPr , ICDFname , credMass , ... ) {
 ICDFname( credMass + lowTailPr , ... ) - ICDFname( lowTailPr , ... )
}
optInfo = optimize( intervalWidth , c( 0 , incredMass ) , ICDFname=ICDFname ,
                  credMass=credMass , tol=tol , ... )
 HDIlowTailPr = optInfo$minimum
 return( c( ICDFname( HDIlowTailPr , ... ) ,
         ICDFname( credMass + HDIlowTailPr , ... ) ) )
}
##########################################################################
## Example 1 of use: ##

HDIofICDF( qf , df1 = 10 , df2 = 90 ) ## This is a F distribution working OK

这就是我尝试将 HDIofICDF 函数应用于我自己的分发的方法:

HDIofICDF( invcdf.posterior, t = 2.81, N1 = 10 , N2 = 10, rscale = 1 ) ## Not working

我得到的错误是:

Error in eval(expr, envir, enclos) : argument "t" is missing, with no default Called from: eval(expr, envir, enclos)

【问题讨论】:

  • 你说“不工作”,但你的意思是什么?您是否得到错误的结果或错误消息?如果是这样,错误信息是什么?
  • @JorisMeys,我刚刚编辑了我的帖子,请看最底部。我最重要的问题是:我是否正确应用了我的invcdf.posterior 逆分布。对 HDIofICDF 函数的作用与否?

标签: r function statistics distribution bayesian


【解决方案1】:

请注意,您的 HDIofICDF 函数有一个参数 tol

由于部分参数匹配,当您调用HDIofICDF(invcdf.posterior, t = 2.81, N1 = 10 , N2 = 10, rscale = 1) 时,您指定的t 被假定为tol。 (您可以通过修改 HDIofICDF 函数以打印 tol 来验证这一点。)因此,当您的 invcdf.posterior 随后被调用时,R 会抱怨缺少 t 参数。

这是一个玩具示例,说明了正在发生的事情:

fun1 <- function(a, b) a + b
fun2 <- function(aaa, ...) fun1(...)
fun2(a = 1, b = 2)
# Error in fun1(...) : argument "a" is missing, with no default
fun2(aaa = 99, a = 1, b = 2)
# [1] 3

如上例所示,要解决您的问题,请在调用 HDIofICDF 时明确指定 tol,例如

HDIofICDF( invcdf.posterior, t = 2.81, N1 = 10 , N2 = 10, rscale = 1, tol = 1e-8)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多