たとえリピートをマスキングしてから実行したとしても、MEMEは沢山のモチーフを提示してくれる。
ランダムにサンプリングしたプロモーター配列をMEMEに渡すと、MEMEが発見するモチーフの傾向がつかめる。
転写開始点付近のGCに富む領域、Alu配列の下流にあるA-richな領域などが目立つ。A-richな領域はリピートマスキングでもマスクされないのでどうしてもMEMEが拾ってしまう。
ハズレらしきモチーフは極端に長い傾向にある。特にGCに富む領域の場合、ひとつの配列に類似のモチーフが複数見つかる。もちろん、ハズレと断定できるわけではないのだが、このような傾向があることを知っておくのは重要だと思う。
2012年6月19日火曜日
PowerPointの低い解像度について
macでKeynoteを使っていると、PowerPointが使い難くてたまらない。数ある問題のひとつ、「貼付けたPDFの画質が落ちる」という問題への対処法。せっかくPDFで貼付けているのに、どうしてガビガビにしてしまうのか。液晶プロジェクタで出力するなら高解像度は必要ないが、配布資料の画質が荒いのは困る。
使っているプレゼンソフト
Keynote'09
PowerPoint 2008
解決法
PowerPointの「環境設定」の「保存オプション」の「解像度の設定」で解像度を高める。「グラフィックファイルの圧縮」を解除する。
PDFをソースからコピーし、プレビューで「クリップボードから新規作成」し、PNGで保存する。このときのPNGの解像度が重要。解像度 300 ピクセル/インチ以上が望ましい。
.pngファイルをPowerPointに貼付ける。
Keynoteにはめ込んだPDFほどではないが、それなりにクリアになる。
使っているプレゼンソフト
Keynote'09
PowerPoint 2008
解決法
PowerPointの「環境設定」の「保存オプション」の「解像度の設定」で解像度を高める。「グラフィックファイルの圧縮」を解除する。
PDFをソースからコピーし、プレビューで「クリップボードから新規作成」し、PNGで保存する。このときのPNGの解像度が重要。解像度 300 ピクセル/インチ以上が望ましい。
.pngファイルをPowerPointに貼付ける。
Keynoteにはめ込んだPDFほどではないが、それなりにクリアになる。
2012年6月15日金曜日
for()ループを入れ子にして検索するより、Rならではの方法で
IDと数値をもつ表があり、それとは別にIDのリストがあるとする。そのとき、リスト中のIDに対応する数値を表から抽出するにはどうしたらいいだろうか。
Rを使う。
for()ループでIDリストを1つずつ取り出し、そのループの中で更にfor()ループを使って表を1行ずつ取り出し、対応するIDをif()で探すという方法が思い浮かぶ。for()ループを入れ子構造にするやり方だ。方法を下に示す。
この入れ子構造でやってみるとものすごく遅い。2つ目のfor()ループは表の行数マイナス1行分も無駄に動いているわけだから、遅いのも頷ける。でも、perlだったらもっと速くに結果がでるような気がする。どうやらRはループが苦手らしい。
作業効率がとても悪いので、for()ループをひとつ減らして同じ結果を得る方法を考えた。if()で条件検討をせず、セルが一致する行をそのままRっぽく拾う。方法を下に示す。
ここに示す小さなデータではスピードの違いを実感できないが、数千行の表の中から数百のリストに合致する行を得ようとすれば、その違いは雲泥の差。前者ならかけっぱなしで散歩にでも行きたくなるが、後者ならあくびをしている間に終了する。
とりあえず、説明用にデータを用意する。
データフレーム(df.1)を用意する。
id1 <- c("A","B","C","D","E","F")
value1 <- rnorm(6,mean=3,sd=1)
df1 <- data.frame(id1,value1)
> df1
id1 value1
1 A 2.484163
2 B 1.539250
3 C 2.773143
4 D 1.041669
5 E 2.409677
6 F 2.532448
IDリスト(id2)を用意する。
id2 <- c("B","D","E")
> id2
[1] "B" "D" "E"
入れ子構造のやり方。
forループを2つ重ねて検索する。
found1 <- df1[0,]
for (i in 1:length(id2)){
for (j in 1:nrow(df1)){
if (id2[i]==df1[j,1]){
hit1 <- df1[j,]
found1 <- rbind(found1,hit1)
}
}
}
> found1
id1 value1
2 B 1.539250
4 D 1.041669
5 E 2.409677
Rの強みを活かすやり方。
forループをひとつだけにする。
found2 <- df1[0,]
for(x in 1:length(id2)){
hit2 <- df1[df1[,1]==id2[x],]
found2 <- rbind(found2,hit2)
}
> found2
id1 value1
2 B 1.539250
4 D 1.041669
5 E 2.409677
2012年6月11日月曜日
MEMEの前にリピートをマスク
MEMEを使ってプロモーター中のモチーフ探しをすると、意味がありそうな、なさそうな、保存性の高いエレメントが多数ヒットすることがある。これらは通常とても長い。ゲノムにはAluなどのリピート配列が多く、それらが解析対象のプロモーター配列セットの中に沢山含まれてしまっているためだ。
MEMEでDNAモチーフを探すときは、あらかじめリピートをマスクしたFASTAを用いるべきだろう。
リピートのマスキングには、giri(Genetic Information Research Institute)のRepeat Maskingツール「CENSOR」が使える。生物種(Sequence source)を指定し、Report simple repeatsをチェックし、FASTAを与えて実行すると、リピート部分の塩基を「X」に置き換えたFASTAを返してくれる。もちろん、どのようなリピートがどこにヒットするかも教えてくれる。
都合のいいことに、CENSORが返してくれたFASTA(「X」でリピートがマスクされたもの)は、そのままMEMEに与えることができる。
2012年6月7日木曜日
.wigのtag countをmedianでノーマライズする
MACSが出力したwiggleのtag countや、samtools mpileup -Dあるいはsamtools depthで得られたdepthを比較解析したいとき、ノーマライズのひとつのやり方として、medianで割るという方法が考えられる。
Rを使えば簡単。
wiggleを読み込む。ヘッダー2行は省く(skip=2)。
wig <- read.table("<in.wig>",skip=2)
> head(wig)
V1 V2
1 1 3
2 11 34
3 21 49
4 31 65
5 41 81
6 51 105
2列目のデータを、2列目のmedianで割った値で置き換える。
wig$V2 <- wig$V2/median(wig$V2)
> head(wig)
V1 V2
1 1 0.007575758
2 11 0.085858586
3 21 0.123737374
4 31 0.164141414
5 41 0.204545455
6 51 0.265151515
小数点以下2桁にする
wig$V2 <- round(wig$V2,digits=2)
> head(wig)
V1 V2
1 1 0.01
2 11 0.09
3 21 0.12
4 31 0.16
5 41 0.20
6 51 0.27
まとめてやるなら、
wig <- read.table("<in.wig>",skip=2)
wig$V2 <- round(wig$V2/median(wig$V2),digits=2)
必要に応じてread.tableで書き出したり、プロットしたりする。
IGVの調整によりwiggle等を開けるようにする
IGVの調整によりwiggleを開けるようにする
MACSが作成したwiggle(.wig)のヘッダー情報にある染色体名(chrom=)がIGVで用いるアセンブリと一致しない場合、wiggleのヘッダーを書き換える以外に、IGVの設定を調整するという解決策もある。
macなら、ホームフォルダに「igv」というフォルダがあり(IGV 2.0のときは不可視化されていた?)、その中の「genomes」に、エイリアスファイルなるものを作って入れてやるだけで良い。
詳しい説明はこちら。
.wigと染色体名が一致しない問題は、BWA等によるアライメントの時に使用するリファレンスゲノム(.fasta)の染色体名をあらかじめIGVに合わせておくことで回避できるが、様々なソースから得たGFFやBEDなどもまた、染色体名の記述方法が異なる場合がある。その都度書類を書き換えるより、上記のごとくIGVの設定を変更しておくと楽。
IGVでwiggleを開く
MACSが解析したChIP-seqのデータ(.wig)をIGVで眺める。
必要なデータ
<in.wig.gz> MACSで作成したwiggle(.gzを解凍してもしなくても)
IGV_2.1.17.zip(14.6 MB)を解凍し、igv.jarを起動。
生物(アセンブリ)を指定する。染色体名を確認する。「chr1」や「I」など、アセンブリにより染色体名の記述の仕方が異なる。
MACSが作成した.wig.gzを解凍して.wigにし、エディタで開いてヘッダーの2行目の「chrom=」の後ろを確認する。ここがIGVの記述方法と一致している必要がある。一致していなければ書き換える。
染色体名が一致していれば、.wig.gzのままでもIGVで開くことができる。
MACSでChIP-seqデータを解析
MACSはピークを検出するだけでなく、wiggle形式のデータも出力してくれる。
必要なデータ
<treat.bam> サンプル1
<control.bam> サンプル2
BWAとsamtools samseで、FASTQからBAMを得ておく。
他のパラメータ
<genome.size> ゲノムサイズを「1.5e+9」などの形で与える必要がある
<name> この名前のフォルダが作られる
コマンド
macs14 -t <treat.bam> -c <control.bam> -f BAM -g <genome.size> -n <name> -w
作られるファイルとフォルダ
<name>(フォルダ)
<name>_peaks.bed
<name>_peaks.xls
<name>_negative_peaks.bed
<name>_summits.bed
<name>_MACS_wiggle(フォルダ)
control(フォルダ)
treat(フォルダ)
* controlとtreatのフォルダに染色体毎のwiggle(.wig.gz)が作られる
* -wを与えなければwiggleは作られない
* コントロール(-c <control.bam>)は必ずしも必要ではない
.wigと.bedはIGVで開くことができる
SRAをFASTQに変換
NCBI SRA からダウンロードした.sraを.fastqにする。
SRAをFASTQに変換できない?
そう困ったときは、paired-endかもしれないと疑ってみるのがいいみたい。
SRA Toolkitを使う(たとえば、ver 2.1.9)
必要なデータ
<in.sra>
コマンド
fastq-dump.2.1.9 <in.sra>
作られるデータ
<in.sra>と同じprefixの.fastq(in.fastq)
paired-endのfastqがセットになった.sraの場合、
fastq-dump.2.1.9 に 「--split-3」を与える
コマンド
fastq-dump.2.1.9 --split-3 <in.sra>
作られるデータ
in_1.fastqとin_2.fastq
SRAをFASTQに変換できない?
そう困ったときは、paired-endかもしれないと疑ってみるのがいいみたい。
BAMからdepthを得る
.bamからdepthを得る
必要なデータ
ref.fasta リファレンスゲノム
in1.bam サンプル#1のデータ
コマンド
samtools mpileup -D -f <ref.fasta> <in1.bam> <in2.bam> > <mpileup.result1.txt>
生成されるデータ
ref.fasta.fai
mpileup.result1.txt
mpileup.result1.txtの内容
1行目:染色体名
2行目:塩基番号(1~)
3行目:塩基(A, T, G or C)
4行目:depth <in1.bam>
5行目:リードの方向("." or ",") <in1.bam>
6行目:対応するクオリティー <in1.bam>
7行目:depth <in2.bam>*
8行目:リードの方向("." or ",") <in2.bam>*
9行目:対応するクオリティー <in2.bam>*
*インプットが1つの場合、6行目まで
生成されるデータを軽量化する(リードの方向やクオリティーを省く)
コマンド
samtools mpileup -D -f <ref.fasta> <in1.bam> <in2.bam> | awk '{print($1,$2,$3,$4,$7)}' > <mpileup.result2.txt>
mpileup.result2.txtの内容
1行目:染色体名
2行目:塩基番号(1~)
3行目:塩基(A, T, G or C)
4行目:depth <in1.bam>
5行目:depth <in2.bam>
高速シーケンスデータからBAMを得てバリアントをコールする
BWAによるアライメントの続き
samtools & bcftools
アライメントデータ(.sam)をバイナリデータ(.bam)に変換し、バリアント(SNP, indel)をコールする
bcftoolsはsamtoolsについてくる
必要なファイル
ref.fasta
fastq1.txt
samse.result.sam
sampe.result.sam
samtools view
samtools view -uS <input.sam> | samtools sort - <name>
→ .bamファイルが作られる(name.bam:sort済みのuncompressedな.bam)
samtools rmdup
samtools rmdup -s <imput.bam> <output.bam>
→ PCR duplicatesが取り除かれる
samtools index
samtools index <input.bam>
→ .baiファイルが作られる
samtools flagstat
samtools flagstat <input.bam> > <output.txt>
→ リードのマップ状況などに関する統計が表示される
samtools idxstats
samtools idxstats <input.bam> > <output.txt>
→ 各染色体にマップされたリードの数が表示される
samtools pileup
廃止された(現在はmpileupを使用する)
samtools mpileup(variantのコール)
samtools mpileup -uf <ref.fasta> <input.bam> | bcftools view -bvcg - > <output.raw.bcf>
→ .bcfファイルが作られる(uncompressed BCF: binary call format)
bcftools view
bcftools view <input.raw.bcf> | vcfutils.pl varFilter -D10000000 > <output.var.flt.vcf>
→ フィルター済みの.vcfファイルが作られる
高速シーケンスのデータをリファレンスにアライメント
BWA(Burrows-Wheeler Aligner)を使って
生データ(.fastq)をリファレンス(.fasta)にアライメントする(.sam)
必要なファイル
ref.fasta リファレンスゲノム(multiple fasta)
fastq1.txt FASTQデータ
fastq2.txt FASTQデータ(paired-endの場合はFASTQを2つ)
bwa index
bwa index -a is <ref.fasta>
→ 8種類のファイルが作られる
(.amb, .ann, .bwt, .pac, .rbwt, .rpac, .rsa, .sa)
bwa aln
bwa aln <ref.fasta> <fastq1.txt> > <aln.result1.sai> |
bwa aln <ref.fasta> <fastq2.txt> > <aln.result2.sai>
→ single-endの場合は上の1行のみ
.saiファイルが作られる
bwa sampe(paired-endの場合)
bwa sampe <ref.fasta> <aln.result1.sai> <aln.result2.sai> <fastq1.txt> <fastq2.txt> > <sampe.result.sam>
→ .samファイルが作られる
bwa samse(single-endの場合)
bwa samse <ref.fasta> <aln.result1.sai> <fastq1.txt> > <samse.result.sam>
→ .samファイルが作られる
2012年6月6日水曜日
MEMEでモチーフ探し
ある一群のDNA配列が特定のエレメントをもつかどうかを知りたい。例えば、転写因子が結合するエレメントがあると期待している。そんなときは、MEMEが便利。
MEME (Multiple Em for Motif Elicitation)
MEMEに一群の配列を渡すと、その中に存在するエレメントをLOGOとして返してくれる。
MEMEは、ダウンロードして自分のmacで走らせることができる。サーバの混雑に影響されずに済むし、CUIだとパラメータを少しずつ変更しながらの作業が楽。
自分のmacで走らせると、指定したディレクトリにHTML書類(meme.html)を出力してくれる。同じディレクトリに発見されたモチーフの順鎖と逆鎖のPNG画像(logo1.png, logo_rc1.png等)があり、HTMLをブラウザで開くとそれらが参照される。
meme.txtと名付けられたファイルに重要な情報がまとめられている。こちらからコピペすれば、HTML越しに作業をするより楽。 meme.txtにはモチーフの定義が記述されており、これを切り抜いて個別のファイルにしておくとFIMO (Find Individual Motif Occurences)に渡すことができる。
アウトプットについての情報
モチーフのフォーマットはこちら
MEME Minimal Motif Format (sample DNA motif)
MEME (Multiple Em for Motif Elicitation)
MEMEに一群の配列を渡すと、その中に存在するエレメントをLOGOとして返してくれる。
MEMEは、ダウンロードして自分のmacで走らせることができる。サーバの混雑に影響されずに済むし、CUIだとパラメータを少しずつ変更しながらの作業が楽。
自分のmacで走らせると、指定したディレクトリにHTML書類(meme.html)を出力してくれる。同じディレクトリに発見されたモチーフの順鎖と逆鎖のPNG画像(logo1.png, logo_rc1.png等)があり、HTMLをブラウザで開くとそれらが参照される。
meme.txtと名付けられたファイルに重要な情報がまとめられている。こちらからコピペすれば、HTML越しに作業をするより楽。 meme.txtにはモチーフの定義が記述されており、これを切り抜いて個別のファイルにしておくとFIMO (Find Individual Motif Occurences)に渡すことができる。
アウトプットについての情報
モチーフのフォーマットはこちら
MEME Minimal Motif Format (sample DNA motif)
2012年6月4日月曜日
ファイルの行数を調査する
「テキトーな表」を使う。
<dir_name>と名付けたディレクトリに「テキトーな表」に由来するファイルが入っているとする。
ディレクトリ(フォルダ)に移動する。
cd <dir_name>
カレントディレクトリ内の、ファイル名が「.txt」で終わるファイルの行数を調べる
wc -l *.txt
$ wc -l *.txt
8 dataA.txt
8 dataA_col23.txt
5 dataA_2over0.txt
7 dataA_2plus3.txt
8 dataB.txt
36 total
「.csv」で終わるファイルなら、
wc -l *.csv
$ wc -l *.csv
8 dataA.csv
8 dataB.csv
16 total
「dataA」で始まるファイルなら、
wc -l dataA*
$ wc -l dataA*
8 dataA.csv
8 dataA.txt
5 dataA_2over0.txt
7 dataA_2plus3.txt
8 dataA_col23.txt
36 total
特定のファイルの行数を調べる(例えば「dataA.txt」)
wc -l dataA.txt
$ wc -l dataA.txt
8 dataA.txt
awkで特定の列や行を抽出する
「テキトーな表」を使う
awkでタブ区切りファイルを開き、2列目と3列目だけを抽出して新規ファイルとして保存する。
awk 'BEGIN{FS="\t"; OFS="\t"} {print $2,$3}' dataA.txt > dataA_col23.txt
上を実行する際に、1行目(ヘッダー行)だけを省く
awk 'BEGIN{FS="\t"; OFS="\t"} {if(NR >= 2) {print $2,$3}}' dataA.txt > dataA_col23_noHead.txt
あるいは
awk 'BEGIN{FS="\t"; OFS="\t"} {if(NR != 1) {print $2,$3}}' dataA.txt > dataA_col23_noHead.txt
あるいは
awk 'BEGIN{FS="\t"; OFS="\t"} {if(NR > 1) {print $2,$3}}' dataA.txt > dataA_col23_noHead.txt
2列目がゼロより大きい行を抽出して保存する。
awk 'BEGIN{FS="\t"; OFS="\t"} $2 > 0' dataA.txt > dataA_2over0.txt
2列目と3列目を足した値を4列目として保存する。
awk 'BEGIN{FS="\t"; OFS="\t"} $4=$2+$3 {print $0}' dataA.txt > dataA_2plus3.txt
awkによる、タブ区切りからcsvへの変換、およびその逆
「テキトーな表」を使う
awkでタブ区切りファイルを開き、CSVファイルとして保存する
awk 'BEGIN{FS="\t"; OFS=","} {print $0}' dataA.txt > dataB.csv
あるいは
awk 'BEGIN{FS="\t"; OFS=","} $0' dataA.txt > dataB.csv
awkでCSVファイルを開き、タブ区切りファイルとして保存する
awk 'BEGIN{FS=","; OFS="\t"} {print $0}' dataA.csv > dataB.txt
awk 'BEGIN{FS=","; OFS="\t"} $0' dataA.csv > dataB.txt
Rでタブ区切り(.txt)やcsv(.csv)を開く
「テキトーな表」を使う
タブ区切りファイルを読み込む
data.B <- read.table(file="dataA.txt",header=T,sep="\t")
あるいは
data.B <- read.table(file="dataA.txt",header=T)
data.B <- read.delim(file="dataA.txt",header=T)
read.delim() に header=T を与えなくても、ヘッダーがカラム名になる
data.B <- read.delim(file="dataA.txt")
> data.B
name1 name2 name3
1 -1.220 -0.321 -0.585
2 1.584 -1.410 -0.378
3 -0.305 1.061 -0.392
4 -1.344 0.814 0.974
5 -0.798 0.139 0.742
6 0.688 -1.462 -0.149
7 0.023 0.342 2.005
read.table() に header=T を与えなければ、1行目にヘッダーが入ってしまう
data.B <- read.table(file="dataA.txt")
> data.B
V1 V2 V3
1 name1 name2 name3
2 -1.22 -0.321 -0.585
3 1.584 -1.41 -0.378
4 -0.305 1.061 -0.392
5 -1.344 0.814 0.974
6 -0.798 0.139 0.742
7 0.688 -1.462 -0.149
8 0.023 0.342 2.005
Rで表をつくり、カラム名をつけ、タブ区切り(.txt)やcsv(.csv)として保存する
Rでテキトーな表を作る
data.A <- matrix(round(rnorm(21),digits=3),ncol=3)
rnorm: 乱数発生
round: 丸め処理(digits: 小数点以下の桁数)
matrix: リストから行列をつくる(ncol: カラムの数)
> data.A
[,1] [,2] [,3]
[1,] -1.220 -0.321 -0.585
[2,] 1.584 -1.410 -0.378
[3,] -0.305 1.061 -0.392
[4,] -1.344 0.814 0.974
[5,] -0.798 0.139 0.742
[6,] 0.688 -1.462 -0.149
[7,] 0.023 0.342 2.005
カラム名をつける
colnames(data.A) <- c("name1","name2","name3")
> data.A
name1 name2 name3
[1,] -1.220 -0.321 -0.585
[2,] 1.584 -1.410 -0.378
[3,] -0.305 1.061 -0.392
[4,] -1.344 0.814 0.974
[5,] -0.798 0.139 0.742
[6,] 0.688 -1.462 -0.149
[7,] 0.023 0.342 2.005
タブ区切りファイルとして保存するなら、
write.table(data.A,file="dataA.txt",sep="\t",col.names=T,row.names=F,quote=F)
csvとして保存するなら、
write.table(data.A,file="dataA.csv",sep=",",col.names=T,row.names=F,quote=F)
dataA.txtをエディタで開くと、
name1 name2 name3
-1.22 -0.321 -0.585
1.584 -1.41 -0.378
-0.305 1.061 -0.392
-1.344 0.814 0.974
-0.798 0.139 0.742
0.688 -1.462 -0.149
0.023 0.342 2.005
dataA.csvをエディタで開くと、
name1,name2,name3
-1.22,-0.321,-0.585
1.584,-1.41,-0.378
-0.305,1.061,-0.392
-1.344,0.814,0.974
-0.798,0.139,0.742
0.688,-1.462,-0.149
0.023,0.342,2.005
登録:
投稿 (Atom)