想象你是这座城市的交通规划师。台风季将至,市长要求你提前预测:哪些市民最容易在下班路上迷路?你派出几百名测绘员,拿着测量尺在全城逐街记录——每个路牌歪了几度、哪个路口缺了指示、哪里新立了警示牌。几天后,你得到一张巨细无遗的“路牌地图”。 这套操作,在基因组学里叫 GWAS(全基因组关联分析):把人类基因组当作城市,把每个 SNP(单核苷酸多态性)当作路牌,大规模比较“迷路的人”(病例)与“从不迷路的人”(对照)身上路牌的差异。 可你很快发现:真正让人迷路的,往往不是某一个路牌,而是上千个路牌各偏一点,再叠加暴雨、堵车、手机没电这些环境因素。你把所有路牌影响加总成一张“迷路风险积分”(PRS),却沮丧地发现——它只能把人群粗略分成“略高危”和“略低危”,根本无法精准点名。 问题出在哪?统计噪音、人群偏差、环境交互、疾病自身的复杂性……每个环节都在给这张地图画边界。本文就用这张城市地图,带你逐层看清 GWAS 与 PRS 的能力边界。

岗位关联

理解 GWAS 与 PRS 的能力边界,是精准医疗与药物基因组学算法工程师的基本功——交付模型时不夸大效果,部署前做好跨人群校准与验证。

目录
  1. 可视化演示
  2. GWAS 基本原理
  3. 复杂疾病特性
  4. 统计局限
  5. 人群代表性不足
  6. PRS 预测瓶颈
  7. 改进方向
  8. 理性看待边界
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

演示GWAS与PRS在复杂疾病风险预测中的统计局限、人群代表性不足与改进方向,侧边指标实时联动。

本节配有交互动效(进入视口后自动加载,约 3KB)。

统计局限 效应微小 遗漏 h²=Σβ² 单变异效应微小且解释率有限

GWAS 基本原理

测绘队正式开工了。他们兵分两路:一路跟在“暴雨中真正迷过路的人”(病例组)身后,另一路跟着“从未迷过路的人”(对照组)。每经过一个路牌,就记下它的位置和状态;最后对比两组人身边路牌的差异。这种成千上万人规模的“路牌普查”,学术上叫全基因组关联分析(GWAS)——把路牌换成基因组上的单核苷酸多态性(SNP,即每个人基因组上可能不同的单个碱基位点),把迷路换成疾病。

技术上,GWAS 同时扫描全基因组约一百万个常见 SNP,逐一比较它们在病例组与对照组中的等位基因频率。某个 SNP 在病例里明显更常见,就说它“与疾病关联”。但“明显更常见”不能靠肉眼判断,必须用统计检验排除“纯属巧合”的可能。

最经典的检验是卡方检验:把每个 SNP 的携带情况整理成一张 2×2 列联表,比较“观测到的病例携带人数”与“假设毫无关联时理论上的期望人数”。

测绘任务的第一阶段结束,手上多了一张布满候选路牌的城市图。但请注意:频繁出现在迷路人身边的路牌,未必就是迷路的原因——它可能只是与真正作怪的“坏路灯”住在同一条街上的邻居。这个“邻居效应”在遗传学里叫连锁不平衡(LD),它决定了 GWAS 的产出永远是“线索清单”,而不是“因果定论”。

