应用函数查找分布的高密度区域(编码)
Applying a function to find high density area of a distribution (coding)
背景:
最近,我遇到了 ( 另见下文),它为任何分布(单峰曲线)提供了两个极限值,使得从一个极限-另一个极限值的值覆盖了该分布的 95% 高密度区域。
该代码要求用户输入 分布的逆 cdf。对于 R 识别的分布,这是通过“qdistribution name
”实现的,例如 qf
、qchisq
等,以及“,
”,然后是“qdistribution name
”。例如,对于 F 分布,可以通过以下方式找到两个极限值:
HDIofICDF( qf , df1 = 10 , df2 = 90 )
或者对于卡方分布,可以使用:HDIofICDF( qchisq, df = 10)
编码问题:
假设我已经创建了自己的分布并且拥有该分布的逆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)
请注意,您的 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)
背景:
最近,我遇到了
该代码要求用户输入 分布的逆 cdf。对于 R 识别的分布,这是通过“qdistribution name
”实现的,例如 qf
、qchisq
等,以及“,
”,然后是“qdistribution name
”。例如,对于 F 分布,可以通过以下方式找到两个极限值:
HDIofICDF( qf , df1 = 10 , df2 = 90 )
或者对于卡方分布,可以使用:HDIofICDF( qchisq, df = 10)
编码问题:
假设我已经创建了自己的分布并且拥有该分布的逆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)
请注意,您的 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)