"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)) }