[2] | 1 | <?xml version="1.0" encoding="utf-8" ?> |
---|
| 2 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
---|
| 3 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
---|
| 4 | <head> |
---|
| 5 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> |
---|
| 6 | <meta name="generator" content="Galaxy rgManQQ.py tool output - see http://g2.trac.bx.psu.edu/" /> |
---|
| 7 | <title></title> |
---|
| 8 | <link rel="stylesheet" href="/static/style/base.css" type="text/css" /> |
---|
| 9 | </head> |
---|
| 10 | <body> |
---|
| 11 | <div class="document"> |
---|
| 12 | |
---|
| 13 | <h1>rgManQQtest1</h1> |
---|
| 14 | <table> |
---|
| 15 | |
---|
| 16 | <tr><td><a href="Allelep_manhattan.png"><img src="Allelep_manhattan.png" alt="Allelep_manhattan.png hspace="10" width="400"><br>(Click to download image Allelep_manhattan.png)</a></td></tr> |
---|
| 17 | <tr><td><a href="Allelep_qqplot.png"><img src="Allelep_qqplot.png" alt="Allelep_qqplot.png hspace="10" width="400"><br>(Click to download image Allelep_qqplot.png)</a></td></tr> |
---|
| 18 | <tr><td><a href="rgManQQtest1.R">rgManQQtest1.R</a></td></tr> |
---|
| 19 | <tr><td><a href="rgManQQtest1.R.log">rgManQQtest1.R.log</a></td></tr> |
---|
| 20 | </table> |
---|
| 21 | |
---|
| 22 | <h3>R log follows below</h3><hr><pre> |
---|
| 23 | |
---|
| 24 | Loading required package: reshape |
---|
| 25 | |
---|
| 26 | Loading required package: plyr |
---|
| 27 | |
---|
| 28 | |
---|
| 29 | |
---|
| 30 | Attaching package: 'reshape' |
---|
| 31 | |
---|
| 32 | |
---|
| 33 | |
---|
| 34 | The following object(s) are masked from 'package:plyr': |
---|
| 35 | |
---|
| 36 | |
---|
| 37 | |
---|
| 38 | round_any |
---|
| 39 | |
---|
| 40 | |
---|
| 41 | |
---|
| 42 | Loading required package: grid |
---|
| 43 | |
---|
| 44 | Loading required package: proto |
---|
| 45 | |
---|
| 46 | [1] "### 101 values read from /tmp/rgManQQtempcWfFkc read - now running plots" |
---|
| 47 | |
---|
| 48 | [1] "## qqplot on Allelep done" |
---|
| 49 | |
---|
| 50 | [1] "## manhattan on Allelep starting 1 2 3" |
---|
| 51 | |
---|
| 52 | [1] "## manhattan plot on Allelep done" |
---|
| 53 | |
---|
| 54 | ## R script= |
---|
| 55 | |
---|
| 56 | # license not stated so I'm assuming LGPL is ok for my derived work? |
---|
| 57 | # generalised so 3 core fields passed as parameters ross lazarus March 24 2010 for rgenetics |
---|
| 58 | # Originally created as qqman with the following |
---|
| 59 | # attribution: |
---|
| 60 | #-------------- |
---|
| 61 | # Stephen Turner |
---|
| 62 | # http://StephenTurner.us/ |
---|
| 63 | # http://GettingGeneticsDone.blogspot.com/ |
---|
| 64 | |
---|
| 65 | # Last updated: Tuesday, December 22, 2009 |
---|
| 66 | # R code for making manhattan plots and QQ plots from plink output files. |
---|
| 67 | # With GWAS data this can take a lot of memory. Recommended for use on |
---|
| 68 | # 64bit machines only, for now. |
---|
| 69 | |
---|
| 70 | # |
---|
| 71 | |
---|
| 72 | library(ggplot2) |
---|
| 73 | |
---|
| 74 | coloursTouse = c('firebrick','darkblue','goldenrod','darkgreen') |
---|
| 75 | # not too fugly but need a colour expert please... |
---|
| 76 | |
---|
| 77 | |
---|
| 78 | manhattan = function(chrom=NULL,offset=NULL,pvals=NULL, title=NULL, max.y="max", |
---|
| 79 | suggestiveline=0, genomewide=T, size.x.labels=9, size.y.labels=10, annotate=F, SNPlist=NULL,grey=0) { |
---|
| 80 | |
---|
| 81 | if (annotate & is.null(SNPlist)) stop("You requested annotation but provided no SNPlist!") |
---|
| 82 | genomewideline=NULL # was genomewideline=-log10(5e-8) |
---|
| 83 | if (genomewide) { # use bonferroni since might be only a small region? |
---|
| 84 | genomewideline = -log10(0.05/length(pvals)) } |
---|
| 85 | d=data.frame(CHR=chrom,BP=offset,P=pvals) |
---|
| 86 | |
---|
| 87 | #limit to only chrs 1-23? |
---|
| 88 | d=d[d$CHR %in% 1:23, ] |
---|
| 89 | |
---|
| 90 | if ("CHR" %in% names(d) & "BP" %in% names(d) & "P" %in% names(d) ) { |
---|
| 91 | d=na.omit(d) |
---|
| 92 | d=d[d$P>0 & d$P<=1, ] |
---|
| 93 | d$logp = -log10(d$P) |
---|
| 94 | |
---|
| 95 | d$pos=NA |
---|
| 96 | ticks=NULL |
---|
| 97 | lastbase=0 |
---|
| 98 | chrlist = unique(d$CHR) |
---|
| 99 | nchr = length(chrlist) # may be any number? |
---|
| 100 | if (nchr >= 2) { |
---|
| 101 | for (x in c(1:nchr)) { |
---|
| 102 | i = chrlist[x] # need the chrom number - may not == index |
---|
| 103 | if (x == 1) { # first time |
---|
| 104 | d[d$CHR==i, ]$pos=d[d$CHR==i, ]$BP |
---|
| 105 | tks = d[d$CHR==i, ]$pos[floor(length(d[d$CHR==i, ]$pos)/2)+1] |
---|
| 106 | } else { |
---|
| 107 | lastchr = chrlist[x-1] # previous whatever the list |
---|
| 108 | lastbase=lastbase+tail(subset(d,CHR==lastchr)$BP, 1) |
---|
| 109 | d[d$CHR==i, ]$pos=d[d$CHR==i, ]$BP+lastbase |
---|
| 110 | tks=c(tks, d[d$CHR==i, ]$pos[floor(length(d[d$CHR==i, ]$pos)/2)+1]) |
---|
| 111 | } |
---|
| 112 | ticklim=c(min(d$pos),max(d$pos)) |
---|
| 113 | xlabs = chrlist |
---|
| 114 | } |
---|
| 115 | } else { # nchr is 1 |
---|
| 116 | nticks = 10 |
---|
| 117 | last = max(offset) |
---|
| 118 | first = min(offset) |
---|
| 119 | tks = c() |
---|
| 120 | t = (last-first)/nticks # units per tick |
---|
| 121 | for (x in c(1:nticks)) tks = c(tks,round(x*t)) |
---|
| 122 | xlabs = tks |
---|
| 123 | ticklim = c(first,last) |
---|
| 124 | } # else |
---|
| 125 | if (grey) {mycols=rep(c("gray10","gray60"),max(d$CHR)) |
---|
| 126 | } else { |
---|
| 127 | mycols=rep(coloursTouse,max(d$CHR)) |
---|
| 128 | } |
---|
| 129 | |
---|
| 130 | if (max.y=="max") maxy=ceiling(max(d$logp)) else maxy=max.y |
---|
| 131 | maxy = max(maxy,1.1*genomewideline) |
---|
| 132 | # if (maxy<8) maxy=8 |
---|
| 133 | # only makes sense if genome wide is assumed - we could have a fine mapping region? |
---|
| 134 | if (annotate) d.annotate=d[as.numeric(substr(d$SNP,3,100)) %in% SNPlist, ] |
---|
| 135 | if (nchr >= 2) { |
---|
| 136 | manplot=qplot(pos,logp,data=d, ylab=expression(-log[10](italic(p))) , colour=factor(CHR)) |
---|
| 137 | manplot=manplot+scale_x_continuous(name="Chromosome", breaks=tks, labels=xlabs) } |
---|
| 138 | else { |
---|
| 139 | manplot=qplot(BP,logp,data=d, ylab=expression(-log[10](italic(p))) , colour=factor(CHR)) |
---|
| 140 | manplot=manplot+scale_x_continuous("BP") } |
---|
| 141 | manplot=manplot+scale_y_continuous(limits=c(0,maxy), breaks=1:maxy, labels=1:maxy) |
---|
| 142 | manplot=manplot+scale_colour_manual(value=mycols) |
---|
| 143 | if (annotate) { manplot=manplot + geom_point(data=d.annotate, colour=I("green3")) } |
---|
| 144 | manplot=manplot + opts(legend.position = "none") |
---|
| 145 | manplot=manplot + opts(title=title) |
---|
| 146 | manplot=manplot+opts( |
---|
| 147 | panel.background=theme_blank(), |
---|
| 148 | axis.text.x=theme_text(size=size.x.labels, colour="grey50"), |
---|
| 149 | axis.text.y=theme_text(size=size.y.labels, colour="grey50"), |
---|
| 150 | axis.ticks=theme_segment(colour=NA) |
---|
| 151 | ) |
---|
| 152 | #manplot = manplot + opts(panel.grid.y.minor=theme_blank(),panel.grid.y.major=theme_blank()) |
---|
| 153 | #manplot = manplot + opts(panel.grid.major=theme_blank()) |
---|
| 154 | |
---|
| 155 | if (suggestiveline) manplot=manplot+geom_hline(yintercept=suggestiveline,colour="blue", alpha=I(1/3)) |
---|
| 156 | if (genomewideline) manplot=manplot+geom_hline(yintercept=genomewideline,colour="red") |
---|
| 157 | manplot |
---|
| 158 | } else { |
---|
| 159 | stop("Make sure your data frame contains columns CHR, BP, and P") |
---|
| 160 | } |
---|
| 161 | } |
---|
| 162 | |
---|
| 163 | |
---|
| 164 | |
---|
| 165 | qq = function(pvector, title=NULL, spartan=F) { |
---|
| 166 | # Thanks to Daniel Shriner at NHGRI for providing this code for creating expected and observed values |
---|
| 167 | o = -log10(sort(pvector,decreasing=F)) |
---|
| 168 | e = -log10( 1:length(o)/length(o) ) |
---|
| 169 | # you could use base graphics |
---|
| 170 | # plot(e,o,pch=19,cex=0.25, xlab=expression(Expected~~-log[10](italic(p))), |
---|
| 171 | # ylab=expression(Observed~~-log[10](italic(p))), xlim=c(0,max(e)), ylim=c(0,max(e))) |
---|
| 172 | # lines(e,e,col="red") |
---|
| 173 | #You'll need ggplot2 installed to do the rest |
---|
| 174 | qq=qplot(e,o, xlim=c(0,max(e)), ylim=c(0,max(o))) + stat_abline(intercept=0,slope=1, col="red") |
---|
| 175 | qq=qq+opts(title=title) |
---|
| 176 | qq=qq+scale_x_continuous(name=expression(Expected~~-log[10](italic(p)))) |
---|
| 177 | qq=qq+scale_y_continuous(name=expression(Observed~~-log[10](italic(p)))) |
---|
| 178 | if (spartan) plot=plot+opts(panel.background=theme_rect(col="grey50"), panel.grid.minor=theme_blank()) |
---|
| 179 | qq |
---|
| 180 | } |
---|
| 181 | rgqqMan = function(infile="/tmp/rgManQQtempcWfFkc",chromcolumn=1, offsetcolumn=2, pvalscolumns=c(3), |
---|
| 182 | title="rgManQQtest1",grey=0) { |
---|
| 183 | rawd = read.table(infile,head=T,sep='\t') |
---|
| 184 | dn = names(rawd) |
---|
| 185 | cc = dn[chromcolumn] |
---|
| 186 | oc = dn[offsetcolumn] |
---|
| 187 | nams = c(cc,oc) |
---|
| 188 | plen = length(rawd[,1]) |
---|
| 189 | doreorder=1 |
---|
| 190 | print(paste('###',plen,'values read from',infile,'read - now running plots',sep=' ')) |
---|
| 191 | if (plen > 0) { |
---|
| 192 | for (pvalscolumn in pvalscolumns) { |
---|
| 193 | if (pvalscolumn > 0) |
---|
| 194 | { |
---|
| 195 | cname = names(rawd)[pvalscolumn] |
---|
| 196 | mytitle = paste('p=',cname,', ',title,sep='') |
---|
| 197 | myfname = chartr(' ','_',cname) |
---|
| 198 | myqqplot = qq(rawd[,pvalscolumn],title=mytitle) |
---|
| 199 | ggsave(filename=paste(myfname,"qqplot.png",sep='_'),myqqplot,width=11,height=8,dpi=100) |
---|
| 200 | print(paste('## qqplot on',cname,'done')) |
---|
| 201 | if ((chromcolumn > 0) & (offsetcolumn > 0)) { |
---|
| 202 | if (doreorder) { |
---|
| 203 | rawd = rawd[do.call(order,rawd[nams]),] |
---|
| 204 | # mmmf - suggested by http://onertipaday.blogspot.com/2007/08/sortingordering-dataframe-according.html |
---|
| 205 | # in case not yet ordered |
---|
| 206 | doreorder = 0 |
---|
| 207 | } |
---|
| 208 | print(paste('## manhattan on',cname,'starting',chromcolumn,offsetcolumn,pvalscolumn)) |
---|
| 209 | mymanplot= manhattan(chrom=rawd[,chromcolumn],offset=rawd[,offsetcolumn],pvals=rawd[,pvalscolumn],title=mytitle,grey=grey) |
---|
| 210 | print(paste('## manhattan plot on',cname,'done')) |
---|
| 211 | ggsave(filename=paste(myfname,"manhattan.png",sep='_'),mymanplot,width=11,height=8,dpi=100) |
---|
| 212 | } |
---|
| 213 | else { |
---|
| 214 | print(paste('chrom column =',chromcolumn,'offset column = ',offsetcolumn, |
---|
| 215 | 'so no Manhattan plot - supply both chromosome and offset as numerics for Manhattan plots if required')) |
---|
| 216 | } |
---|
| 217 | } |
---|
| 218 | else { |
---|
| 219 | print(paste('pvalue column =',pvalscolumn,'Cannot parse it so no plots possible')) |
---|
| 220 | } |
---|
| 221 | } # for pvalscolumn |
---|
| 222 | } else { print('## Problem - no values available to plot - was there really a chromosome and offset column?') } |
---|
| 223 | } |
---|
| 224 | |
---|
| 225 | rgqqMan() |
---|
| 226 | # execute with defaults as substituted |
---|
| 227 | |
---|
| 228 | </pre> |
---|
| 229 | |
---|
| 230 | <h3><a href="http://rgenetics.org">Rgenetics</a> tool rgManQQ.py run at 18/09/2010 20:48:26</h3> |
---|
| 231 | </div></body></html> |
---|
| 232 | |
---|