χ2=∑i=1k(Oi−Ei)2Ei\displaystyle \chi^2 = \sum_{i=1}^{k} \frac{(O_i - E_i)^2}{E_i}
卡方值衡量“观测关联”与“无关假设”之间的偏差大小;偏差越大,这个路牌与疾病越可能是真相关。但注意,这只是一次检验的结果。
  1. 观测频数 \(O_i\)在病例组中实际数到的携带某等位基因的人数,对应测绘员在迷路人身边数到的路牌数量。
    OiO_i
  2. 期望频数 \(E_i\)假设该 SNP 与疾病毫无关系时,理论上应该出现的携带人数,由行、列边际总数推算。
    Ei=行总和×列总和nE_i = \frac{\text{行总和} \times \text{列总和}}{n}
  3. 偏差平方归一把观测与期望的差平方后除以期望,既放大偏差又消除量纲影响。
    (Oi−Ei)2Ei\frac{(O_i - E_i)^2}{E_i}
  4. 求和判读把所有分组的偏差加总得到 \(\chi^2\),数值越大,关联信号越强。
    χ2=∑i=1k(Oi−Ei)2Ei\chi^2 = \sum_{i=1}^{k} \frac{(O_i - E_i)^2}{E_i}

复杂疾病特性

城市交通专家很快发现一个尴尬的事实:绝大多数迷路事件,无法归咎于某个单独的路牌。有人迷路是因为三四个路牌各歪了几度,加上那天下暴雨、手机没电、又赶上临时封路。高血压、2 型糖尿病、精神分裂这类复杂疾病正是如此——它们不像亨廷顿舞蹈症那样由单个基因主宰,而是数百上千个微效基因变异与环境因素共同拉扯的结果。

为了描述这种“多因素拉扯”,遗传学引入易感阈模型:每个个体体内有一个看不见的“易感值”,由所有遗传微效与环境噪声累积而成;只有当这个值超过某个发病门槛时,疾病才会显现。这就像一个人被无数小箭头推着走,每支箭头都只推一点点,但合力可能把他推过那条“患病线”。

易感阈模型的数学表达如下:

所以,一张只标注路牌的地图,天然预测不了暴雨。GWAS 的使命是记录“遗传路牌”,它能解释的天花板从一开始就被疾病的遗传力与复杂性限定。这也是为什么后续所有局限讨论,都绕不开“复杂疾病”这四个字。

yi=∑j=1mβjxij+εi,发病=I(yi>T)\displaystyle y_i = \sum_{j=1}^{m} \beta_j x_{ij} + \varepsilon_i, \quad \text{发病} = \mathbb{I}(y_i > T)
每个个体有一个潜在的“易感值”,等于所有微效基因贡献加环境噪声;易感值超过阈值 T 才发病。
  1. 个体易感值 \(y_i\)第 \(i\) 个人看不见的“迷路倾向”,是遗传与环境的总账。
    yiy_i
  2. 遗传贡献项\(m\) 个 SNP 各自的微弱效应 \(\beta_j\) 乘上基因型 \(x_{ij}\) 后累加,相当于把所有路牌的偏转角度加总。
    ∑j=1mβjxij\sum_{j=1}^{m} \beta_j x_{ij}
  3. 环境噪声 \(\varepsilon_i\)暴雨、堵车、心情波动等随机因素,无法由基因型预测。
    εi\varepsilon_i
  4. 阈值判断易感值超过门槛 \(T\) 才发病,\(\mathbb{I}\) 是指示函数,满足条件取 1,否则取 0。
    I(yi>T)\mathbb{I}(y_i > T)

统计局限

测绘队接着撞上了一堵墙:他们要在一百万个路牌上逐一回答同一个问题——“这个路牌和迷路有关吗?”如果每个问题都按日常标准(5% 犯错率)下结论,哪怕这座城市根本没有任何路牌出错,也会有约五万个路牌被冤枉成“问题路牌”。这就是多重检验带来的假阳性爆炸:问得越多,瞎猫碰上死耗子的事必然越多。

对策是收紧标准:把“整张地图最多允许 5% 假警报”的预算,均摊到一百万个路牌上。这就是 Bonferroni 校正:

代价随之而来:阈值越严,真正微弱的路牌越容易被漏掉。要探测 OR 仅 1.1 的微效位点且通过 5×10⁻⁸ 的关卡,需要数万到数十万人的样本;即便样本凑齐,全基因组显著位点能解释的遗传度,仍然远低于双胞胎研究估计的遗传力——这就是著名的“缺失遗传力”之谜。换句话说,越严格的地图绘制标准,越容易漏掉那些“每个只差一点点”的平凡路牌;而多基因疾病的真相,恰恰藏在千千万万个平凡路牌里。

