应用函数查找分布的高密度区域(编码)

时间:2017-03-24 16:18:21

标签: r function statistics distribution bayesian

背景

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

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

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

编码问题:

假设我创建了自己的发行版并拥有此发行版的反向cdf 。我使用反向cdf (类似于R中的“qdistribution name”)(仅作为示例显示我的反向cdf 使用的参数) :

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

现在:根据我的invcdf.posterior及其参数,如何使用 HDIofICDF 函数获取我的发布的两个限制值?< / p>

这是我的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)

1 个答案:

答案 0 :(得分: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

根据上述示例的建议,要解决您的问题,请在调用tol时明确指定HDIofICDF,例如

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