# [R] orthonormalization with weights

Douglas Bates bates at stat.wisc.edu
Tue Feb 24 15:42:32 CET 2004

```"Gabor Grothendieck" <ggrothendieck at myway.com> writes:

> Obviously the R code does not match the
> description I gave since we should be taking
> the QR decomp of sqrt(D)X, not X.  Z should be:
>
>  diag(1/sqrt(diag(D))) %*% qr.Q(qr(sqrt(D)%*%X))

Because R stores matrices in column-major order and repeats shorter
vectors in arithmetic operations, you can avoid the matrix
multiplications.

What you have written is equivalent to

sqrtD = sqrt(diag(D))
qr.Q(qr(sqrtD*X))/sqrtD

Also, you don't really need to store a diagonal matrix as a matrix.

>
> ---
> Date:   Mon, 23 Feb 2004 21:38:15 -0500 (EST)
> From:   Gabor Grothendieck <ggrothendieck at myway.com>
> To:   <stephane.dray at umontreal.ca>, <r-help at stat.math.ethz.ch>
> Subject:   RE: [R] orthonormalization with weights
>
>  diag(1/sqrt(diag(D))) %*% qr.Q(qr(X))
>
>
>
> Let QR be such that sqrt(D)X = QR. Then letting
> solve(...) denote the inverse of ... we have
> X = solve(sqrt(D))QR which is of the form ZR
> and Z has the desired weighted orthoginality
> property.
>
> Since D is diagonal, solve(sqrt(D)) equals
> diag(1/sqrt(diag(D))) so we get this for Z:
>
> diag(1/sqrt(diag(D))) %*% qr.Q(qr(X))
>
> ---
> Date: Mon, 23 Feb 2004 18:46:34 -0500
> From: Stephane DRAY <stephane.dray at umontreal.ca>
> To: <r-help at stat.math.ethz.ch>
> Subject: [R] orthonormalization with weights
>
>
> Hello List,
> I would like to orthonormalize vectors contained in a matrix X taking into
> account row weights (matrix diagonal D). ie, I want to obtain Z=XA with
> t(Z)%*%D%*%Z=diag(1)
>
> I can do the Gram-Schmidt orthogonalization with subsequent weighted
> regressions. I know that in the case of uniform weights, qr can do the
> trick. I wonder if there is a way to do it in the case of non uniform
> weights by qr or svd ?
>
> Stéphane DRAY
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-help