【问题标题】:chaos game for DNA sequencesDNA序列的混沌游戏
【发布时间】:2011-11-04 12:10:34
【问题描述】:

我已尝试使用mathematica 代码来制作此地址中发布的DNA 序列的混乱游戏: http://facstaff.unca.edu/mcmcclur/blog/GeneCGR.html

是这样的:

genome = Import["c:\data\sequence.fasta", "Sequence"];
genome = StringReplace[ToString[genome], {"{" -> "", "}" -> ""}];
chars = StringCases[genome, "G" | "C" | "T" | "A"];
f[x_, "A"] := x/2;
f[x_, "T"] := x/2 + {1/2, 0};
f[x_, "G"] := x/2 + {1/2, 1/2};
f[x_, "C"] := x/2 + {0, 1/2};
pts = FoldList[f, {0.5, 0.5}, chars];
Graphics[{PointSize[Tiny], Point[pts]}]

我拥有的 fasta 序列只是一个字母序列,例如 AACCTTTGATCAAA 并且要生成的图形是这样的:

该代码适用于小序列,但是当我想要放置一个巨大的序列时,例如几乎 40Mb 的染色体,该程序需要很多时间并且只显示一个黑色方块,因此无法分析。 是否可以改进上述代码,使其显示的正方形更大?顺便说一句,正方形必须只是正方形单位。 提前感谢您的帮助

【问题讨论】:

  • 您能否发布/链接到您的大型样本数据集,以便我们进行测试?
  • 40Mb 的 ASCII 染色体对于mathematica 来说似乎有很多字节可以按顺序咀嚼。这个问题看起来很容易使用 map/reduce 技术来解决。我不熟悉mathematica,但these functions appear to be available
  • @Manolo 查看我对答案的编辑
  • @Alexander 问题的本质不是迫使我们使用顺序解决方案吗?点n+1 的坐标是从点n 的坐标计算出来的,因此除了按顺序进行之外别无他法。除非有人为某些常见的字符序列预先计算转换函数(不是结果),但这听起来像是很多工作,如果可行的话。
  • 我们之前有一个关于 DNA 混沌游戏的问题:stackoverflow.com/q/5610265/615464

标签: wolfram-mathematica dna-sequence fasta chaos


【解决方案1】:

以下增量修改摘要:

这将使您在使用编译后的代码计算点坐标时显着加快(50 倍,不包括计算 shifts):

