[R] Multivariate regression method

(Ted Harding) Ted.Harding at nessie.mcc.ac.uk
Tue Jul 15 14:23:25 CEST 2003


Hi Folks,
Thanks to several people's suggestions and clarifications,
I think I have implemented a function which computes the
conditional mean and covariance matrix of a subset of the
dimensions of an MV-normal variable, given the values on the
other dimensions (these conditioning value can be presented
as a matrix, to deal with several cases at once).

The code is below, for anyone who would like to use it.
Comments will be welcome.

Two auxiliary functions ".+". and ixX are defined as well as the main
function MV.regn

Example:
  U1<-rnorm(10);U2<-rnorm(10);U3<-rnorm(10);
  X<-cbind(U2+U3.U1+U3,U1+U2); mu<-matrix(c(0,0,0),nrow=1);
  S<-matrix(c(2,1,1, 1,2,1, 1,1,2),nrow=3);
#Ex 1
  MV.regn(S,mu,X[,1,drop=FALSE],1)
#Ex 2
  MV.regn(S,mu,X[c(1,3,5,7),1:2],1,2)

==================================================================

"%.+%"<-function(X,x){sweep(X,2,x,"+")} ## Adds x to rows of X
ixX<-function(X,...){(1:ncol(X))%in%c( ... )}
MV.regn<-function(S,mu,x1,...){
### NB NB The k-variate MV variables etc are ROW vectors throughout
###       (as in nxk matrix of data on n cases with k variables observed).
### NB NB S,mu,x1 MUST be arrays (matrices): create with "drop=FALSE" 
###       or specify when entering arguments, e.g.
###       MV.regn(S,mu,X[,1,drop=FALSE],1)
### Arguments: S  is the covariance matrix of MV X
###            mu is the ROW (1xk matrix) expectation(X)
###            x1 is matrix: rows are conditioning values for selected
###               columns of X (NB if a single column make sure it's
###               a matrix).
###            ... is an indexing vector or comma-list of numbers
###               selecting the conditioning columns of X for the
###               conditioning variable X1 (implies complementary set of
###               columns of X for the variable X2 whose conditional
###               distribution (X2 | X1=x1) is to be found).
  iX1<-ixX(S, ... ); iX2<-!iX1;
  s11<-solve(S[iX1,iX1,drop=FALSE]); s12<-S[iX1,iX2,drop=FALSE];
  s21<-S[iX2,iX1,drop=FALSE]; s22<-S[iX2,iX2,drop=FALSE];
  mu1<-mu[,iX1,drop=FALSE]; mu2<-mu[,iX2,drop=FALSE];

  Cmu  <- (x1%.+%(-mu1))%*%s11%*%s12 %.+% mu2;
  Cvar <- s22 - s21%*%s11%*%s12;
  list(Cmu=Cmu,Cvar=Cvar,iX1=iX1,iX2=iX2)
}

=================================================================

Best wishes to all,
Ted.


--------------------------------------------------------------------
E-Mail: (Ted Harding) <Ted.Harding at nessie.mcc.ac.uk>
Fax-to-email: +44 (0)870 167 1972
Date: 15-Jul-03                                       Time: 13:23:25
------------------------------ XFMail ------------------------------




More information about the R-help mailing list