α′=αm=0.05106≈5×10−8\displaystyle \alpha' = \frac{\alpha}{m} = \frac{0.05}{10^6} \approx 5 \times 10^{-8}
5×10⁻⁸ 这个 GWAS 常用阈值,本质是把 5% 的“总犯错预算”分给约一百万个 SNP,单个路牌只有拿到极强证据才能过关。
  1. 名义显著性 \(\alpha\)我们允许整张地图最多出现 5% 的假路牌。
    α=0.05\alpha = 0.05
  2. 检验次数 \(m\)全基因组中需要检验的常见路牌数量,约一百万个。
    m≈106m \approx 10^6
  3. 均摊阈值把总预算平均分给每个路牌,得到单个检验的显著标准。
    α′=0.05106≈5×10−8\alpha' = \frac{0.05}{10^6} \approx 5 \times 10^{-8}

人群代表性不足

更麻烦的问题出在地图的地域性。过去十几年,绝大多数 GWAS 样本来自欧洲裔人群——相当于测绘队只在北京城仔细量过路牌,却拿着这张图给上海、东京、拉各斯的市民发导航。这种“欧洲人群偏倚”,让所谓“全球遗传风险预测”从一开始就站不稳。

遗传学上,不同人群的等位基因频率不同,连锁不平衡(LD)模式也大相径庭。某个欧洲人群里与疾病强关联的 SNP,到了东亚或非洲人群里,可能与真正的因果位点“失去邻居关系”——权重骤然失效。跨人群的预测力损失可以这样粗略描述:

现实数据非常残酷:欧洲训练的 PRS 在非欧洲人群中预测力普遍腰斩,部分疾病从 AUC≈0.70 跌到 0.55 附近,逼近抛硬币。这还带来公平性争议——明明最需要精准医疗的人群,反而因为队列单一而被服务得最差。地图的地域性决定了导航的边界:想让 PRS 普惠全球,第一步是把测绘范围扩展到每一个肤色与祖先背景。

R跨人群2≈R原人群2×ρ2\displaystyle R^2_{\text{跨人群}} \approx R^2_{\text{原人群}} \times \rho^2
跨人群应用时,模型的解释力要乘以两个人群遗传相关性的平方。相关性越低,缩水越狠。
  1. 原人群解释力 \(R^2_{\text{原}}\)模型在欧洲训练队列中能解释的遗传变异比例。
    R原2R^2_{\text{原}}
  2. 遗传相关性 \(\rho\)两个人群在风险位点频率与 LD 结构上的相似程度,取值 0 到 1,约等于 0 时路牌关系完全不同。
    ρ\rho
  3. 平方缩放等位基因频率与 LD 结构双重变化,使解释力按 \(\rho^2\) 衰减。
    R跨人群2≈R原2×ρ2R^2_{\text{跨人群}} \approx R^2_{\text{原}} \times \rho^2

PRS 预测瓶颈

假设测绘队已经尽力,接下来要把地图变成一张“迷路积分卡”:对每个人,把他携带的所有风险路牌按严重程度加权加总,得到一个总分。这就是多基因风险评分(PRS)。

问题在于,这张积分卡在个体层面实在太钝。用 AUC 衡量排序能力,复杂疾病的 PRS 通常只有 0.6 左右——随机抽一个病人和一个健康人,只有 60% 的概率病人分数更高。病例与对照的 PRS 分布高度重叠,再加上“多高算高风险”的阈值没有统一标准,PRS 与年龄、血压、家族史等临床指标结合时的边际贡献常常很小。积分卡能粗分人群,却点不了名——对于“你到底会不会得病”这个问题,它给不出令人放心的答案。