shifts = chars /. {"A" -> {0., 0.}, "T" -> {.5, 0.}, "G" -> {.5, .5}, "C" -> {0, .5}};
fun1d = Compile[{{a, _Real, 1}}, FoldList[#/2 + #2 &, .5, a], CompilationTarget -> "C"]
pts = Transpose[fun1d /@ Transpose[shifts]];

代码中的瓶颈实际上是渲染图形,我们不是绘制每个点,而是可视化点的密度:

threshold = 1;
With[{size = 300}, 
 Image[1 - UnitStep[BinCounts[pts, 1/size, 1/size] - threshold]]
]

如果一个区域至少有threshold 个点,则该区域将显示为黑色。 size 是图像维度。通过选择大尺寸或大阈值,您可以避免“黑色方块问题”。


我的原始答案包含更多细节:

在我相当过时的机器上,代码不是很慢。

chars = RandomChoice[{"A", "T", "C", "G"}, 800000];

f[x_, "A"] := x/2;
f[x_, "T"] := x/2 + {1/2, 0};
f[x_, "G"] := x/2 + {1/2, 1/2};
f[x_, "C"] := x/2 + {0, 1/2};
Timing[pts = FoldList[f, {0.5, 0.5}, chars];]
Graphics[{PointSize[Tiny], Point[pts]}]

我得到了 6.8 秒的计时,除非您需要在循环中多次运行它(如果它对您的用例和机器来说不够快,请添加评论,我们会尝试加快速度)。

不幸的是,渲染图形需要的时间比这长得多(36 秒),我不知道您是否可以对此做些什么。禁用抗锯齿可能会有所帮助,具体取决于您的平台,但作用不大:Style[Graphics[{PointSize[Tiny], Point[pts]}], Antialiasing -> False](对我来说没有)。这对我们许多人来说是一个长期的烦恼。

关于整个图形是黑色的,您可以使用鼠标调整它的大小并使其更大。下次评估表达式时,输出图形会记住它的大小。或者只是使用ImageSize -> 800 作为Graphics 选项。考虑到屏幕的像素密度,我能想到的唯一其他解决方案(不涉及调整图形大小)是使用灰色阴影表示像素密度,然后绘制密度。

编辑:

这就是您绘制密度的方法(这也比点图计算和渲染要快得多!):

With[{resolution = 0.01}, 
 ArrayPlot@BinCounts[pts, resolution, resolution]
]

调整分辨率以使情节更美好。

对于我的随机序列示例,这只给出了灰色图。对于您的基因组数据,它可能会提供更有趣的模式。

编辑 2:

这里有一个使用编译来加速函数的简单方法:

首先,将字符替换为移位向量(对于数据集只需执行一次,然后您可以保存结果):

arr = chars /. {"A" -> {0., 0.}, "T" -> {.5, 0.}, "G" -> {.5, .5}, "C" -> {0, .5}};

然后编译我们的函数:

fun = Compile[{{a, _Real, 2}}, FoldList[#/2 + #2 &, {.5, .5}, a], 
 CompilationTarget -> "C"]

如果您的 Mathematica 版本早于 8 或您没有安装 C 编译器,请删除 CompilationTarget

fun[arr]; // Timing

给了我 0.6 秒,这是一个瞬间 10 倍的加速。

编辑 3:

通过避免编译函数中的一些内核回调,与上述编译版本相比,可以再提高约 5 倍的速度(我使用 CompilePrint 检查了编译输出以提出这个版本 --- 否则不明显 为什么更快):

fun1d = Compile[{{a, _Real, 1}}, FoldList[#/2 + #2 &, .5, a], 
  CompilationTarget -> "C"]

arrt = Transpose[arr];
Timing[result = fun1d /@ arrt;]
pts = Transpose[result];

这在我的机器上运行了 0.11 秒。在更现代的机器上,即使是 40 MB 的数据集,它也应该在几秒钟内完成。

我将转置拆分为单独的输入,因为此时fun1d 的运行时间开始与Transpose 的运行时间相当。

【讨论】:

  • 非常感谢 Szabolcs,我已经尝试了使用编译的版本,它们的工作方式非常好,顺便说一下,您能否再解释一下为什么在上次更新中使用 Transpose。
  • 另外,我怎样才能为每个核苷酸 A、C、T、G 赋予不同的颜色;这将帮助我了解某些领域之间的差异。我刚开始使用 Mathematica,所以对于这个论坛的人们来说,这个问题可能会很容易。
  • @Manolo 你能解释一下你所说的“给每个人设置不同的颜色”是什么意思吗?您的意思是应该根据用于转换它们的核苷酸对这些点进行着色吗?这只会分别为情节的 4 个象限着色,所以也许你的意思是别的。
  • @Manolo 我使用Transposen 数字对列表转换为2 个长度-n 向量(x 和y 坐标),然后转换回来。由于Compile 的工作方式,单独处理 x 和 y 坐标将编译为比一起处理更快的代码。这是因为我无法告诉 Compile 输入是数字对向量。我只能告诉它输入是 2 阶张量(矩阵),它生成的代码针对通用大小的矩阵进行了优化,而不是 n by 2 矩阵(我们有)。
  • 感谢您的回复@Szabolcs,我希望图表看起来像这样:3.bp.blogspot.com/-LwD3K4qfUrA/TjzFa8HBbZI/AAAAAAAAAF0/… 这意味着例如,当字母为 A 时,它会将其着色为蓝色,C 为绿色,然后很快。我怎么能这样做?另一件事我将把程序的最终版本与你告诉我的修改放在此处,速度降低了,对于大序列,大约 25 Mb 的压缩数据就像 30 分钟,但对于更长的序列,mathematica 的内核会关闭,可能是内存不足。
猜你喜欢
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2020-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多