R 计算关节后验分布的散度

R 计算关节后验分布的散度,r,distance,mcmc,R,Distance,Mcmc,我想计算两个三维后验分布之间的距离。图形存储在两个30000x3矩阵中 到目前为止,我已经成功地通过将网格拆分为多个单元来计算两个二维后验概率(两个30000x2矩阵)之间的总变化距离。但是,我在计算具有更多参数的后验概率之间的散度时遇到困难。可以找到一些相关距离度量的示例 注:我不希望计算边缘之间的距离(按列输入),而是在比较R中的联合分布后获得总体值 如果有人能指出我在这里遗漏了什么,我将不胜感激 编辑1:下面添加了一些用于计算存储在两个矩阵中的后验样本之间的总变化距离的示例代码: 编辑2:

我想计算两个三维后验分布之间的距离。图形存储在两个30000x3矩阵中

到目前为止,我已经成功地通过将网格拆分为多个单元来计算两个二维后验概率(两个30000x2矩阵)之间的总变化距离。但是,我在计算具有更多参数的后验概率之间的散度时遇到困难。可以找到一些相关距离度量的示例

注:我不希望计算边缘之间的距离(按列输入),而是在比较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)
set.seed(123)
比较2.2D