ora demo
从零实现一个教学版 GSEA并对应项目中的两种基因排序方法。 运行python Learn/gsea_from_scratch.py 依赖numpy、pandas、matplotlib 输出Learn/gsea_output/gsea_results.tsv 和 enrichment_curves.png 说明本代码用于理解算法。正式分析应使用 clusterProfiler、fgsea 或 gseapy 因为成熟工具对置换策略、并列值、NES 和多重检验有更完整的处理。 from pathlib import Path from math import erfc import matplotlib matplotlib.use(Agg) import matplotlib.pyplot as plt import numpy as np import pandas as pd SEED 20260719 def make_demo_data(n_genes500, seedSEED): 构造一份可重复的差异表达表和三个容易观察的基因集。 rng np.random.default_rng(seed) genes np.array([fGene_{i:03d} for i in range(1, n_genes 1)]) log2fc rng.normal(0, 0.7, n_genes) # 人为制造两个生物学信号前 25 个上调随后 25 个下调。 log2fc[:25] 2.5 log2fc[25:50] - 2.5 z log2fc / 0.7 rng.normal(0, 0.5, n_genes) pvalue np.fromiter( (erfc(value / np.sqrt(2)) for value in np.abs(z)), dtypefloat, countn_genes ).clip(1e-300, 1.0) de pd.DataFrame({gene_symbol: genes, log2fc: log2fc, pvalue: pvalue}) gene_sets { UP_PATHWAY: set(genes[:25]), DOWN_PATHWAY: set(genes[25:50]), RANDOM_PATHWAY: set(rng.choice(genes[50:], size25, replaceFalse)), } return de, gene_sets def rank_genes(de, methodsigned_logp): 生成降序排列的基因列表对应 04_enrichment.R 的 rank 计算。 data de.dropna(subset[gene_symbol, log2fc, pvalue]).copy() if method signed_logp: # 上调为正、下调为负P 越小分数绝对值越大。 data[rank_score] np.sign(data[log2fc]) * -np.log10( data[pvalue].clip(lower1e-300) ) elif method log2fc: data[rank_score] data[log2fc] else: raise ValueError(method 必须是 signed_logp 或 log2fc) # 同名基因保留绝对排名分数最大的一条与 R 脚本的处理一致。 data[abs_score] data[rank_score].abs() data data.sort_values(abs_score, ascendingFalse).drop_duplicates(gene_symbol) return data.sort_values(rank_score, ascendingFalse)[[gene_symbol, rank_score]] def enrichment_score(ranked, gene_set, weight1.0): 计算加权运行和及 ESES 是运行和偏离 0 最远的位置。 genes ranked[gene_symbol].to_numpy() scores ranked[rank_score].to_numpy() hits np.isin(genes, list(gene_set)) n_hit, n_total int(hits.sum()), len(genes) if n_hit 0 or n_hit n_total: raise ValueError(基因集与排序列表的交集必须非空且不能覆盖全部基因) hit_weights np.abs(scores[hits]) ** weight # 命中时按排名权重上升未命中时均匀下降。最终运行和应回到 0。 increments np.full(n_total, -1.0 / (n_total - n_hit)) increments[hits] hit_weights / hit_weights.sum() running np.cumsum(increments) max_i, min_i int(np.argmax(running)), int(np.argmin(running)) es running[max_i] if abs(running[max_i]) abs(running[min_i]) else running[min_i] peak_i max_i if es 0 else min_i # 正 ES 的 leading edge 位于峰值之前负 ES 位于谷值之后。 leading genes[: peak_i 1][hits[: peak_i 1]] if es 0 else genes[peak_i:][hits[peak_i:]] return float(es), running, hits, leading def permutation_test(ranked, gene_set, n_perm500, seedSEED): 随机抽取相同大小的基因集得到零分布、名义 P 值和 NES。 rng np.random.default_rng(seed) observed, running, hits, leading enrichment_score(ranked, gene_set) genes ranked[gene_symbol].to_numpy() null_es np.empty(n_perm) for i in range(n_perm): random_set set(rng.choice(genes, sizelen(gene_set), replaceFalse)) null_es[i] enrichment_score(ranked, random_set)[0] same_sign null_es[null_es 0] if observed 0 else -null_es[null_es 0] observed_abs observed if observed 0 else -observed # 加 1 避免有限次置换产生 P0。 pvalue (1 np.sum(same_sign observed_abs)) / (1 len(same_sign)) nes observed / same_sign.mean() return observed, nes, pvalue, running, hits, leading, null_es def benjamini_hochberg(pvalues): 用 BH 方法把多个基因集的名义 P 值校正为 FDR。 pvalues np.asarray(pvalues, dtypefloat) order np.argsort(pvalues) ranked_p pvalues[order] adjusted ranked_p * len(pvalues) / np.arange(1, len(pvalues) 1) adjusted np.minimum.accumulate(adjusted[::-1])[::-1].clip(0, 1) result np.empty_like(adjusted) result[order] adjusted return result def run_demo(rank_methodsigned_logp, n_perm500): de, gene_sets make_demo_data() ranked rank_genes(de, rank_method) details, rows {}, [] for i, (name, genes) in enumerate(gene_sets.items()): result permutation_test(ranked, genes, n_permn_perm, seedSEED i) es, nes, pvalue, running, hits, leading, null_es result details[name] result rows.append({ pathway: name, size: int(hits.sum()), ES: es, NES: nes, pvalue: pvalue, leading_edge: ;.join(leading), }) results pd.DataFrame(rows) results[padj_BH] benjamini_hochberg(results[pvalue]) results results.sort_values(padj_BH) return ranked, results, details def plot_curves(ranked, results, details, output_file): 画出经典 GSEA 图运行富集分数、命中刻线和排名统计量。 fig, axes plt.subplots(3, 1, figsize(10, 8), sharexTrue, gridspec_kw{height_ratios: [3, 0.7, 1.4]}) colors {UP_PATHWAY: #C43D3D, DOWN_PATHWAY: #2878A5, RANDOM_PATHWAY: #666666} for pathway in results[pathway]: es, nes, _, running, hits, *_ details[pathway] axes[0].plot(running, colorcolors[pathway], labelf{pathway} NES{nes:.2f}) axes[1].vlines(np.flatnonzero(hits), 0, 1, colorcolors[pathway], alpha0.65, linewidth0.7) axes[0].axhline(0, colorblack, linewidth0.7) axes[0].set_ylabel(Running ES) axes[0].legend(frameonFalse) axes[1].set_yticks([]) axes[1].set_ylabel(Hits) axes[2].plot(ranked[rank_score].to_numpy(), color#333333, linewidth0.9) axes[2].axhline(0, color#999999, linewidth0.7) axes[2].set_ylabel(Rank score) axes[2].set_xlabel(Genes ordered from high to low rank score) fig.suptitle(GSEA from scratch: enrichment along a ranked gene list) fig.tight_layout() fig.savefig(output_file, dpi160, bbox_inchestight) plt.close(fig) def main(): output_dir Path(__file__).resolve().parent / gsea_output output_dir.mkdir(exist_okTrue) ranked, results, details run_demo(rank_methodsigned_logp, n_perm500) results.to_csv(output_dir / gsea_results.tsv, sep\t, indexFalse) ranked.to_csv(output_dir / ranked_genes.tsv, sep\t, indexFalse) plot_curves(ranked, results, details, output_dir / enrichment_curves.png) print(\nGSEA 的逻辑) print(1. 用 signed_logp 或 log2fc 将所有基因从高到低排序。) print(2. 遇到通路基因时运行和上升否则下降最大偏离值就是 ES。) print(3. 随机基因集产生零分布计算 nominal PES 除以零分布均值为 NES。) print(4. 对多个通路的 P 值做 BH 校正得到教学版 padj_BH。\n) print(results[[pathway, size, ES, NES, pvalue, padj_BH]].to_string(indexFalse)) print(f\n结果已写入{output_dir}) if __name__ __main__: main()

