R函数中的错误为正定`

R函数中的错误为正定`,r,matrix,symmetric,R,Matrix,Symmetric,我想测试一个矩阵在R中是否是正定的。我使用了R函数is.positive.definite,但一直得到以下错误消息,尽管我的矩阵是对称的,正如函数isSymmetric所示。请问这是因为舍入错误吗 Error in is.positive.definite(S) : argument x is not a symmetric matrix 我的工作代码附在下面。有人能帮我吗?谢谢 library(Matrix) # isSymmetric library(matrixcalc) # is.po

我想测试一个矩阵在R中是否是正定的。我使用了R函数
is.positive.definite
,但一直得到以下错误消息,尽管我的矩阵是对称的,正如函数
isSymmetric
所示。请问这是因为舍入错误吗

Error in is.positive.definite(S) : argument x is not a symmetric matrix
我的工作代码附在下面。有人能帮我吗?谢谢

library(Matrix) # isSymmetric
library(matrixcalc) # is.positive.definite
library(expm) # sqrtm

###################################################################################################

theta0 <- c(0.2, 10)

###################################################################################################

OS.mean <- function(shape, rank, n=10){
  term1 <- factorial(n)/(factorial(rank-1)*factorial(n-rank))
  term2 <- beta(n-rank+1, rank) - beta(n-rank+shape+1, rank)
  term1*term2/shape
}

OS.mean.theta0.10 <- as.matrix(OS.mean(theta0[1], rank=seq(1, 10, by=1)))

###################################################################################################

OSsq.mean <- function(shape, rank, n=10){
  term1 <- factorial(n)/(factorial(rank-1)*factorial(n-rank))
  term2 <- beta(n-rank+1, rank) - 2*beta(n-rank+shape+1, rank) + beta(n-rank+2*shape+1, rank)
  term1*term2/(shape*shape)
}

OSsq.mean.theta0.10 <- as.matrix(OSsq.mean(theta0[1], rank=seq(1, 10, by=1)))

###################################################################################################

OSprod.mean <- function(shape, rank1, rank2, n=10){
  term1 <- factorial(n)/(factorial(rank1-1)*factorial(rank2-rank1-1)*factorial(n-rank2))
  term2 <- beta(n-rank1+1, rank1) - beta(n-rank1+shape+1, rank1)
  term3 <- beta(n-rank2+1, rank2-rank1)
  term4 <- beta(n-rank1+shape+1, rank1) - beta(n-rank1+2*shape+1, rank1)
  term5 <- beta(n-rank2+shape+1, rank2-rank1)
  term1*(term2*term3-term4*term5)/(shape*shape)
}

OS.cov <- function(shape, rank1, rank2){
  OSprod.mean(shape, rank1, rank2) - OS.mean(shape, rank1)*OS.mean(shape, rank2)  
}

###################################################################################################

spacing <- seq(1, 10, by=1)

OS.varcov.10 <- function(shape, n=10){
  V.diag <- diag(c(OSsq.mean.theta0.10 - OS.mean.theta0.10^2))

  V.upper <- matrix(0, nrow=10, ncol=10)
  for(i in 1:9){
    for(j in (i+1):10){
      V.upper[i, j] <- OS.cov(shape, spacing[i], spacing[j])
    }
  }

  V.upper + V.diag + t(V.upper)
}

###################################################################################################

V.theta0.10 <- OS.varcov.10(theta0[1])

kappa(V.theta0.10)

isSymmetric(V.theta0.10)
is.positive.definite(V.theta0.10)

S <- sqrtm(V.theta0.10)
isSymmetric(S)
is.positive.definite(S)
库(矩阵)#是对称的
库(matrixcalc)#是正定的
图书馆(expm)#sqrtm
###################################################################################################

由于,TA0您的
S
矩阵不是对称的,但默认的输出小数位数将其隐藏。你自己看看:

> options(digits=20)
> S[1,2]
[1] 0.033457660484940172
> S[2,1]
[1] 0.033457660484940213
问题是,
是.对称的。
matrixcalc
包中的矩阵
没有考虑小的差异(即,它只是用严格的
=
而不是
all.equal
方法来比较矩阵元素),而
是对称的
矩阵
包中的矩阵。如果你绕过矩阵,一切都会好起来:

> S=round(S,10)
> is.symmetric.matrix(S)
[1] TRUE
> is.positive.definite(S)
[1] TRUE

这与?
is.positive.definite
函数使用
is.symmetric.matrix
函数,而不是
isSymmetric
函数来测试矩阵是否为数字对称方阵。众所周知,正定矩阵具有唯一的正定平方根。这是通过
sqrtm
函数计算的。也就是说,
S
在理论上应该是正定的。然而,它不在这里。请问是因为舍入误差吗?是的,是因为<代码>是.symmetric。来自
matrixcalc
软件包的矩阵
不能解释小的差异,而来自
矩阵
软件包的
是对称的。你所需要做的就是对矩阵进行四舍五入。请问任意精度类型的程序能解决这个四舍五入问题吗?为什么不添加
S=round(S,10)