library(splines)
library(survival)
library(multtest)

#----input data---#
data(golub)

colnames(golub)=seq(1:38)
rownames(golub)=seq(1:3051)

y.train=c(rep(1,27), rep(2,11)) # 27 ALL and 11 AML
names(y.train)=seq(1:38)


#----pre-select genes---#
fstats=mt.teststat(X=golub, classlabel=as.factor(y.train), test="f")
names(fstats)=rownames(golub)
tops=names(sort(fstats, decreasing=T)[1:50])

traindata=list(x=golub[tops,],y=factor(y.train))


#----a 10-fold cross-validation on the training data---#

source("elda_cv.r")
source("onestep.r")
source("elda_predict.r")
source("spectralDecomp.r")
source("pamr") #source the PAM code to get balanced.folds function

fit=elda.cv(data=traindata, nfold=10, n.threshold=5, cost=NULL) 

#Alternatively, use the balanced.folds function built in PAM for spliting samples to ensure a balanced partition# 

folds=balanced.folds(y,nfold=10)
fit=elda.cv(data=traindata, nfold=10, folds=folds, n.threshold=5, cost=NULL)

#----Prediction----#

out=list(Dset=fit$Dset[[1]], prior=fit$prior,centroids=fit$centroids, centroid.overall=fit$centroid.overall, sd=fit$sd, delta.ori=fit$delta.ori,se.scale=fit$scale,
threshold.scale=fit$threshold.scale, threshold=fit$threshold)

pred=elda.predict(fit=out,newx=testdata, cost=NULL)