I try to calculate the inverse of a covariance matrix in R. I use both solve
and ginv
functions however I can not find the identity matrix properly. I am wondering why is happening. Had anyone met this problem before? How to fix it?
d <- data.frame(r1,r2,r3,r4)
ad <- cov(d) # get covariance
You can access ad
by:
ad <- structure(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.12190005351388e-10,
-1.43381875666865e-07, 0.000318692159506722, 0.000135853820739977,
-1.43381875666865e-07, 0.000206733441799332),
.Dim = c(4L, 4L),
.Dimnames = list(c("r1", "r2", "r3", "r4"),
c("r1", "r2", "r3", "r4")))
# r1 r2 r3 r4
#r1 5.641030e-04 2.094269e-04 -2.506018e-07 3.186922e-04
#r2 2.094269e-04 8.927564e-05 -9.422266e-08 1.358538e-04
#r3 -2.506018e-07 -9.422266e-08 1.121900e-10 -1.433819e-07
#r4 3.186922e-04 1.358538e-04 -1.433819e-07 2.067334e-04
a <- ginv(ad,tol = 1e-18) `# calculate the inverse of the matrix by ginv`
# [,1] [,2] [,3] [,4]
#[1,] 2.369507e+05 7332.961 5.497029e+08 11158.82
#[2,] 7.332964e+03 9194.958 4.198473e+07 13992.28
#[3,] 5.497029e+08 41984725.523 1.353713e+12 63889594.47
#[4,] 1.115881e+04 13992.283 6.388959e+07 21292.54
b <- solve(ad,tol = 1e-18) # calculate the inverse of the matrix by solve
# r1 r2 r3 r4
#r1 236950.7 1.701817e+06 549702919 -1.099090e+06
#r2 1184944.4 -2.245684e+20 2905309940 1.475740e+20
#r3 549702919.1 4.213828e+09 1353713017167 -2.677616e+09
#r4 -762702.5 1.475740e+20 -1817729881 -9.697747e+19
ad%*%a
# r1 r2 r3 r4
#r1 1.000000e+00 3.552714e-15 4.729372e-11 -8.881784e-16
#r2 9.547918e-15 3.015976e-01 5.820766e-11 4.589515e-01
#r3 -2.385245e-18 3.234236e-12 1.000000e+00 -2.125362e-12
#r4 -8.881784e-15 4.589515e-01 6.002665e-11 6.984024e-01
ad%*%b
# r1 r2 r3 r4
#r1 1.000000e+00 0 0.000000e+00 0.000000000
#r2 1.421085e-14 0 2.910383e-11 0.000000000
#r3 0.000000e+00 0 1.000000e+00 -0.001953125
#r4 2.842171e-14 -4 0.000000e+00 4.000000000