PRSi=∑j=1Kβ^j⋅xij\displaystyle \text{PRS}_i = \sum_{j=1}^{K} \hat{\beta}_j \cdot x_{ij}
PRS 的本质是把 K 个风险位点的“基因剂量 × 估计效应量”累加成一个数字,数字越高,遗传风险越高。
  1. 基因剂量 \(x_{ij}\)第 \(i\) 个人在第 \(j\) 个位点上携带的风险等位基因数,通常是 0、1、2。
    xij∈{0,1,2}x_{ij} \in \{0, 1, 2\}
  2. 效应估计 \(\hat{\beta}_j\)从 GWAS 汇总统计中估计出的第 \(j\) 个 SNP 权重。
    β^j\hat{\beta}_j
  3. 加权求和把 K 个位点的贡献乘加,得到该个体的分数。
    PRSi=∑j=1Kβ^jxij\text{PRS}_i = \sum_{j=1}^{K} \hat{\beta}_j x_{ij}

改进方向

既然单一“路牌地图”不够用,城市管理者决定升级为“城市大脑”:不再只看静态路牌,而是接入实时交通流量、天气预报、路面修缮计划、司机疲劳度……对应到遗传学,就是从单一基因型快照,升级为多组学与环境的多维风险画像。

技术落点有三个:其一是多组学整合,把转录组、甲基化、蛋白组等“分子路况”纳入模型;其二是跨种族多样性队列,建立覆盖非洲、东亚、南亚等祖先背景的训练数据;其三是机器学习建模,让算法自动捕捉基因-基因、基因-环境的非线性交互。形式上,改进后的风险模型可以写成:

这些方向的共同点,是把“单一静态遗传快照”升级为“动态多维风险画像”。从静态地图到动态导航,预测力的提升不再只靠堆样本,而靠换维度——但也要清醒:维度再多,也改变不了复杂疾病本身的随机性与遗传力天花板。

y^i=fML(X基因,X表达,X甲基化,X环境)\displaystyle \hat{y}_i = f_{\text{ML}}\left(X_{\text{基因}}, X_{\text{表达}}, X_{\text{甲基化}}, X_{\text{环境}}\right)
改进方向的核心,是用非线性模型把多种组学与环境信号“揉”在一起,拟合传统线性模型看不见的交互作用。
  1. 基因型矩阵 \(X_{\text{基因}}\)传统的路牌信息,即 SNP 基因型。
    X基因X_{\text{基因}}
  2. 分子组学 \(X_{\text{表达}}, X_{\text{甲基化}}\)道路的实时流量与路面状态,即基因表达与表观修饰。
    X表达,X甲基化X_{\text{表达}}, X_{\text{甲基化}}
  3. 环境暴露 \(X_{\text{环境}}\)天气预报与施工公告,即生活方式、污染物、药物等暴露。
    X环境X_{\text{环境}}
  4. 非线性函数 \(f_{\text{ML}}\)机器学习模型自动组合上述特征,捕捉“组合拳”式的交互效应。
    fML(⋅)f_{\text{ML}}(\cdot)

理性看待边界

城市下发最终提醒:地图永远只是工具,不是神谕。即使未来模型 AUC 拉到 0.75,也仍然有近一半的个体无法被准确点名。PRS 更适合指导“人群分层”——谁该更早筛查、谁该更积极干预——而不是“个体判命”。

用数学语言说,AUC 的含义是“随机抽一对病例与对照,病例分数更高的概率”:

临床应用必须守住三条红线:其一,任何 PRS 进入临床前要在前瞻性队列中验证,并与现有临床风险模型比较增量价值;其二,跨人群使用必须先重校准;其三,伦理上要防止保险歧视、过度医疗与“基因宿命论”造成的心理伤害。认清地图的边界,才能把地图用得更好——知道它不能做什么,才知道该在哪儿相信它。

