背景
qbeta(p, shape1, shape2)
是一个内置的基本R函数。在此功能中,shape1
和shape2
始终是> 0(为了我的目的总是> 1)。而且,p
是概率,因此0 <= p <= 1。
问题:
假设我知道qbeta(p = c(.025, .975), shape1 = x, shape2 = y ) = c(.3, .8 )
,那么,有没有办法可以找出 x 和 y 合理的内容(即,在某些范围内)误差)?
注意:我相信, HERE 中提供了一些相关的评论和代码。因此,如果其中一位同事能够理解或使用这些代码和评论并在此处应用它们,我将非常感激。
最后,我的最终目标是将功能包装出 x &amp; y 查找过程。
答案 0 :(得分:2)
这是一种蛮力方法。我希望其他人能够提出一个更聪明的方法来做到这一点。
d = expand.grid(shape1 = 1:100/10, shape2 = 1:100/10)
for (i in 1:NROW(d)){
x = round(qbeta(p = c(0.025, 0.975), shape1 = d[i,1], shape2 = d[i,2]),2)
if(x[1] > 0.28 & x[1] < 0.32 & x[2] > 0.78 & x[2] < 0.82){
print(d[i,])
break
}
}
# shape1 shape2
#5368 6.8 5.4
qbeta(p = c(.025, .975), shape1 = 6.8, shape2 = 5.4)
#[1] 0.2860268 0.8109389
的解决方案
################################
#REQUIRED FUNCTIONS
# Logistic transformation of the Beta CDF.
f.beta <- function(alpha, beta, x, lower=0, upper=1) {
p <- pbeta((x-lower)/(upper-lower), alpha, beta)
log(p/(1-p))
}
# Sums of squares.
delta <- function(fit, actual){
sum((fit-actual)^2)
}
# The objective function handles the transformed parameters `theta` and
# uses `f.beta` and `delta` to fit the values and measure their discrepancies.
objective <- function(theta, x, prob, ...) {
ab <- exp(theta) # Parameters are the *logs* of alpha and beta
fit <- f.beta(ab[1], ab[2], x, ...)
return (delta(fit, prob))
}
################################
#INPUT
x <- c(.3, .8)
x.p <- (function(p) log(p/(1-p)))(c(0.025, 0.975))
#SOLVE
start <- log(c(1e1, 1e1))
sol <- nlm(objective, start, x=x, prob=x.p, lower=0, upper=1,
typsize=c(1,1), fscale=1e-12, gradtol=1e-12)
parms <- exp(sol$estimate)
#ANSWER
parms
#[1] 7.597429 6.016240
#TEST
qbeta(p = c(.025, .975), parms[1], parms[2])
#[1] 0.3 0.8