相关新闻

跨网数据交换,安全与效率真的不能兼得吗?

跨网数据交换,安全与效率真的不能兼得吗?

2013年“棱镜门”事件曝光后,各国纷纷加强了网络隔离与数据安全管控。时至今日,政府、军工、金融、医疗等行业均建立了多级隔离网络——办公网、研发网、生产网、测试网各自独立,物理或逻辑上相互隔离。但业务运转偏偏需要数据在这些网络之间…

2026/7/24 7:55:40 阅读更多 →
抖店搬家上货品牌设置无品牌就安全了吗?走过路过别错过

抖店搬家上货品牌设置无品牌就安全了吗?走过路过别错过

抖店搬家上货品牌设置无品牌就安全了吗?走过路过别错过!很多抖店一件代发商家在进行商品搬家上货时,为规避品牌违规,都会统一把商品品牌属性改为无品牌。大部分人默认只要选了无品牌,就能避开侵权、违规扣分风险,高枕无忧批量上架…

2026/7/20 20:37:16 阅读更多 →
U盘管控软件推荐——安得卫士U盘管理系统

U盘管控软件推荐——安得卫士U盘管理系统

一个看似不起眼的U盘,可能成为企业数据安全的“阿喀琉斯之踵”。据统计,超过85%的数据泄露事件始于内部终端非法使用移动存储设备-3。核心技术图纸、财务报表、客户数据,可以被一个未经管控的U盘轻松拷走——防火墙、入侵检测等投入巨资的安全…

