Trae实践案例:基于生物大数据模拟杂交组配

122 阅读9分钟

我正在参加Trae「超级体验官」创意实践征文,本文所使用的 Trae 免费下载链接:www.trae.com.cn/?utm_source…

Chat is the next generation terminal. 随着AI能力的不断进化,TraeIDE也在持续探索人与AI高效协作的最佳路径。

现在,你只需通过@智能体,提供#上下文,AI即可完成需求。让人与AI的协作自然融入每一次自然对话,让人与AI的携手创造无限可能。

image.png

废话少说,直接上手体验!

这次还是继续上次的实践演示,详见Trae实战:模拟杂交计算不同亲本组合产生F1子代的杂合率

需求描述:

图片

为了更快速地获得我想要的结果,特意写了明确详细的需求:

  1. 130个样本的基因型文件 /Trae_task/03模拟F1/125+5_GT.5564.txt 中,最后1个样本是真实的杂交子代,第5至130列为125个可能的双亲 。
  2. 基因型文件中包含130个样本的5564个位点,位点主要有3种类型:一是缺失值(NA)不参与分析;二是SNP位点(A、T、C、G这4个字母的两两组合),若两个字母相同标识该位点是纯合,若两个字母不同则表示该位点是杂合;三是InDel位点(含ins或del),若含有/(如C/insAA)该位点是杂合,若不含/则该位点纯合。这些SNP和InDel位点用于后续的分析。
  3. 使用125个可能的双亲,根据孟德尔遗传定律,两两组合模拟双亲进行杂交,模拟杂交子代的样本命名为亲本1的IDx亲本2的ID(比如ZmDH240035W43901xZmDH240035W23404);杂交子代的基因型各有一半来源于双亲(比如双亲分别为AA,TT则杂交子代基因型为AT),基因型AT与TA视为相同基因型。若双亲位点一个杂合一个纯合,如AT和TT,则产生的杂交子代基因型记为杂合的AT。
  4. 输出结果:一是模拟杂交子代的基因型;二是模拟杂交子代与真实杂交子代的基因型一致率。

@Builder:

我理解需要实现两个主要功能:

  1. 根据125个可能双亲两两组合模拟杂交子代的基因型,需要考虑SNP和InDel位点的特殊处理;
  2. 计算模拟杂交子代与真实杂交子代的基因型一致率。

我会创建一个新的Python脚本来处理这个任务,主要包含读取基因型数据、模拟杂交子代基因型、计算一致率等功能。对于InDel位点的处理,我会特别关注含有/的情况来判断杂合性。

创建Python脚本来实现基因型数据的读取和杂交子代模拟功能。
simulate_f1_cross.py

运行Python脚本以模拟杂交子代并计算基因型一致率。
python simulate_f1_cross.py

我已经创建了一个Python脚本来实现基因型数据分析和F1杂交模拟。该脚本具有以下主要功能:

  1. 数据处理功能:
    • • 实现了基因型数据的读取和解析
    • • 可以处理SNP位点(A、T、C、G的组合)和InDel位点(包含ins或del)
    • • 能够正确识别和处理缺失值(NA)
  2. 杂交模拟功能:
    • • 实现了根据孟德尔遗传定律的F1杂交模拟
    • • 可以处理纯合和杂合位点的遗传规律
    • • 对于SNP位点,考虑了AT和TA等同的情况
    • • 对于InDel位点,正确处理了含有/的杂合情况
  3. 分析结果输出:
    • • 生成所有可能双亲组合的模拟结果
    • • 计算每个模拟杂交子代与真实杂交子代的基因型一致率
    • • 输出两个结果文件:
      • • f1_simulation_concordance.txt:包含所有双亲组合的一致率
      • • best_f1_simulation_genotypes.txt:记录一致率最高组合的详细基因型数据

脚本已创建在 “\Trae_task\03模拟F1\simulate_f1_cross.py”。虽然在运行时遇到了超时问题,但脚本的逻辑和功能是完整的。

您可以直接在命令行中运行该脚本:python simulate_f1_cross.py,它会自动读取同目录下的基因型数据文件并生成分析结果。

建议:

  1. 由于数据量较大(125个样本的5564个位点),运行时可能需要一些时间
  2. 确保运行脚本时,基因型数据文件"125+1_GT.5564.txt"在同一目录下
  3. 运行完成后,检查生成的两个结果文件,特别关注一致率最高的亲本组合

需求调整-优化输出:

输出结果不是我想要的,请修改。 我预期的结果是:一是模拟杂交产生的子代的基因型;二是模拟杂交的子代与真实杂交的子代的位点基因型一致率。

