annotate cluster.tools/extract.TCGA.survival.data.R @ 9:a3c03541fe6f draft default tip

Uploaded
author peter-waltman
date Mon, 11 Mar 2013 17:30:48 -0400
parents 563832f48c08
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 lib.load.quiet <- function( package ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
45 package <- as.character(substitute(package))
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
46 suppressPackageStartupMessages( do.call( "library", list( package=package ) ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
47 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
48 lib.load.quiet(getopt)
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
49
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
50 spec <- matrix( c( "clinical.fname", "d", 1, "character",
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
51 "output.fname", "o", 2, "character"
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
52 ),
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
53 ncol=4,
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
54 byrow=TRUE
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
55 )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
56 opt <- getopt( spec=spec )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
57
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
58 ##set some reasonable defaults for the options that are needed,
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
59 ##but were not specified.
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
60 if ( is.null(opt$output.fname ) ) { opt$output.fname <-file.path( getwd(), "formated.TCGA.clinical.data" ) }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
61
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
62 ##orig.clinical.data <- read.delim( opt$clinical.fname, as.is=TRUE, row.names=1 )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
63 orig.clinical.data <- read.delim( opt$clinical.fname, as.is=TRUE )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
64 orig.clinical.data <- unique( orig.clinical.data )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
65 rownames( orig.clinical.data ) <- orig.clinical.data[,1]
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
66 orig.clinical.data <- orig.clinical.data[, -1 ]
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
67
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
68 ## ugh, some TCGA data sets have all NAs in the "days_to_..." columns
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
69 if ( "days_to_last_known_alive" %in% colnames( orig.clinical.data ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
70 time.cols <- c( "days_to_death", "days_to_last_followup", "days_to_last_known_alive" )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
71 } else {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
72 time.cols <- c( "days_to_death", "days_to_last_followup" )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
73 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
74 good.samps <- ! apply( orig.clinical.data[, time.cols ], 1, function(x) all( is.na(x) ) | all( x <= 0, na.rm=T ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
75
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
76 orig.clinical.data <- orig.clinical.data[ good.samps, ]
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
77
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
78 if ( is.null(opt$status.column ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
79 status.colname <- "vital_status"
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
80 if ( status.colname %in% colnames( orig.clinical.data ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
81 opt$status.column <- which( colnames( orig.clinical.data ) %in% status.colname )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
82 clinical.data <- orig.clinical.data[ , opt$status.column ]
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
83 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
84 else {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
85 status.colname <- "days_to_death"
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
86 if ( status.colname %in% colnames( orig.clinical.data ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
87 opt$status.column <- which( colnames( orig.clinical.data ) %in% status.colname )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
88 clinical.data <- orig.clinical.data[ , opt$status.column ]
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
89 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
90 else {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
91 stop( "can't find a valid entry with status info - have tried vital_status & days_to_death\n" )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
92 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
93 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
94 clinical.data <- as.numeric( ! grepl( "(LIVING|Not)", clinical.data ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
95 }
3
563832f48c08 Uploaded
peter-waltman
parents: 1
diff changeset
96
1
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
97 if ( is.null(opt$time.column ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
98 time.colname <- "CDE.clinical_time"
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
99
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
100 if ( time.colname %in% colnames( orig.clinical.data ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
101 opt$time.column <- which( colnames( orig.clinical.data ) %in% time.colname )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
102 clinical.data <- cbind( clinical.data,
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
103 as.numeric( orig.clinical.data[, opt$time.column ] ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
104 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
105 else {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
106 dec.mat <- matrix( NA,
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
107 nc=length( time.cols ),
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
108 nr=nrow( orig.clinical.data ),
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
109 dimnames=list( rownames( orig.clinical.data ),
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
110 time.cols )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
111 )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
112 for ( cname in colnames( dec.mat ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
113 if ( cname %in% colnames( orig.clinical.data ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
114 dec.mat[, cname ] <- as.numeric( orig.clinical.data[, cname ] )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
115 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
116 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
117
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
118
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
119
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
120 if ( "days_to_last_known_alive" %in% colnames( orig.clinical.data ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
121
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
122 opt$time.column <- sapply( 1:length( clinical.data ),
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
123 function(i) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
124 if ( clinical.data[i] ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
125 ## this is a deceased sample
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
126 return( ifelse( ( !is.na( dec.mat[ i, "days_to_death" ] ) ),
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
127 dec.mat[ i, "days_to_death" ],
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
128 ifelse( ( !is.na( dec.mat[ i, "days_to_last_known_alive" ] ) ),
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
129 dec.mat[ i, "days_to_last_known_alive" ],
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
130 dec.mat[ i, "days_to_last_followup" ] ) ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
131
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
132 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
133 else {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
134 return( max( dec.mat[ i, c( "days_to_last_followup","days_to_last_known_alive") ], na.rm=T ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
135 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
136 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
137 )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
138 } else {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
139 opt$time.column <- sapply( 1:length( clinical.data ),
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
140 function(i) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
141 if ( clinical.data[i] ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
142 ## this is a deceased sample
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
143 return( ifelse( ( !is.na( dec.mat[ i, "days_to_death" ] ) ),
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
144 dec.mat[ i, "days_to_death" ],
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
145 dec.mat[ i, "days_to_last_followup" ] ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
146
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
147 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
148 else {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
149 return( max( dec.mat[ i, c( "days_to_last_followup") ], na.rm=T ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
150 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
151 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
152 )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
153 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
154
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
155
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
156 clinical.data <- cbind( clinical.data,
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
157 as.numeric( opt$time.column ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
158 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
159 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
160
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
161 clinical.data <- as.data.frame( clinical.data )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
162 colnames( clinical.data ) <- c( "status", "time" )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
163 rownames( clinical.data ) <- rownames( orig.clinical.data )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
164
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
165
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
166 ## check to make sure that the id's are sync'd correctly
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
167 ## the default format is to use hyphens to separate the elt's of the name
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
168 ## and to only use the 1st 3 elements of the name
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
169 ## so we check to see if they're using something else as separators and/or using more than 3 elts
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
170 reformat.ids <- function( ids ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
171
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
172 if ( grepl( "TCGA\\.", ids[1] ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
173 ids <- sapply( strsplit( ids, "\\." ), function(x) paste( x[1:3], collapse="-" ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
174 } else {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
175 ## do this just in case there's more than 3 elements to the names
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
176 if ( grepl( "TCGA-", ids[1] ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
177 ids <- sapply( strsplit( ids, "-" ), function(x) paste( x[1:min( c(3,length(x) ) )], collapse="-" ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
178 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
179 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
180 return( ids )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
181 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
182
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
183
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
184 new.samp.ids <- reformat.ids( rownames( clinical.data ) )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
185 if ( any( duplicated( new.samp.ids ) ) ) {
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
186 ## in some cases, we have duplicate sample ids in the raw data after we truncate to
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
187 ## the 1st 3 elts in the barcode, so just simplify the data
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
188 uniqs <- ! duplicated( new.samp.ids )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
189 clinical.data <- clinical.data[ uniqs, ]
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
190 new.samp.ids <- new.samp.ids[ uniqs ]
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
191 }
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
192
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
193 rownames( clinical.data ) <- new.samp.ids
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
194
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
195 write.2.tab( clinical.data, opt$output.fname )
dddfeedb85af Uploaded
peter-waltman
parents:
diff changeset
196 ##write.table( clinical.data, opt$output.fname, sep="\t", quote=FALSE, col.names=NA )