2026/7/22 0:43:43 阅读更多 →

最新新闻

华为昇腾AI服务器部署GPUStack全指南

华为昇腾AI服务器部署GPUStack全指南

1. 项目概述 在AI推理服务领域,如何高效管理和部署模型一直是企业面临的挑战。GPUStack作为开源的AI模型推理集群管理软件,与华为昇腾AI处理器的结合,为这一难题提供了优雅的解决方案。本文将详细介绍如何在华为昇腾IA服务器上部署GPUStack&a…

2026/7/24 9:57:19 阅读更多 →
从比亚迪海豹08爆款看供应链高并发与软件系统扩容技术

从比亚迪海豹08爆款看供应链高并发与软件系统扩容技术

如果你最近在关注新能源汽车市场,可能会发现一个有趣的现象:比亚迪海豹08上市后迅速成为爆款,但随之而来的却是"比亚迪又欠了一屁股的车"这样的调侃。这背后到底发生了什么?是产能跟不上需求,还是营销策略的…

2026/7/24 9:57:19 阅读更多 →
张正友相机标定法原理与OpenCV实践指南

张正友相机标定法原理与OpenCV实践指南

1. 项目概述 相机标定是计算机视觉领域的基础性工作,就像给相机做一次"体检",通过测量和计算确定相机的"视力参数"。张正友标定法作为最经典的标定方法之一,其巧妙之处在于仅需使用一个平面棋盘格图案,通过多…

2026/7/24 9:57:19 阅读更多 →
Agent智能体技术架构与行业应用实践

Agent智能体技术架构与行业应用实践

1. Agent智能体技术全景解析 Agent智能体技术正在重塑人机交互的边界。不同于传统程序化系统,智能体具备环境感知、自主决策和持续学习三大核心能力。我在实际工业场景中部署过多个智能体系统,发现其本质是通过模块化架构实现人类认知能力的数字化延伸。…

2026/7/24 9:57:19 阅读更多 →
腾讯云NPO超级节点与国产算力布局对AI开发的影响分析

腾讯云NPO超级节点与国产算力布局对AI开发的影响分析

最近和几个做 AI 应用的朋友聊天,大家普遍有个感受:现在跑个模型,租 GPU 的成本越来越像在交“算力税”。尤其是当你想用最新的卡、稳定的环境,或者需要批量处理任务时,账单上的数字总是不太友好。但就在上个月&#x…

2026/7/24 9:57:19 阅读更多 →
京东言犀大模型技术架构与电商应用解析

京东言犀大模型技术架构与电商应用解析

1. 京东大模型战略的行业背景解析2023年7月,京东正式对外公布其自研大模型"言犀"的研发进展,这一动作距离美团发布"WOW"大模型仅相隔三个月。作为国内电商第二梯队代表,京东此举绝非偶然。从行业视角来看,这标…

2026/7/24 9:56:18 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