annotate lasso.R @ 56:374c9a2bc1c2 draft

Uploaded
author nicolas
date Wed, 26 Oct 2016 18:08:42 -0400
parents 2e66da6efc41
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
1 ########################################################
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
2 #
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
3 # creation date : 08/01/16
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
4 # last modification : 01/09/16
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
5 # author : Dr Nicolas Beaume
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
6 # owner : IRRI
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
7 #
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
8 ########################################################
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
9
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
10 suppressWarnings(suppressMessages(library(glmnet)))
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
11 library(methods)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
12 ############################ helper functions #######################
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
13
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
14
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
15 # optimize alpha parameter
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
16 optimize <- function(genotype, phenotype, alpha=seq(0,1,0.1), repet=7) {
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
17 acc <- NULL
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
18 indexAlpha <- 1
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
19 for(a in alpha) {
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
20 curAcc <- NULL
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
21 # repeat nfolds time each analysis
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
22 for(i in 1:repet) {
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
23 # draw at random 1/3 of the training set for testing and thus choose alpha
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
24 # note it is not a cross-validation
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
25 n <- ceiling(nrow(genotype)/3)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
26 indexTest <- sample(1:nrow(genotype), size=n)
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
27 # create training set and test set
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
28 train <- genotype[-indexTest,]
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
29 test <- genotype[indexTest,]
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
30 phenoTrain <- phenotype[-indexTest]
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
31 phenoTest <- phenotype[indexTest]
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
32 # cv.glmnet allow to compute lambda at the current alpha
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
33 cv <- cv.glmnet(x=as.matrix(train), y=phenoTrain, alpha=a)
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
34 # create model
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
35 model <- glmnet(x=as.matrix(train), y=phenoTrain, alpha=a, lambda = cv$lambda.1se)
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
36 # predict test set
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
37 pred <- predict(model, test, type = "response")
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
38 # compute r2 for choosing the best alpha
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
39 curAcc <- c(curAcc, r2(phenoTest, pred))
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
40 }
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
41 # add mean r2 for this value of lambda to the accuracy vector
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
42 acc <- c(acc, mean(curAcc))
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
43 }
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
44 # choose best alpha
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
45 names(acc) <- alpha
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
46 return(as.numeric(names(acc)[which.max(acc)]))
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
47 }
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
48
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
49 # compute r2 by computing the classic formula
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
50 # compare the sum of square difference from target to prediciton
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
51 # to the sum of square difference from target to the mean of the target
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
52 r2 <- function(target, prediction) {
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
53 sst <- sum((target-mean(target))^2)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
54 ssr <- sum((target-prediction)^2)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
55 return(1-ssr/sst)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
56 }
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
57 ################################## main function ###########################
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
58
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
59 lasso <- function(genotype, phenotype, evaluation = T, outFile, folds, alpha=NULL) {
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
60 # go for optimization
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
61 if(is.null(alpha)) {
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
62 alpha <- seq(0,1,0.1)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
63 alpha <- optimize(genotype=genotype, phenotype=phenotype, alpha = alpha)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
64 }
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
65 # evaluation
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
66 if(evaluation) {
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
67 prediction <- NULL
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
68 # do cross-validation
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
69 for(i in 1:length(folds)) {
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
70 # create training and test set
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
71 train <- genotype[-folds[[i]],]
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
72 test <- genotype[folds[[i]],]
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
73 phenoTrain <- phenotype[-folds[[i]]]
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
74 phenoTest <- phenotype[folds[[i]]]
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
75 # cv.glmnet helps to compute the right lambda for a chosen alpha
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
76 cv <- cv.glmnet(x=as.matrix(train), y=phenoTrain, alpha=alpha)
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
77 # create model
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
78 lasso.fit <- glmnet(x=as.matrix(train), y=phenoTrain, alpha=alpha, lambda = cv$lambda.1se)
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
79 # predict value of the test set for further evaluation
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
80 prediction <- c(prediction, list(predict(lasso.fit, test, type = "response")[,1]))
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
81 }
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
82 # save predicted value for test set of each fold for further evaluation
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
83 saveRDS(prediction, file=paste(outFile,".rds", sep=""))
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
84 # just create a model
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
85 } else {
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
86 # cv.glmnet helps to compute the right lambda for a chosen alpha
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
87 cv <- cv.glmnet(x=genotype, y=phenotype, alpha=alpha)
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
88 # create model
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
89 model <- glmnet(x=genotype, y=phenotype, alpha=alpha, lambda=cv$lambda.1se)
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
90 # save model
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
91 saveRDS(model, file = paste(outFile, ".rds", sep = ""))
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
92 }
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
93 }
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
94
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
95 ############################ main #############################
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
96 # load argument
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
97 cmd <- commandArgs(T)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
98 source(cmd[1])
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
99 # check if evaluation is required
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
100 evaluation <- F
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
101 if(as.integer(doEvaluation) == 1) {
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
102 evaluation <- T
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
103 con = file(folds)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
104 folds <- readLines(con = con, n = 1, ok=T)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
105 close(con)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
106 folds <- readRDS(folds)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
107 }
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
108 # load classifier parameters
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
109 alpha <- as.numeric(alpha)
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
110 if(alpha < 0 | alpha > 1) {alpha <- NULL}
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
111 # load genotype and phenotype
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
112 con = file(genotype)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
113 genotype <- readLines(con = con, n = 1, ok=T)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
114 close(con)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
115 genotype <- read.table(genotype, sep="\t", h=T)
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
116 # phenotype is written as a table (in columns) but it must be sent as a vector for mixed.solve
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
117 phenotype <- read.table(phenotype, sep="\t", h=T)[,1]
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
118 # run !
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
119 lasso(genotype = data.matrix(genotype), phenotype = phenotype,
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
120 evaluation = evaluation, outFile = out, folds = folds, alpha = alpha)
35
2e66da6efc41 Uploaded
nicolas
parents: 9
diff changeset
121 # return path of the result file to galaxy
9
dcc10adbe46b Uploaded
nicolas
parents:
diff changeset
122 cat(paste(paste(out, ".rds", sep = ""), "\n", sep=""))