使用基R,我想知道如果我能确定表示为曲线下的95%的区域posterior下面?

更具体地说,我想从mode (绿色虚线)移动到尾部,然后当我覆盖95%的曲线区域时停止。 所需的x轴值是这95%面积的极限,如下图所示?

     prior = function(x) dbeta(x, 15.566, 7.051) 
likelihood = function(x) dbinom(55, 100, x)
 posterior = function(x) prior(x)*likelihood(x)

mode = optimize(posterior, interval = c(0, 1), maximum = TRUE, tol = 1e-12)[[1]]

curve(posterior, n = 1e4)

PS换句话说,非常希望这样的间隔是可能的最短95%间隔。

在此输入图像描述

#1楼 票数:11 已采纳

对称分布

尽管OP的例子不是完全对称的,但它足够接近 - 并且因为解决方案更加简单而有用。

您可以使用integrateoptimize的组合。 我把它写成自定义函数,但请注意,如果你在其他情况下使用它,你可能不得不重新考虑搜索分位数的界限。

# For a distribution with a single peak, find the symmetric!
# interval that contains probs probability. Search over 'range'.
f_quan <- function(fun, probs, range=c(0,1)){

  mode <- optimize(fun, interval = range, maximum = TRUE, tol = 1e-12)[[1]]

  total_area <- integrate(fun, range[1], range[2])[[1]]

  O <- function(d){
    parea <- integrate(fun, mode-d, mode+d)[[1]] / total_area
    (probs - parea)^2
  }
  # Bounds for searching may need some adjustment depending on the problem!
  o <- optimize(O, c(0,range[2]/2 - 1E-02))[[1]]

return(c(mode-o, mode+o))
}

像这样使用它,

f <- f_quan(posterior, 0.95)
curve(posterior, n = 1e4)
abline(v=f, col="blue", lwd=2, lty=3)

在此输入图像描述

不对称分布

在不对称分布的情况下,我们必须搜索满足P(a <x <b)= Prob的标准的两个点,其中Prob是一些期望的概率。 由于有无限多个间隔(a,b)满足这个要求,OP建议找到最短的间隔。

解决方案中重要的是domain的定义,我们想要搜索的区域(我们不能使用-Inf, Inf ,因此用户必须将其设置为合理的值)。

# consider interval (a,b) on the x-axis
# integrate our function, normalize to total area, to 
# get the total probability in the interval
prob_ab <- function(fun, a, b, domain){
  totarea <- integrate(fun, domain[1], domain[2])[[1]]
  integrate(fun, a, b)[[1]] / totarea
}

# now given a and the probability, invert to find b
invert_prob_ab <- function(fun, a, prob, domain){

  O <- function(b, fun, a, prob){
    (prob_ab(fun, a, b, domain=domain) - prob)^2
  }

  b <- optimize(O, c(a, domain[2]), a = a, fun=fun, prob=prob)$minimum

return(b)
}

# now find the shortest interval by varying a
# Simplification: don't search past the mode, otherwise getting close
# to the right-hand side of domain will give serious trouble!
prob_int_shortest <- function(fun, prob, domain){

  mode <- optimize(fun, interval = domain, maximum = TRUE, tol = 1e-12)[[1]]

  # objective function to be minimized: the width of the interval
  O <- function(a, fun, prob, domain){
    b <- invert_prob_ab(fun, a, prob, domain)

    b - a
  }

  # shortest interval that meets criterium
  abest <- optimize(O, c(0,mode), fun=fun, prob=prob, domain=domain)$minimum

  # now return the interval
  b <- invert_prob_ab(fun, abest, prob, domain)

return(c(abest,b))
}

现在使用上面这样的代码。 我使用非常不对称的函数(假设mydist实际上是一些复杂的pdf,而不是dgamma)。

mydist <- function(x)dgamma(x, shape=2)
curve(mydist(x), from=0,  to=10)
abline(v=prob_int_shortest(mydist, 0.9, c(0,10)), lty=3, col="blue", lwd=2)

在这个例子中,我将域设置为(0,10),因为显然间隔必须在某处。 请注意,使用像(0,1E05)这样的非常大的值不起作用,因为integrate在长序列的近零中存在问题。 同样,对于您的情况,您将不得不调整域名(除非有人有更好的想法!)。

在此输入图像描述