AUC=P(Score病例>Score对照)≈0.6\displaystyle \text{AUC} = P(\text{Score}_{\text{病例}} > \text{Score}_{\text{对照}}) \approx 0.6
AUC 是配对排序正确的概率。0.6 意味着只比抛硬币(0.5)好 10 个百分点,个体区分度极为有限。
  1. 配对比较随机抽取一个病例和一个对照,比较两者的 PRS。
    P(Score病例>Score对照)P(\text{Score}_{\text{病例}} > \text{Score}_{\text{对照}})
  2. 概率即 AUC这个排序正确的概率就是 AUC 值。
    AUC≈0.6\text{AUC} \approx 0.6
  3. 对照随机水平随机猜测的 AUC 是 0.5,0.6 的增量只有 0.1。
    0.6−0.5=0.10.6 - 0.5 = 0.1

AI 应用场景

药物基因组学中的用药剂量辅助

阶段:模型构建与预测

解决的问题:华法林等药物个体剂量差异大,传统固定剂量易导致出血或血栓。PRS 把多个药物代谢相关位点聚合成剂量评分,辅助临床初始剂量选择;但因训练人群单一,非欧洲患者必须先做本地校准。

具体案例:某临床决策系统给患者输出“华法林预测维持剂量”,对欧洲裔患者 AUC 达 0.67;直接套用于中国患者后 AUC 掉到 0.58,经东亚队列重训后回升至 0.64——“带地图跨城市”必须重绘局部路牌。

复杂疾病早筛风险分层

阶段:风险评估与分层

解决的问题:乳腺癌、冠心病等筛查资源有限,无法人人做高成本检查。PRS 可把人群粗略分为低、中、高风险带,指导筛查频率与起始年龄;但它不能单独确诊,必须与影像、生化标志物结合。

具体案例:某健康管理公司用 PRS + 家族史 + 血压把 40 岁以上人群分成三层,高危层乳腺癌检出率提升 2.3 倍,同时避免了给全人群做 MRI 的巨额成本——PRS 做“漏斗入口”,而非“最终判决”。

跨种族遗传咨询与公平性审查

阶段:模型评估与伦理校验

解决的问题:直接拿欧洲 PRS 给亚洲、非洲用户解读,会产生系统性高估或低估。需要做人群归因分析、重新校准与公平性指标审计。

具体案例:某基因检测公司在自有东亚队列上复算七款公开 PRS,发现两款跨种族 AUC 下降超 0.1,于是放弃原阈值,改用本地百分位重新定义“高风险”,并在报告中明确标注模型适用人群。

Python 演示

