On Aug 16, 2011, at 10:15 AM, Frank Paetzold wrote:

i am trying to use matinv from the Design package

Which has been replaced by the rms package (about 2 years ago).

to compute the generalized inverse of the normal equations
of a 3x3 design via the sweep operator.

That is, for the linear model
y = ยต + x1 + x2 + x1*x2
where x1, x2 are 3-level factors and dummy coding is being used

the matrix to be inverted is

X'X =

9 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1
3 3 0 0 1 1 1 1 0 0 1 0 0 1 0 0
3 0 3 0 1 1 1 0 1 0 0 1 0 0 1 0
3 0 0 3 1 1 1 0 0 1 0 0 1 0 0 1
3 1 1 1 3 0 0 1 1 1 0 0 0 0 0 0
3 1 1 1 0 3 0 0 0 0 1 1 1 0 0 0
3 1 1 1 0 0 3 0 0 0 0 0 0 1 1 1
1 1 0 0 1 0 0 1 0 0 0 0 0 0 0 0
1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0
1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0
1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0
1 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0
1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0
1 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0
1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0
1 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1

It would have been courteous to supply paste()-able code. If you use this code and then paste in the above matrix, then others would not need to do it themselves:

XtX = matrix(scan(), byrow=TRUE, ncol=16)


this matrix has rank=9

The rankMatrix::Matrix function agrees. And in essence, so does the eigen function, since the last 7 eigenvalues are effectively zero:

> eigen(XtX)
$values
[1] 1.600000e+01 4.000000e+00 4.000000e+00 4.000000e+00 4.000000e+00 [6] 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 1.065814e-14 [11] 4.440892e-15 4.173627e-16 2.220446e-16 1.717376e-16 -1.193166e-16
[16] -9.593521e-16



however, matinv(X'X) falsely returns rank=4,

Well, the current version of matinv returns a different value (= 6) , although it is not 9.

no matter what the tolerance threshold eps is set to.

also the defining property of the
generalized inverse
            _
X'X %*% (X'X)  %*% X'X = X'X

See the FAQ regarding issues related to "==" and numerical accuracy.


is not satisfied.

if i use qr (from the base package) the rank is
correctly determined as 9.

Since matinv is not described as being designed to deal with rank- deficient matrices, why have you chosen it over a function designed for the sort of problem you are dealing with. You remember the old joke about the guy who goes to the doctor and complains: "Doc, it hurts a lot when I do ....".

I guess the more modern Zen-oriented question might be: "And how has that method been working out for you?"

??"generalized inverse"

I see two "generalized inverse" functions in the packages I have installed: ginv::MASS and pinv::pracma

require(MASS)
> all.equal(XtX %*% ginv(XtX) %*% XtX ,  XtX)
[1] TRUE


--
David Winsemius, MD
West Hartford, CT

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to