【问题标题】:Calculate probability of point on 2d density surface计算二维密度表面上点的概率
【发布时间】:2015-09-25 04:25:52
【问题描述】:

如果我像这个例子一样计算两个向量的二维密度表面:

library(MASS)
a <- rnorm(1000)
b <- rnorm(1000, sd=2)
f1 <- kde2d(a, b, n = 100)

我得到以下表面

filled.contour(f1)

z 值是估计的密度。

我现在的问题是:是否可以计算单个点的概率,例如a = 1, b = -4

[因为我不是统计学家,这可能是错误的措辞。对此感到抱歉。我想知道——如果这可能的话——一个点出现的概率。]

感谢您的每一条评论!

【问题讨论】:

  • 获得单点的概率为零。如果您指定一个点可能位于的区间 [dx, dy],则您有一个有限且定义明确的概率。
  • 关键点:密度曲线上的值不是概率。密度曲线下的面积是概率。由于一个点没有宽度,所以在一个点的曲线下没有面积。
  • 你能把某事标记为正确吗?

标签: r distribution probability modeling


【解决方案1】:

如果您指定一个区域,则该区域具有与您的密度函数相关的概率。当然,单个点的概率不为零。但在这一点上它确实具有非零密度。那是什么?

密度是在正常面积测度变为零时,该面积上积分的概率密度除以正常面积测度的积分极限。 (实际上很难正确地说明这一点,需要尝试几次,但仍然不是最佳的)。

所有这些都是基本的微积分。编写一个程序来计算该区域的密度积分也相当容易,尽管我认为 MASS 有标准的方法来使用更复杂的积分技术。这是我根据您的示例汇总的一个快速例程:

library(MASS)
n <- 100
a <- rnorm(1000)
b <- rnorm(1000, sd=2)
f1 <- kde2d(a, b, n = 100)
lims <- c(min(a),max(a),min(b),max(b))

filled.contour(f1)

prob <- function(f,xmin,xmax,ymin,ymax,n,lims){
  ixmin <- max( 1, n*(xmin-lims[1])/(lims[2]-lims[1]) )
  ixmax <- min( n, n*(xmax-lims[1])/(lims[2]-lims[1]) )
  iymin <- max( 1, n*(ymin-lims[3])/(lims[4]-lims[3]) ) 
  iymax <- min( n, n*(ymax-lims[3])/(lims[4]-lims[3]) )
  avg <- mean(f$z[ixmin:ixmax,iymin:iymax])
  probval <- (xmax-xmin)*(ymax-ymin)*avg
  return(probval)
}
prob(f1,0.5,1.5,-4.5,-3.5,n,lims)
# [1] 0.004788993
prob(f1,-1,1,-1,1,n,lims)
# [1] 0.2224353
prob(f1,-2,2,-2,2,n,lims)
# [1] 0.5916984
prob(f1,0,1,-1,1,n,lims)
# [1] 0.119455
prob(f1,1,2,-1,1,n,lims)
# [1] 0.05093696
prob(f1,-3,3,-3,3,n,lims)
# [1] 0.8080565
lims
# [1] -3.081773  4.767588 -5.496468  7.040882

警告,例程似乎是正确的,并且给出了合理的答案,但它没有经过任何接近我会为生产函数提供的审查。

【讨论】:

    【解决方案2】:

    这里的 z 值称为“概率密度”而不是“概率”。正如 cmets 指出的那样,如果您想要估计概率,则需要对估计的密度进行积分以找到估计表面下的体积。

    但是,如果您想要的是特定点的概率密度,那么您可以使用:

    kde2d(a, b, n=1, lims=c(1, 1, -4, -4))$z[1,1]
    # [1] 0.006056323
    

    这将计算一个 1x1“网格”,并为您想要的点提供一个密度估计。


    确认它有效的情节:

    z0 <- kde2d(a, b, n=1, lims=c(1, 1, -4, -4))$z[1,1]
    
    filled.contour(
        f1,
        plot.axes = {
            contour(f1, levels=z0, add=TRUE)
            abline(v=1, lty=3)
            abline(h=-4, lty=3)
            axis(1); axis(2)
        }
    )
    

    【讨论】:

      猜你喜欢
      • 2013-11-13
      • 2017-09-20
      • 2020-04-22
      • 2020-12-06
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 2013-09-06
      相关资源
      最近更新 更多