#2楼 票数:1

这是一个利用梯形规则的解决方案。 你会注意到@Remko提供的解决方案是非常优越的,但是这个解决方案希望增加一些教学价值,因为它阐明了复杂的问题可以简化为简单的几何,算术和基本编程结构,例如for loops

findXVals <- function(lim, p) {
    ## (1/p) is the precision

    ## area of a trapezoid
    trapez <- function(h1, h2, w) {(h1 + h2) * w / 2}

    yVals <- posterior((1:(p - 1))/p)
    m <- which.max(yVals)
    nZ <- which(yVals > 1/p)

    b <- m + 1
    e <- m - 1
    a <- f <- m

    area <- 0
    myRng <- 1:(length(nZ)-1)
    totArea <- sum(trapez(yVals[nZ[myRng]], yVals[nZ[myRng+1]], 1/p))
    targetArea <- totArea * lim

    while (area < targetArea) {
        area <- area + trapez(yVals[a], yVals[b], 1/p) + trapez(yVals[e], yVals[f], 1/p)
        a <- b
        b <- b + 1
        f <- e
        e <- e - 1
    }

    c((a - 1)/p, (f + 1)/p)
}

findXVals(.95, 10^5)
[1] 0.66375 0.48975

  ask by rnorouzian translate from so

未解决问题?本站智能推荐:

1回复

查找不对称曲线下覆盖95%面积的区间

我想从称为posterior的曲线的模式(红色垂直线)移向尾巴,并在覆盖posterior 95%区域时停止。 我的愿望是找到可以做到的最短间隔(以X轴为单位)。 需要这样的间隔的两个极限值吗? 注意:我已经在这里尝试了第一个解决方案。 但是该解决方案不适用于当前问题! PS请
1回复

给定R中的分位数,在qbeta()中求解shape1和shape2

背景: qbeta(p, shape1, shape2)是内置的基本R函数。 在此函数中, shape1和shape2始终> 0(就我而言,始终> 1)。 同样, p是概率,因此0 <= p <= 1。 题: 假设我知道qbeta(p = c(.02
2回复

给定R中的分位数,在qcauchy()中求解x和y

背景: qcauchy(p, location, scale)是内置的R函数。 在此功能中,“ 位置 ”指示中心 ,“ 比例 ”指示对称的钟形曲线(与正态分布一样)的spedoutness 。 “位置”可以是任何数字(负数,正数,非整数等)。 并且“ scale”可以是大于“ 0”的
1回复

使用 Optimi 拟合二次函数

我需要使用optim()将二次函数 $f(x) = ax^2+bx+c$ 拟合到数据中,并指定梯度函数。 我已经对以下内容进行了编码: 但是,指令说梯度是拟合度量的梯度,而不是 $f(x)$ 的导数,并且梯度函数返回长度为 3 的向量:拟合度量相对于 $a 的偏导数$,然后关于 $b$,然后关
1回复

如何使用optmi方法梯度函数?

如何使用 optim() 方法的梯度将 $f(x) = ax^2+bx+c$ 拟合到给定的 (x,y) 数据集? 我已经搜索了几个小时,但没有找到合适的解释。 $ 我相信在上述情况下梯度函数应该返回一个长度为 3 的向量:拟合度量相对于 $a$ 的偏导数,然后是关于 $b$,然后是关于 $c$。
3回复

使用optimize()查找占用R中曲线下95%面积的最短间隔

背景: 我有一条曲线,其Y值由下面的我的小R函数产生( 标明 )。 如果运行我的整个R代码,则会看到我的曲线(但是请记住,这是一个函数,因此如果我更改参数值,我可以得到另一条曲线): 题: 显然,可以确定/假设许多区间将覆盖/占据此曲线下总面积的95%。 但是,使用o
1回复

对R中的曲线积分返回0

我想知道为什么在我下面的代码中integrate下面显示的曲线返回0 ? 我猜想它与Vectorize ,但是有解决办法吗?
1回复

使用R返回集成函数

假设我在R中定义了以下函数: 我可以这样做以将其在0和pi之间进行积分: 但是,如果我想评估并返回F的一些值,则会出现此错误: 我可以理解这是由于以下事实:我的积分<-函数(f,a,b)返回一个常数C,这是f在a和b之间积分的结果,但是我怎么能返回F为一个能够将其值