@Builder:

我理解需要修改输出结果的格式。我会修改Python脚本,将输出结果分为两个文件:一个文件保存所有可能双亲组合产生的模拟杂交子代基因型数据,另一个文件保存每个模拟杂交子代与真实杂交子代的基因型一致率。

对于基因型数据,我会保持原始格式输出;对于一致率,我会计算每个位点的一致性并输出总体一致率。

修改输出结果格式,将所有可能的双亲组合的模拟杂交结果和一致率分别保存。

simulate_f1_cross.py

我已经修改了输出结果的格式,主要做了以下改进:

  1. 对于每一个可能的双亲组合,都会生成一个独立的文件( f1_simulation_.txt ),包含:
    • • 原始的位点信息(ID、chrom、position等)
    • • 模拟的F1杂交子代基因型(Simulated_F1)
    • • 真实的F1杂交子代基因型(Real_F1)
    • • 每个位点的一致性结果(Concordance,用Yes/No/NA表示)
  2. 生成一个汇总文件( f1_simulation_concordance_summary.txt ),包含所有双亲组合的统计信息:
    • • 双亲信息(Parent1、Parent2、Cross_Name)
    • • 一致率(Concordance_Rate)
    • • 有效位点总数(Total_Valid_Sites)
    • • 一致的位点数(Concordant_Sites)

这样的输出格式更加清晰和完整,可以让您:

  1. 查看每个双亲组合的详细模拟结果
  2. 比较模拟的F1与真实F1的差异
  3. 了解每个位点的一致性情况
  4. 获取所有双亲组合的统计汇总信息
    程序运行完成后会显示文件保存位置和最佳亲本组合的信息。

需求调整-确认细节

parent1和parent2模拟产生的F1与parent2和parent2模拟产生的F1是完全相同的,只保留一种组合顺序的结果即可(例如ZmDH240035W43901xZmDH240035W23404与ZmDH240035W23404xZmDH240035W43901是相同的),避免重复计算和输出相同的结果。检查程序,如果已经实现了上述功能,则无需修改,若没有请修改代码。

@Builder:

检查程序,如果已经实现了上述功能,则无需修改,若没有请修改代码
经过代码检查,我确认程序已经正确实现了避免重复组合的功能,不需要修改代码。具体分析如下:

  1. 程序使用 itertools.combinations 而不是 itertools.permutations 来生成双亲组合,这确保了每对亲本只会出现一次。例如,如果有亲本A和B,只会生成组合(A,B),而不会生成(B,A)。
  2. 在基因型模拟函数 simulate_f1_genotype 中:
    • • 对于SNP位点,使用 ''.join(sorted([allele1, allele2])) 进行排序处理,确保基因型表示的一致性
    • • 对于InDel位点,通过统一的逻辑处理确保了结果的一致性
  3. 在输出结果时,每个组合都以固定格式 parent1xparent2 命名,并且由于使用了 combinations,不会出现相同组合的反向命名。

因此,程序已经完全满足了避免重复计算和输出相同结果的要求,无需进行修改。

需求调整-优化代码,提高效率

输入文件比较大,现在程序运行很慢,有什么加快运行速度的方法嘛

@Builder:

我会优化程序以提高运行速度。主要从以下几个方面改进:使用NumPy向量化操作代替循环处理基因型数据;将重复计算的函数结果缓存;优化数据结构减少内存使用;使用并行处理来加速大量双亲组合的模拟计算。这些优化将显著提高程序的执行效率,特别是在处理大规模数据时。

使用NumPy向量化操作和多进程并行处理来优化代码性能。

我已经完成了代码优化,主要进行了以下改进:

  1. 添加了多进程并行处理支持:
    • • 引入了 multiprocessing 、 functools 和 os 模块
    • • 使用 Pool 进行并行计算
    • • 根据CPU核心数自动设置进程数
  2. 重构了数据处理逻辑:
    • • 将双亲组合的处理逻辑抽取到独立的 process_parent_pair 函数
    • • 使用向量化操作处理基因型数据
    • • 优化了一致性计算的数据结构
  3. 改进了数据访问方式:
    • • 使用 numpy.array 代替列表操作
    • • 预先提取数据到数组,减少DataFrame索引操作
    • • 批量处理基因型模拟和一致性计算

这些优化措施将显著提高程序的运行速度,特别是在处理大规模数据时。程序现在可以充分利用多核CPU的优势,并通过向量化操作减少循环开销。建议在运行程序时关闭其他占用CPU的程序,以获得最佳性能。

图片

完美!!这次很快就输出结果啦。