如何绘制DNA序列的基因图表说ATGCCGCTGCGC?

时间:2011-04-10 07:01:25

标签: matlab wolfram-mathematica bioinformatics dna-sequence

我需要根据病毒的DNA序列生成随机游走,给出其2k碱基对的碱基对序列。序列看起来像“ATGCGTCGTAACGT”。路径应该向右转A,向左转为T,向上转向G,向下转向C. 我如何为此目的使用Matlab,Mathematica或SPSS?

6 个答案:

答案 0 :(得分:29)

我之前并不知道马克·麦克卢尔关于基因序列的混沌游戏表现的blog,但它让我想起了何塞·曼努埃尔·古铁雷斯(The Mathematica Journal Vol 9 Issue 2)的一篇文章,该文章也给人一种混乱使用(四个碱基)DNA序列的IFS的游戏算法。可以找到详细描述here(原始文章)。

该方法可用于产生如下的图。只是为了它的地狱,我已经包括(在RHS面板中)用相应的互补DNA链(cDNA)产生的图。

  • 小鼠线粒体DNA (LHS)及其            互补链(cDNA)(RHS)。

enter image description here

这些图是从GenBank Identifier gi | 342520生成的。该序列含有16295个碱基。

(JoseManuelGutiérrez使用的一个例子。如果有人感兴趣,可以从gi | 1262342生成人类等效物的图。

  • 人类β珠蛋白区域(LHS)及其cDNA(RHS)

enter image description here

从gi生成| 455025 | (这个例子             用过我的Mark McClure)。该序列含有73308碱基

有很有趣的情节!这种图的(有时)分形性质是已知的,但LHS与RHS(cDNA)版本中明显的对称性是非常令人惊讶的(至少对我而言)。

好的一点是,任何DNA序列的这些图可能很容易通过直接导入序列(来自Genbank),然后使用Mma的力量来生成。
您需要的所有入藏号码! ('未知'核苷酸如“R”可能需要被破坏)(我正在使用Mma v7)。

The Original Implimenation(略有修改) (作者JoseManuelGutiérrez)

重要更新

根据Mark McClure的建议,我已将Point/@Orbit[s, Union[s]]更改为Point@Orbit[s, Union[s]]

这大大加快了速度。 请参阅Mark的评论

Orbit[s_List, {a_, b_, c_, d_}] := 
  OrbitMap[s /. {a -> {0, 0}, b -> {0, 1}, c -> {1, 0}, 
     d -> {1, 1}}];
OrbitMap = 
  Compile[{{m, _Real, 2}}, FoldList[(#1 + #2)/2 &, {0, 0}, m]];
IFSPlot[s_List] := 
 Show[Graphics[{Hue[{2/3, 1, 1, .5}], AbsolutePointSize[2.5], 
    Point @ Orbit[s, Union[s]]}], AspectRatio -> Automatic, 
  PlotRange -> {{0, 1}, {0, 1}}, 
  GridLines -> {Range[0, 1, 1/2^3], Range[0, 1, 1/2^3]}]

这给出了蓝色图。对于绿色,将Hue []更改为Hue [{1 / 3,1,1,.5}]

以下代码现在生成第一个图(对于小鼠线粒体DNA)

 IFSPlot[Flatten@
      Characters@
       Rest@Import[
         "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=\
    nucleotide&id=342520&rettype=fasta&retmode=text", "Data"]]

为了获得cDNA图,我使用了以下转换规则(并且还更改了Hue设置)

IFSPlot[    ....   "Data"] /. {"A" -> "T", "T" -> "A", "G" -> "C", 
   "C" -> "G"}]

感谢Sjoerd C. de Vriestelefunkenvf14帮助直接从NCBI网站导入序列。

为了清楚起见,将事情分解一点。

导入序列

mouseMitoFasta=Import["http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nucleotide&id=342520&rettype=fasta&retmode=text","Data"];

在原始 Mathematica J。文章中导入序列的方法已过时。

一个不错的支票

  

首先@ mouseMitoFasta

输出:

{>gi|342520|gb|J01420.1|MUSMTCG Mouse mitochondrion, complete genome}

生成基础列表

mouseMitoBases=Flatten@Characters@Rest@mouseMitoFasta

进行更多检查

{Length@mouseMitoBases, Union@mouseMitoBases,Tally@mouseMitoBases}

输出:

{16295,{A,C,G,T},{{G,2011},{T,4680},{A,5628},{C,3976}}}

第二组情节以类似的方式从gi | 455025生成。请注意,序列很长!

{73308,{A,C,G,T},{{G,14785},{A,22068},{T,22309},{C,14146}}}

最后一个例子(包含265922 bp),也显示出迷人的“分形”对称性。 (这些是AbsolutePointSize[1]中的IFSPlot生成的。

fasta文件的第一行:

{> GI | 328530803 | GB | AFBL01000008.1 |放线菌口服分类群170 str。 F0386 A_spOraltaxon170F0386-1.0_Cont9.1,全基因组鸟枪序列}

enter image description here

相应的cDNA图再次在RHS上显示为蓝色

最后,Mark的method也提供了非常漂亮的图(例如gi | 328530803),可以下载为笔记本。

答案 1 :(得分:28)

不是我真的理解你想要的“图表”,但这是一个字面解释。

以下代码中的任何一个都不一定是最终形式。在我尝试改进任何事情之前,我想知道这是否正确。

rls = {"A" -> {1, 0}, "T" -> {-1, 0}, "G" -> {0, 1}, "C" -> {0, -1}};
Prepend[Characters@"ATGCGTCGTAACGT" /. rls, {0, 0}];
Graphics[Arrow /@ Partition[Accumulate@%, 2, 1]]

enter image description here

Prepend[Characters@"TCGAGTCGTGCTCA" /. rls, {0, 0}];
Graphics[Arrow /@ Partition[Accumulate@%, 2, 1]]

enter image description here


3D选项

i = 0;
Prepend[Characters@"ATGCGTCGTAACGT" /. rls, {0, 0}];
Graphics[{Hue[i++/Length@%], Arrow@#} & /@ 
  Partition[Accumulate@%, 2, 1]]

enter image description here

i = 0;
Prepend[Characters@"ATGCGTCGTAACGT" /. 
    rls /. {x_, y_} :> {x, y, 0.3}, {0, 0, 0}];
Graphics3D[{Hue[i++/Length@%], Arrow@#} & /@ 
  Partition[Accumulate@%, 2, 1]]

enter image description here


现在我知道你想要什么,这是第一个函数的打包版本:

genePlot[s_String] :=
 Module[{rls},
  rls =
   {"A" -> { 1, 0},
    "T" -> {-1, 0},
    "G" -> {0,  1},
    "C" -> {0, -1}};
  Graphics[Arrow /@ Partition[#, 2, 1]] & @
   Accumulate @ Prepend[Characters[s] /. rls, {0, 0}]
]

像这样使用:

genePlot["ATGCGTCGTAACGT"]

答案 2 :(得分:16)

听起来你在谈论CGR,或者所谓的基因序列的混沌游戏表示。几个月前我在博客上发表了这篇文章: http://facstaff.unca.edu/mcmcclur/blog/GeneCGR.html

答案 3 :(得分:6)

假设序列S已经映射到*)到整数数组,那么基于规则R的实际运动计算是直截了当的:

R =
   1  -1   0   0
   0   0   1  -1
S =
   1   2   3   4   3   2   4   3   2   1   1   4   3   2
T= cumsum(R(:, S), 2)
T =
   1   0   0   0   0  -1  -1  -1  -2  -1   0   0   0  -1
   0   0   1   0   1   1   0   1   1   1   1   0   1   1

*)您需要详细说明实际序列。它是表示为单个字符串,还是表示为单元格数组,还是其他什么东西? 的修改
假设您的序列表示为字符串,那么您将它映射到整数序列S,如:

r= zeros(1, 84);
r(double("ATGC"))= [1 2 3 4];
S= r(double("ATGCGTCGTAACGT"))

并绘制它:

plot([0 T(1, :)], [0 T(2, :)], linespec)

其中linespec是所需的line specification

答案 4 :(得分:6)

您也可以尝试这样的事情......

RandomDNAWalk[seq_, path_] := 
 RandomDNAWalk[StringDrop[seq, 1], 
  Join[path, getNextTurn[StringTake[seq, 1]]]];

RandomDNAWalk["", path_] := Accumulate[path];

getNextTurn["A"] := {{1, 0}};
getNextTurn["T"] := {{-1, 0}};
getNextTurn["G"] := {{0, 1}};
getNextTurn["C"] := {{0, -1}};

ListLinePlot[
 RandomDNAWalk[
  StringJoin[RandomChoice[{"A", "T", "C", "G"}, 2000]], {{0, 0}}]]

答案 5 :(得分:0)

这个问题似乎已经得到了很好的回答,但我想我会补充一点,你所描述的内容之前已经在DNA walks的旗帜下以DNA序列的数字表示方法的集合出版了,在preprint

中讨论

事实证明,DNA走路在实践中并不是非常有用,但允许直观的可视化。我没有手头,但我想我的同事非常乐意提供用于生成下图的Matlab代码。

dna walk HIV