python109 行
import random random.seed(42)  def simulate_population(n, freq_shift):    """生成 n 个样本, 60 个 SNP 的基因型矩阵 (0/1/2)."""    geno = []    for _ in range(n):        row = []        for k in range(60):            p = max(0.02, min(0.98, 0.3 + k * 0.006 + freq_shift))            row.append((1 if random.random() < p else 0) +                       (1 if random.random() < p else 0))        geno.append(row)    return geno  def make_liability(geno, betas, env_sd):    """易感性 = 遗传效应累加 + 环境噪声."""    y = []    for row in geno:        g = sum(b * g_ij for b, g_ij in zip(betas, row))        y.append(g + random.gauss(0, env_sd))    return y  def make_phenotype(y, prevalence):    """按患病率切出病例(1)与对照(0)."""    threshold = sorted(y)[int(len(y) * (1 - prevalence))]    return [1 if v >= threshold else 0 for v in y]  def assoc_score(geno, pheno):    """每个 SNP 做 2x2 卡方检验, 返回关联强度分."""    scores = []    for k in range(len(geno[0])):        a = b = c = d = 0        for i, row in enumerate(geno):            carry = 1 if row[k] > 0 else 0            if pheno[i] == 1 and carry == 1:                a += 1            elif pheno[i] == 1:                b += 1            elif carry == 1:                c += 1            else:                d += 1        n = a + b + c + d        denom = (a + b) * (c + d) * (a + c) * (b + d)        if denom == 0:            scores.append(0.0)        else:            scores.append(n * (a * d - b * c) ** 2 / denom)    return scores  def effect_sign(geno, pheno, k):    """病例中频率高于对照则效应为正, 否则为负."""    n_case = sum(pheno)    n_ctrl = len(pheno) - n_case    fc = sum(row[k] / 2 for i, row in enumerate(geno)             if pheno[i] == 1) / n_case    fh = sum(row[k] / 2 for i, row in enumerate(geno)             if pheno[i] == 0) / n_ctrl    return 1.0 if fc > fh else -1.0  def prs(geno, weights, top_k=10):    """取关联最强的 top_k 个 SNP 加权求和."""    idx = sorted(range(len(weights)),                 key=lambda j: -abs(weights[j]))[:top_k]    return [sum(weights[j] * row[j] for j in idx) for row in geno]  def calc_auc(scores_case, scores_ctrl):    """用病例秩和估算 AUC."""    merged = sorted(scores_case + scores_ctrl)    r_sum = sum(merged.index(s) + 1 for s in scores_case)    n1 = len(scores_case)    n2 = len(scores_ctrl)    return (r_sum - n1 * (n1 + 1) / 2) / (n1 * n2)  betas = [0.08 if k % 3 == 0 else 0.02 for k in range(60)]eu_geno = simulate_population(800, 0.0)eu_y = make_liability(eu_geno, betas, 1.2)eu_pheno = make_phenotype(eu_y, 0.25) half = len(eu_geno) // 2tr_geno, tr_pheno = eu_geno[:half], eu_pheno[:half]va_geno, va_pheno = eu_geno[half:], eu_pheno[half:]asso = assoc_score(tr_geno, tr_pheno)weights = [asso[k] * effect_sign(tr_geno, tr_pheno, k) for k in range(60)] case_va = prs([row for i, row in enumerate(va_geno)               if va_pheno[i] == 1], weights)ctrl_va = prs([row for i, row in enumerate(va_geno)               if va_pheno[i] == 0], weights)print("欧洲人群内部验证 AUC:", round(calc_auc(case_va, ctrl_va), 3)) cn_geno = simulate_population(800, 0.25)cn_y = make_liability(cn_geno, betas, 1.2)cn_pheno = make_phenotype(cn_y, 0.25)case_cn = prs([row for i, row in enumerate(cn_geno)               if cn_pheno[i] == 1], weights)ctrl_cn = prs([row for i, row in enumerate(cn_geno)               if cn_pheno[i] == 0], weights)print("跨人群迁移后 AUC:", round(calc_auc(case_cn, ctrl_cn), 3))
目的:用模拟数据跑通“GWAS 找关联 → 建 PRS → 评估 AUC → 跨人群迁移”的完整链路,直观展示两组分布重叠与人群迁移带来的预测力下降。
  1. p = max(0.02, min(0.98, 0.3 + k * 0.006 + freq_shift))给每个 SNP 设基础频率,freq_shift 模拟不同人群的等位基因频率偏移。
  2. y.append(g + random.gauss(0, env_sd))易感性由遗传累加值与环境噪声相加而成,体现“多基因 + 环境”模型。
  3. threshold = sorted(y)[int(len(y) * (1 - prevalence))]用患病率倒推发病门槛,超过它才标记为病例。
  4. scores.append(n * (a * d - b * c) ** 2 / denom)卡方统计量,衡量这个“路牌”与疾病的关联强度。
  5. return 1.0 if fc > fh else -1.0病例中频率更高则权重为正,否则为负,决定风险方向。
  6. idx = sorted(range(len(weights)), key=lambda j: -abs(weights[j]))[:top_k]只保留关联最强的 top_k 个位点构建 PRS。
  7. return (r_sum - n1 * (n1 + 1) / 2) / (n1 * n2)用病例秩和换算 AUC,衡量两组评分分布的重叠程度。

常见误区

