require(limma) makeGroupContrasts<-function(groups){ unique.groups<-unique(groups) results <- rep("", length(unique.groups)*(length(unique.groups)-1)/2) counter<-1 for (i in 1:(length(unique.groups)-1)) for (j in (i+1):length(unique.groups)){ results[counter]<-paste(unique.groups[i],"-", unique.groups[j], sep="") counter<-counter+1 } results } RunIndividualsAgainstRefForScore<-function(indiv.data, ref.data, ref.groups){ results <- matrix(NA, nrow=dim(indiv.data)[1], ncol=dim(indiv.data)[2]) rownames(results)<-rownames(indiv.data) colnames(results)<-colnames(indiv.data) for (i in 1:dim(indiv.data)[2]){ data<-cbind(indiv.data[,i], ref.data) indiv.name<-colnames(indiv.data)[i] groups<-c(indiv.name, ref.groups) colX <- RunOneGroupForScore(data, groups, indiv.name) results[,i]<-colX cat("sample", indiv.name, "done\n") } results } RunOneGroupForScore<-function(data,groups, groupX){ f<-factor(groups, levels=unique(groups)) design<-model.matrix(~0+f) colnames(design)<-unique(groups) mycontrasts<-makeContrasts(contrasts= makeGroupContrastsForOne(groupX,groups), levels=design) fit<-lmFit(data, design) fit2<-eBayes(contrasts.fit(fit, mycontrasts)) fit.test<-p.adjust(fit2$p.value, method="bonferroni") select <- fit.test > 0.05 fit.coef <- fit2$coef fit.coef[select] <- 0 apply(fit.coef, 1, sum) } makeGroupContrastsForOne<-function(groupX, groups){ unique.groups<-unique(groups) results <- rep("", length(unique.groups)-1) counter <- 1 for (groupY in unique.groups) if (groupX!=groupY){ results[counter]<-paste(groupX,"-", groupY, sep="") counter <- counter+1 } results }