R 从solve()和ginv()函数中获取错误的逆矩阵

R 从solve()和ginv()函数中获取错误的逆矩阵,r,matrix-inverse,R,Matrix Inverse,我尝试计算R中协方差矩阵的逆。我使用solve和ginv函数,但是我无法正确地找到单位矩阵。我想知道为什么会这样。以前有人遇到过这个问题吗?如何修复它 d <- data.frame(r1,r2,r3,r4) ad <- cov(d) # get covariance 高度共线变量对回归方法核心矩阵计算中的数值稳定性构成威胁。评估多重共线性程度的一种方法是计算方差膨胀系数(VIF)。此代码从Harrell的rms软件包中的vif函数中提取: library(rms) dput(ad

我尝试计算R中协方差矩阵的逆。我使用
solve
ginv
函数,但是我无法正确地找到单位矩阵。我想知道为什么会这样。以前有人遇到过这个问题吗?如何修复它

d <- data.frame(r1,r2,r3,r4)
ad <- cov(d) # get covariance

高度共线变量对回归方法核心矩阵计算中的数值稳定性构成威胁。评估多重共线性程度的一种方法是计算方差膨胀系数(VIF)。此代码从Harrell的
rms
软件包中的
vif
函数中提取:

library(rms)
dput(ad)
structure(c(0.0046716674, 0.0017256716, -0.0001918083, 0.0027385111, 
0.001725672, 0.00073037, -8.1816e-05, 0.001159042, -0.0001918083, 
-8.1816e-05, 9.169343e-06, -0.0001298359, 0.0027385111, 0.0011590423, 
-0.0001298359, 0.0018393131), .Dim = c(4L, 4L), .Dimnames = list(
    c("r1", "r2", "r3", "r4"), c("r1", "r2", "r3", "r4")))

 nam <- dimnames(ad)[[1]]
 d <- diag(ad)^0.5
    vif.vals <- diag(solve(ad/(d %o% d)))
    names(vif.vals) <- nam
    vif.vals
#---
          r1           r2           r3           r4 
6.535378e+01 3.338701e+06 1.768640e+04 3.389362e+06 
库(rms)
dput(ad)
结构(c)(0.0046716674,0.0017256716,0.0001918083,0.0027385111,,
0.001725672,0.00073037,-8.1816e-05,0.001159042,-0.0001918083,
-8.1816e-05、9.169343e-06、-0.0001298359、0.0027385111、0.0011590423、,
-0.0001298359,0.0018393131),.Dim=c(4L,4L),.Dimnames=list(
c(“r1”、“r2”、“r3”、“r4”)、c(“r1”、“r2”、“r3”、“r4”))

nam@zheyunali,>>dput(ad)结构(c(0.000564103047135273、0.000209426917735389、-2.50601812852379e-07、0.000318692159506722、0.000209426917735389、8.92756413718721e-05、-9.42226640483041e-08、0.000135853820739977、-2.50601812852379e-07、-9.42226640483041e-08、1.12190005355138888E-10、-1.433818756865E-07、0.00073285283807、6733441799332),.Dim=c(4L,4L),.Dimnames=list(c(“r1”、“r2”、“r3”、“r4”)、c(“r1”、“r2”、“r3”、“r4”))运行
eigen(as.matrix(ad))
并查看特征值。您的系统条件不好(1.49e+15)。@MatthewLundberg
>eigen(as.matrix(ad))
$values
[1]8.342751e-04 2.583717e-05 7.387089e-13 1.765580e-20
$vectors
[1][,2][,3][,4]
[1,]-0.8159716923 0.5780917163-4.060705e-04 0.000000e+000.0003639893-0.0001886646-9.9999999E-01-7.738135e-13-0.4831139922-0.6819114508-4.719581e-05 5.491791e-01
“单项优异数字”测试可以通过R基中的条件数和kappa获得,因此您可以在不使用Hmisc的情况下进行测试。请参见示例。确实很有用。尽管我实际上除了作为代码参考之外没有使用
Hmisc::vif
。噢,确实如此。感谢您的澄清。
library(rms)
dput(ad)
structure(c(0.0046716674, 0.0017256716, -0.0001918083, 0.0027385111, 
0.001725672, 0.00073037, -8.1816e-05, 0.001159042, -0.0001918083, 
-8.1816e-05, 9.169343e-06, -0.0001298359, 0.0027385111, 0.0011590423, 
-0.0001298359, 0.0018393131), .Dim = c(4L, 4L), .Dimnames = list(
    c("r1", "r2", "r3", "r4"), c("r1", "r2", "r3", "r4")))

 nam <- dimnames(ad)[[1]]
 d <- diag(ad)^0.5
    vif.vals <- diag(solve(ad/(d %o% d)))
    names(vif.vals) <- nam
    vif.vals
#---
          r1           r2           r3           r4 
6.535378e+01 3.338701e+06 1.768640e+04 3.389362e+06