误区GWAS 出来一串显著 SNP,这不就等于找到致病基因了吗?下一步把它敲掉不就能治好病?

正解关联不等于因果。GWAS 标出的路牌往往只是“住在因果路牌隔壁的邻居”——因为连锁不平衡,真正致病的变异常藏在同一区块里没被直接看到。而且绝大多数显著位点位于非编码区,连“影响哪个基因、哪条调控通路”都还不知道。

为何常见:媒体习惯把“找到风险基因”简化成“找到病因”,再加上单基因病的直觉被错误外推到多基因病。

误区我的多基因风险评分是别人的三倍,那我大概率会生病吧?要不要现在就做预防性手术?

正解PRS 是概率排序,不是命运判决书。AUC≈0.6 意味着个体层面区分力很弱;复杂疾病发病还受环境、生活方式与随机因素牵制。高风险只提示“更值得主动筛查和健康管理”,绝不是“必然患病”。

为何常见:人们习惯把“风险倍数”当成“患病概率”,忽略了绝大多数风险评分在个体水平上的预测误差巨大。

误区只要 GWAS 样本量堆到百万级,PRS 准能精准预测,问题只是钱没花够。

正解增加样本只能提升对微效位点的检测力,却不能突破两个天花板:疾病本身的遗传力有限(环境主导的部分再多样本也学不到),以及训练人群单一导致的可迁移性缺陷。百万欧洲样本去预测非洲人群,照样接近随机。

为何常见:深度学习“数据越多越强”的经验被过度外推,忽视了遗传流行病学中人群结构与遗传力天花板的特殊性。

误区这个 SNP 的 p 值 3×10⁻¹⁰,比阈值还低好几个数量级,肯定是很重要的药物靶点。

正解统计显著只说明“关联不太可能是巧合”,不代表效应量大。全基因组显著位点的 OR 常常只有 1.05 到 1.3,临床上一个病人的治疗决策几乎不会因此改变。显著性与临床重要性是两把不同的尺子。

为何常见:显著性阈值深植于统计文化,“极小极小”的 p 值天然带来“极强极强”的错觉,而 OR=1.05 的收益在个体层面几乎不可感知。

误区欧洲训练的 PRS 用在亚洲人身上,无非是准头差一点,凑合着也能用。

正解不是“差一点”。由于等位基因频率和 LD 结构差异,跨人群 AUC 可能从 0.70 掉到 0.55 附近,逼近抛硬币。必须用本地人群队列重新估计频率、重训或至少重校准,否则可能系统性误分类。

为何常见:模型部署时默认“人种差异只影响一个常量”,忽略了遗传结构层面的系统性差异。

面试题

Q1. GWAS 中常见的多重检验校正后的显著阈值是?

单选题 · easy

  • A.p 值小于 0.05 即可
  • B.p 值小于 5×10⁻⁸← 正确答案
  • C.p 值小于 0.50 即可
  • D.p 值小于 0.005

答案:B。5×10⁻⁸ 来自约一百万次独立检验的 Bonferroni 校正(0.05 ÷ 10⁶),相当于把“5% 假警报预算”平均分给一百万个路牌。A、C、D 都太宽松,假阳性会爆炸。

Q2. 复杂疾病中单个风险 SNP 的效应通常是?

单选题 · easy

  • A.效应极大趋于 50 倍
  • B.效应微小仅 1.1 倍← 正确答案
  • C.效应为零无任何影响
  • D.效应由环境单独决定

答案:B。复杂疾病由上千个微效位点共同驱动,单个 SNP 的 OR 常在 1.05 至 1.3 之间,就像每个路牌只偏一点方向。A 是孟德尔单基因病的特征,C、D 与多基因模型矛盾。

Q3. “缺失遗传力”指的是哪种现象?

单选题 · mid

  • A.遗传力随年龄增长而消失
  • B.已发现位点遗传度远低于家系估计← 正确答案
  • C.环境误差完全压制了遗传效应
  • D.所有复杂疾病的遗传力均为零

