计算关节后验分布之间的差异

时间:2015-07-22 23:39:31

标签: r distance mcmc

我希望计算两个三维后验分布之间的距离。绘制存储在两个30,000x3矩阵中。

到目前为止,我已经成功地计算了两个二维后验(两个30,000x2矩阵)之间的总变差距离,将网格划分为二进制数。但是,我在计算具有更多参数的后代之间的差异时遇到了麻烦。可以找到相关距离测量的一些示例here

注意:我不希望计算边缘之间的距离(逐列条目),而不是在比较R中的关节分布后获得整体值。

如果有人能指出我在这里缺少的东西,我真的很感激。

编辑1:下面添加了一些用于计算存储在两个矩阵中的后验样本之间的总变差距离的示例代码:

编辑2:这是一个R问题。

set.seed(123)
comparison.2D   <- matrix(rnorm(40000*2,0,1),ncol=2)
ground.truth.2D <- matrix(rnorm(40000*2,0,2),ncol=2)

# Function to calculate TVD between matrices with 2 columns:
Total.Variation.Distance.2D<-function(true,      
                                      comparison,
                                      burnin,
                                      window.size){
  # Bandwidth for theta.1.
  my_bw_x<-window.size

  # Bandwidth for theta.2.
  my_bw_y<-window.size

  range_x<-range(c(true[-c(1:burnin),1],comparison[-c(1:burnin),1]))
  range_y<-range(c(true[-c(1:burnin),2],comparison[-c(1:burnin),2]))

  xx <- seq(range_x[1],range_x[2],by=my_bw_x)
  yy <- seq(range_y[1],range_y[2],by=my_bw_y)

  true.pointidxs <- matrix( c( findInterval(true[-c(1:burnin),1], xx), 
                               findInterval(true[-c(1:burnin),2], yy) ), ncol=2)

  comparison.pointidxs <- matrix( c( findInterval(comparison[-c(1:burnin),1], xx), 
                                     findInterval(comparison[-c(1:burnin),2], yy) ), ncol=2)

  # Count the frequencies in the corresponding cells:
  square.mat.dims  <- max(length(xx),nrow=length(yy))
  frequencies.true <- frequencies.comparison <- matrix(0, ncol=square.mat.dims, nrow=square.mat.dims)

  for (i in 1:dim(true.pointidxs)[1]){

    frequencies.true[true.pointidxs[i,1], true.pointidxs[i,2]] <- frequencies.true[true.pointidxs[i,1], 
                                                                                   true.pointidxs[i,2]] + 1
    frequencies.comparison[comparison.pointidxs[i,1], comparison.pointidxs[i,2]] <- frequencies.comparison[comparison.pointidxs[i,1], 
                                                                                                       comparison.pointidxs[i,2]] + 1

  }# End for

  # Normalize frequencies matrix:
  frequencies.true       <- frequencies.true/dim(true.pointidxs)[1]
  frequencies.comparison <- frequencies.comparison/dim(comparison.pointidxs)[1]

  TVD <-0.5*sum(abs(frequencies.comparison-frequencies.true))
  return(TVD)
 }# End function

TVD.2D <- Total.Variation.Distance.2D(true=ground.truth.2D, comparison=comparison.2D,burnin=10000,window.size=0.05)

0 个答案:

没有答案