annotate cluster.tools/ipl.feature.selection.R @ 0:0decf3fd54bc draft

Uploaded
author peter-waltman
date Thu, 28 Feb 2013 01:45:39 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
1 #!/usr/bin/env Rscript
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
2 ## IPL selection script by Peter Waltman
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
3 ## August 21, 2011
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
4 ## License under Creative Commons Attribution 3.0 Unported (CC BY 3.0)
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
5 ##
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
6 #usage, options and doc goes here
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
7 argspec <- c("ipl.feature.selection.R takes a set of results from Paradigm, and filters for features that are
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
8 active, inactive or modulated above a given IPL threshold over a sufficient percentage of samples.
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
9
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
10 Usage:
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
11 ipl.feature.selection.R -d <data.file>
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
12 Optional:
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
13 -o <output.name>
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
14 -g <genes-only> ## to set if only returning genes (default is all features)
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
15 -f <filter.type> ## filter.type must be either 'modulated', 'active'or 'inactive' (default is modulated)
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
16 -t <threshold> ## the threshold to use for the filter (default is 0.25)
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
17 -p <perc.pass> ## the percentage of samples that must pass the filter (default is 0.33)
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
18 -v <verbose> ## to set verbose on
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
19
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
20 \n\n")
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
21 args <- commandArgs(TRUE)
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
22 if ( length( args ) == 1 && args =="--help") {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
23 write(argspec, stderr())
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
24 q();
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
25 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
26
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
27 lib.load.quiet <- function( package ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
28 package <- as.character(substitute(package))
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
29 suppressPackageStartupMessages( do.call( "library", list( package=package ) ) )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
30 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
31 lib.load.quiet(getopt)
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
32
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
33 spec <- matrix( c( "data.fname", "d", 1, "character",
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
34 "output.name", "o", 2, "character",
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
35 "genes.only", "g", 0, "logical",
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
36 "filter.type", "f", 2, "character", ## must be either 'active', 'inactive' or 'modulated'
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
37 "threshold", "t", 2, "numeric",
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
38 "empirical.fname", "e", 2, "character",
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
39 "perc.pass", "p", 2, "numeric",
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
40 "verbose", "v", 0, "logical", ## to set verbose on
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
41 "help", "h", 0, "logical"
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
42 ),
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
43 nc=4,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
44 byrow=TRUE
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
45 )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
46
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
47 opt <- getopt( spec=spec )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
48 #set some reasonable defaults for the options that are needed,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
49 #but were not specified.
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
50 if ( is.null(opt$verbose ) ) { opt$verbose = FALSE }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
51 if ( is.null(opt$genes.only ) ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
52 opt$genes.only <- FALSE
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
53 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
54
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
55 if ( is.null(opt$filter.type ) ) { opt$filter.type = 'modulated' }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
56 if ( is.null( opt$threshold ) ) { opt$threshold=0.25 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
57 if ( is.null( opt$perc.pass ) ) { opt$perc.pass=1/3 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
58 if ( opt$perc.pass < 0 ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
59 stop( "please specify a positive number for the percentage of samples that pass the filter (if applicable)" )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
60 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
61 ## now set filter.type, threshold & perc.pass if an empirical result has been passed in
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
62 if ( ! is.null( opt$empirical.fname ) ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
63
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
64 if ( ! file.exists( opt$empirical.fname ) ) stop( "can't file empirical result file:", opt$empirical.fname, "\n" )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
65 ## assume this is an RData file
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
66 emp.fname.contents <- load( opt$empirical.fname )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
67 if ( ! "opt.thresh" %in% emp.fname.contents ) stop( "no optimal threshold value found in RData file passed in\n" )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
68 opt$threshold <- opt.thresh
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
69
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
70 if ( ! "filter.type" %in% emp.fname.contents ) stop( "no filter type value found in RData file passed in\n" )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
71 opt$filter.type <- filter.type
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
72
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
73 if ( ! "perc.pass" %in% emp.fname.contents ) stop( "no percentage passing value found in RData file passed in\n" )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
74 opt$perc.pass <- perc.pass
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
75 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
76 if ( ! opt$filter.type %in% c( 'active', 'inactive', 'modulated' ) ) stop( 'invalid filter.type specified:', opt$filter.type, "\n" )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
77 if ( is.null( opt$output.name ) ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
78 opt$output.name <- file.path( getwd(),
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
79 paste( opt$filter.type, basename( opt$data.fname ), sep="." ) )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
80 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
81
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
82
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
83
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
84 data <- as.matrix( read.delim( opt$data.fname, header=T, row.names=1 , check.names=FALSE ) )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
85 if ( opt$genes.only ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
86 genes <- rownames( data )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
87 genes <- genes[ ! grepl( "abstract|complex|family", genes ) ]
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
88 data <- data[ genes, ]
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
89 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
90
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
91
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
92 count.samps.threshold <- function( data,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
93 threshold,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
94 comparator ## must be one of lte, lt, gt, gte
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
95 ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
96 filter.vect <- rep( TRUE, nrow( data ) ) ## set an initial val
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
97 if ( comparator == "lt" ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
98 return( apply( data,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
99 1,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
100 function(x) sum( x < threshold, na.rm=T ) ) )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
101 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
102 if ( comparator == "lte" ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
103 return( apply( data,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
104 1,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
105 function(x) sum( x <= threshold, na.rm=T ) ) )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
106 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
107 if ( comparator == "gte" ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
108 return( apply( data,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
109 1,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
110 function(x) sum( x >= threshold, na.rm=T ) ) )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
111 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
112 if ( comparator == "gt" ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
113 return( apply( data,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
114 1,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
115 function(x) sum( x > threshold, na.rm=T ) ) )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
116 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
117 if ( comparator == "bothe" ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
118 return( apply( data,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
119 1,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
120 function(x) sum( abs(x) >= threshold, na.rm=T ) ) )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
121 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
122 if ( comparator == "both" ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
123 return( apply( data,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
124 1,
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
125 function(x) sum( abs(x) > threshold, na.rm=T ) ) )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
126 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
127 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
128
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
129
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
130
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
131
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
132 if ( opt$filter.type=="active" ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
133 ## this is an implementation of the activity filter that was used in the original PARADIGM paper
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
134 filter.vect <- count.samps.threshold( data, opt$threshold, "gt" )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
135 } else {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
136 if ( opt$filter.type=="inactive" ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
137 filter.vect <- count.samps.threshold( data, -opt$threshold, "lt" )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
138 } else {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
139 if ( opt$filter.type=="modulated" ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
140 filter.vect <- count.samps.threshold( data, opt$threshold, "both" )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
141 } else {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
142 stop( "invalid filter.type specified: ", opt$filter.type )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
143 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
144 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
145 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
146
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
147 if ( opt$perc.pass <1 ) {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
148 filter.vect <- filter.vect > floor( ncol( data ) * opt$perc.pass )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
149 } else {
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
150 filter.vect <- filter.vect >= opt$perc.pass
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
151 }
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
152 data <- data[ filter.vect, ]
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
153
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
154 write.table( data, opt$output.name, sep="\t", row.names=TRUE, col.names=NA, quote=FALSE )
0decf3fd54bc Uploaded
peter-waltman
parents:
diff changeset
155