"svdfc" <-
function(data,U,nEG=ncol(U),design=NULL,contrasts=1)
{
    if(nrow(data) != nrow(U)) stop("Dimensions of data and U aren't compatible!")
    N <- nrow(data)

  # Impute missing data if necessary
    if(any(is.na(data))) {
	require(EMV,quietly=TRUE)
        is.row.na <- apply(data,1,function(x) all(is.na(x)))
        data[is.row.na,] <- matrix(colMeans(data,na.rm=TRUE),nrow=sum(is.row.na),ncol=ncol(data),byrow=TRUE)
        data[!is.row.na,] <- knn(data[!is.row.na,],k=10)[[1]]
    }

  # Project data into eigenspace
    A <- t(U[,1:nEG]) %*% data

  # Calculate eigengene linear model
    EG.lm <- contrasts.fit(lmFit(A,design=design),contrasts=contrasts)

  # Calculate gene coefficients
    t <- U[,1:nEG] %*% EG.lm$coef

    return(as.numeric(t))
}