R coda“秩序3的主要未成年人不是肯定的”

时间:2013-08-06 18:07:07

标签: r

有人可以向我解释这个错误信息的含义吗?

我有一个名为hitandrun的MCMC抽样方法(在未完成的包https://github.com/davidkane9/kmatching中),它给出了一个矩阵列表,其中列作为单个样本的多变量输出,以下是它的一个实例:

> A = matrix(1, ncol = 3)
> b = 1
> ## gives me solutions of Ax = b (a.k.a x + y + z = 1)
> h = hitandrun(A,b, n=10, chains = 2)
> h
[[1]]
          [,1]      [,2]      [,3]      [,4]      [,5]       [,6]      [,7]      [,8]      [,9]
[1,] 0.1804431 0.3340590 0.4195820 0.2061222 0.3591085 0.09984353 0.6707110 0.3926639 0.1283919
[2,] 0.6135745 0.4256909 0.3619727 0.2918238 0.5057426 0.81919629 0.2368842 0.1178713 0.2666737
[3,] 0.2059824 0.2402501 0.2184453 0.5020541 0.1351489 0.08096018 0.0924048 0.4894647 0.6049344
         [,10]
[1,] 0.1322112
[2,] 0.4736057
[3,] 0.3941831

[[2]]
           [,1]      [,2]      [,3]      [,4]       [,5]       [,6]      [,7]       [,8]      [,9]
[1,] 0.32883534 0.1284182 0.1735151 0.2005726 0.94511422 0.61653717 0.5130324 0.33228224 0.2088865
[2,] 0.65868549 0.3066952 0.5182009 0.3065610 0.01214334 0.07007548 0.1191157 0.01137002 0.3311197
[3,] 0.01247917 0.5648866 0.3082840 0.4928664 0.04274244 0.31338735 0.3678519 0.65634774 0.4599938
          [,10]
[1,] 0.61412223
[2,] 0.32289039
[3,] 0.06298738

我想看看Gelman-Rubin对这些数据的诊断,看看我需要多少细化它,但是当我把它放到功能中时,我得到了一个模糊的错误,我不知道这意味着什么。这是:

> mclist = lapply(h, function(x) mcmc(t(x), thin = 5))
> gelman.diag(mclist)
Error in chol.default(W) : 
  the leading minor of order 1 is not positive definite

(我猜现在它的顺序是1,但在订单3之前)是否有任何关于SO的coda专家?我试图调试它,但它导致我内部函数La_chol,我不知道该怎么做。

2 个答案:

答案 0 :(得分:3)

获得Gelman-Rubin诊断的多变量估计似乎有问题。设置multivariate = FALSE可以解决问题,并为每个变量输出单个变量估计值。然而,由于我试图解决的问题的性质,我的大多数变量是相关的,所以我想(并希望)这让我高估了诊断。

答案 1 :(得分:0)

我最近对我的模型有这个问题 - 我发现我的矩阵不对称,因为它是一个不对称的GRM矩阵。我使用此函数使其对称并且问题已解决(取自Most Efficient way to create a symmetric matrix):

symmetrise <- function(mat){   rowscols <- which(lower.tri(mat), arr.ind=TRUE)   sparseMatrix(i=rowscols[,1], 
               j=rowscols[,2], 
               x=mat[lower.tri(mat)], 
               symmetric=TRUE, 
               dims=c(nrow(mat),ncol(mat)) )   }

这将左下部分复制到右上部分。