首页 > 解决方案 > 在 R 中使用 p-1 < df < p 从 Wishart 分布中采样

问题描述

我需要从自由度小于尺度矩阵维数的 Wishart 分布中采样一个矩阵。我正在努力寻找一个允许它的 R 函数。

对于 Wishart 分布,自由度(称它们为 df 或 v)必须大于尺度矩阵的维数(例如 p)减 1(即df > p - 1)(参见https://en.wikipedia. org/wiki/Wishart_distribution或任何有关 Wishart 分发的手册)。但是,当我尝试从p-1 < df < p的 Wishart 分布中进行采样时,例如 W(df = 1.1, I_p),其中 I_p 是 pxp 单位矩阵,我收到错误,说明自由度不一致

假设 p = 2,我想从 df 在 1 到 2 之间(排除)的不同 Wishart 分布中进行采样,但是

stats::rWishart(n = 1, df = 1.1, Sigma = diag(2)) # does not work
MCMCpack::rwish(v = 1.1, S = diag(2)) # does not work

不工作。

我认为问题可能是非整数自由度,但是

stats::rWishart(n = 1, df = 2.1, Sigma = diag(2))
MCMCpack::rwish(v = 2.1, S = diag(2))

工作没有任何问题。

我确实找到了

  rWishart::rWishart(1, df = 1.1, Sigma = diag(2)) # works

哪个有效,但是如果 1.5 =< df < 2 则无效

  rWishart::rWishart(1, df = 1.5, Sigma = diag(2)) # does not works

我想在 R 中找到方法从自由度大于 p-1 但小于 p (p-1 < df < p) 的 Wishart 分布中进行采样。采样矩阵是否为奇异矩阵对我来说并不重要。

标签: rmatrixdistributionsampling

解决方案


据我所知,matrixsampling是唯一提供这种可能性的包(我是它的作者)。

library(matrixsampling)
rwishart(3, nu = 1.1, Sigma = diag(2))
# , , 1
# 
#            [,1]      [,2]
# [1,]  0.7679333 -1.051319
# [2,] -1.0513191  1.439281
# 
# , , 2
# 
#            [,1]       [,2]
# [1,]  1.8536154 -0.9059983
# [2,] -0.9059983  0.4449708
# 
# , , 3
# 
#           [,1]      [,2]
# [1,] 0.9309460 0.6026472
# [2,] 0.6026472 0.3901232

如果你真的想用单位矩阵作为尺度矩阵进行采样Sigma,你可以这样做:

matrixsampling:::rwishart_I(3, nu = 1.1, p = 2)

(老实说,我不记得我做了什么,但这应该更有效率)。


推荐阅读