我使用https://openresearch-repository.anu.edu.au/bitstream/1885/65527/2/01_Pozzi_Exponential_smoothing_weighted_2012.pdf中的附录C作为指南,从指数平滑的回报中建立了一个相关矩阵。
它是101×101矩阵,但由于以下相互矛盾的结果,我不知道它是否是奇异的:
pracma::Rank说它的排名是101;matrixcalc::is.singular.matrix返回TRUE;base::determinant.matrix给出了一个非常接近于零的值.pracma::Rank(try.wgtd.cor)
#[1] 101
matrixcalc::is.singular.matrix(try.wgtd.cor)
#[1] TRUE
base::determinant.matrix(try.wgtd.cor, logarithm = FALSE)
#$modulus
#[1] 2.368591e-55
#attr(,"logarithm")
#[1] FALSE
#
#$sign
#[1] 1
#
#attr(,"class")
#[1] "det"有人知道为什么/怎么会这样吗?
发布于 2022-06-28 20:26:44
不不要依赖行列式。一个小行列式不一定意味着奇点。例如,下面的对角线矩阵一点也不奇异,但行列式很小。
## all diagonal elements are 0.1; dimension 101 x 101
D <- diag(0.1, nrow = 101, ncol = 101)
## the obvious way to compute det(D)
prod(diag(D))
#[1] 1e-101
## use base::determinant.matrix
determinant.matrix(D, logarithm = FALSE)$modulus
#[1] 1e-101行列式等于特征值的乘积。所以一般来说,如果一个矩阵的所有特征值都小于1,那么行列式一定会很小!
matrixcalc::is.singular.matrix是基于行列式的,所以不要相信它。此外,它的结果过于主观,因为您可以调整tol。

相反,pracma::Rank使用QR和SVD分解来确定秩。结果非常可靠。下面是Rank的源代码(带我的注释):
function (M)
{
if (length(M) == 0)
return(0)
if (!is.numeric(M))
stop("Argument 'M' must be a numeric matrix.")
if (is.vector(M))
M <- matrix(c(M), nrow = length(M), ncol = 1)
## detect rank by QR factorization
r1 <- qr(M)$rank
## detect rank by SVD factorization
sigma <- svd(M)$d
tol <- max(dim(M)) * max(sigma) * .Machine$double.eps
r2 <- sum(sigma > tol)
## check consistency
if (r1 != r2)
warning("Rank calculation may be problematic.")
return(r2)
}总之,你的101x101矩阵try.wgtd.cor实际上有满的排名!
https://stackoverflow.com/questions/72792491
复制相似问题