答案:B。双胞胎与家系研究估计的遗传力,远高于 GWAS 已发现位点能解释的部分,差额就是“缺失遗传力”——大量微效位点因效应太弱、过不了显著阈值而被漏掉。

Q4. PRS 对个体做风险评分的数学本质是?

单选题 · mid

  • A.求多个风险 SNP 基因型的加权累加和← 正确答案
  • B.计算单个主效基因的显性概率
  • C.对疾病相关蛋白做三维结构预测
  • D.用连锁图谱定位致病染色体区段

答案:A。PRS 是把 K 个风险位点的基因剂量乘上估计效应量后求和。B 是单基因概率思维,C 是结构生物学,D 是连锁分析,都与多基因风险评分的定义无关。

Q5. 欧洲人群训练的 PRS 用于东亚人群时的主要制约是?

单选题 · easy

  • A.各人群连锁不平衡与频率差异大← 正确答案
  • B.东亚人群很难开展大范围测序
  • C.连锁不平衡在所有人群中一致
  • D.等位基因频率全部等于零点五

答案:A。不同人群的等位基因频率和 LD 模式差异巨大,导致权重失效、预测力骤降。B 与事实不符,C、D 违背群体遗传学常识。

Q6. AUC 为 0.6 的 PRS 在风险分层的正确解读是?

单选题 · hard

  • A.患者得分高于健康人的概率六成← 正确答案
  • B.能够准确确诊百分之六十的病例
  • C.误诊健康人的比例恰好是四成
  • D.疾病总体发病率因此下降六成

答案:A。AUC 的定义是“随机病例得分高于随机对照的概率”,0.6 意味着排序只比抛硬币好 10%。B 说的是灵敏度,C 说的是误报率,D 混淆了预测与干预,均不等于 AUC。

Q7. GWAS 无法直接给出因果基因,最直接的原因是?

单选题 · hard

  • A.测序技术无法读取任何基因序列
  • B.显著位点全都位于编码区之内
  • C.基因与疾病之间根本不存在任何联系
  • D.显著位点多在非编码区且受 LD 遮蔽← 正确答案

答案:D。GWAS 的显著位点大多落在非编码区,且因连锁不平衡,真正起作用的因果位点往往被“邻居”信号掩盖。A、B、C 都与基因组学基本事实相反。

Q8. PRS 预测精度的主要瓶颈包括哪些?

多选题 · mid

  • A.单个 SNP 效应微小难以估准← 正确答案
  • B.交互作用与环境因素被忽略← 正确答案
  • C.训练样本存在的人群偏见← 正确答案
  • D.人类基因组序列已经完全已知

答案:ABC。微效效应难估计、忽视交互与环境、训练人群单一,三者在正文中均为瓶颈。D 错误——序列已知不代表风险机制已知,更不等于能精准预测。

Q9. 以下哪些属于改进复杂疾病风险预测的方向?

多选题 · mid

  • A.纳入多组学与环境暴露数据← 正确答案
  • B.建设跨种族多样性研究队列← 正确答案
  • C.用机器学习捕捉非线性交互← 正确答案
  • D.放弃统计方法只看单个基因

答案:ABC。多组学整合、跨种族队列、机器学习建模都是改进方向。D 是开倒车——单基因视角无法刻画多基因复杂疾病。

Q10. 关于 PRS 临床应用,下列哪些说法正确?

多选题 · hard

  • A.单独 PRS 不足以指导个体用药← 正确答案
  • B.高风险评分不等于必然患病← 正确答案
  • C.跨人群应用前需重新校准验证← 正确答案
  • D.PRS 可完全取代基因组测序

答案:ABC。PRS 目前只能辅助风险分层,不足以单独指导个体用药;高危不等于确诊;跨人群必须重校准。D 夸大了 PRS 的能力,它只是风险评分,不能替代测序或确诊手段。