annotate cluster.tools/format.raw.TCGA.RNASeq.data.R @ 1:dddfeedb85af draft

Uploaded
author peter-waltman
date Fri, 01 Mar 2013 10:16:53 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
1 #!/usr/bin/env Rscript
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
2 ##
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
3 ## formats raw clinical data from TCGA to contain a single status & time colums
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
4 ##
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
5 ## Input (required):
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
6 ## - clinical data
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
7 ## Input (optional):
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
8 ## - status & time columns: (NOT USED IN THIS SCRIPT - see comment below)
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
9 ## ideally, a better design would allow a user to specify 1 or more columns
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
10 ## to check for the status & time columns - however, due to the necessities
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
11 ## required to pre-process the TCGA clinical data, the script would not be
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
12 ## generalizeable - and for this reason, the TCGA columns are hard-coded.
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
13 ##
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
14 ## Output: a re-formatted clinical file containing 3 columns: sample-ID, status & time
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
15 ##
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
16 ## Date: August 21, 2012
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
17 ## Author: Peter Waltman
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
18 ##
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
19
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
20 ##usage, options and doc goes here
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
21 argspec <- c("format.raw.TCGA.clinical.data.R takes a clustering from ConsensusClusterPlus and clinical survival data
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
22 and generates a KM-plot, along with the log-rank p-values
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
23
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
24 Usage:
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
25 format.raw.TCGA.clinical.data.R -c <clinical.file>
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
26 Options:
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
27 -o <output file> (tab-delimited (3 col: sample_id <tab> status <tab> time))
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
28 ")
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
29 args <- commandArgs(TRUE)
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
30 if ( length( args ) == 1 && args =="--help") {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
31 write(argspec, stderr())
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
32 q();
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
33 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
34
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
35 ## some helper fn's
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
36 write.2.tab <- function( mat,
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
37 fname ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
38 mat <- rbind( colnames( mat ), mat )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
39 mat <- cbind( c( "ID", rownames( mat )[-1] ),
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
40 mat )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
41 write.table( mat, fname, sep="\t", row.names=FALSE, col.names=FALSE, quote=FALSE )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
42 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
43
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
44 fix.genes <- function( mat ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
45 ## filter out the unknowns
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
46 mat <- mat[ ( ! grepl( "^\\?", rownames( mat ) ) ), ]
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
47
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
48 genes <- rownames( mat )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
49 ## select the HUGO name portion of the "gene-names" that are in the TCGA matrices
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
50 genes <- sapply( strsplit( genes, "\\|" ), function(x) x[1] )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
51
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
52 if ( any( duplicated( genes ) ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
53 dupes <- unique( genes[ duplicated( genes ) ] )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
54 no.duped.mat <- which( ! genes %in% dupes )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
55 no.duped.mat <- mat[ no.duped.mat, , drop=FALSE ]
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
56
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
57 ## now merge in the duplicates
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
58 for ( dup in dupes ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
59 duped.mat <- mat[ grepl( paste( "^", dup, sep="" ), rownames( mat ) ), ]
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
60 duped.mat <- apply( duped.mat, 2, mean, na.rm=TRUE )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
61 no.duped.mat <- rbind( no.duped.mat, duped.mat )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
62 ## weird bit of follow up to make sure the new row/gene is named correctly
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
63 rownames( no.duped.mat ) <- c( rownames( no.duped.mat )[ -nrow(no.duped.mat) ],
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
64 paste( dup, "|0000", sep="" ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
65 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
66 mat <- no.duped.mat; rm( no.duped.mat ); gc()
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
67 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
68
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
69 rownames( mat ) <- sapply( strsplit( rownames( mat ), "\\|" ), function(x) x[1] )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
70 return( mat )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
71 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
72
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
73 fix.sample.ids <- function( mat ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
74 colnames( mat ) <- gsub( "\\.", "-", colnames( mat ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
75 return( mat )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
76 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
77
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
78 lib.load.quiet <- function( package ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
79 package <- as.character(substitute(package))
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
80 suppressPackageStartupMessages( do.call( "library", list( package=package ) ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
81 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
82 lib.load.quiet(getopt)
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
83
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
84 spec <- matrix( c( "dataset", "d", 1, "character",
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
85 "log.tranform", "l", 2, "character",
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
86 "filter.low.variant", "f", 2, "integer",
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
87 "output.fname", "o", 2, "character"
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
88 ),
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
89 ncol=4,
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
90 byrow=TRUE
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
91 )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
92 opt <- getopt( spec=spec )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
93
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
94 ##set some reasonable defaults for the options that are needed,
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
95 ##but were not specified.
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
96 if ( is.null(opt$output.fname ) ) { opt$output.fname <-file.path( getwd(), "formated.TCGA.RNASeq.data" ) }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
97 if ( is.null(opt$log.transform ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
98 opt$log.transform <- TRUE
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
99 } else {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
100 opt$log.transform <- ( tolower( opt$log.transform ) %in% "yes" )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
101 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
102
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
103 if ( is.null(opt$filter.low.variant ) ) { opt$log.transform <- 10 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
104
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
105
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
106 data <- as.matrix( read.delim( opt$dataset, row.names=1, check.names=F ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
107 data <- fix.genes( data )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
108 data <- fix.sample.ids( data )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
109
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
110 if ( opt$filter.low.variant > 0 ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
111 rpkm.meds <- apply( data, 1, median, na.rm=TRUE )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
112 rpkm.meds <- rpkm.meds >= opt$filter.low.variant
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
113 data <- data[ rpkm.meds, ]
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
114 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
115
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
116 if ( opt$log.transform ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
117 data <- log( data + 1 )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
118 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
119
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
120 write.2.tab( data, opt$output.fname )