Nature Aging IF=19.4 | Transformer聚类框架:纵向电子健康记录解析阿尔茨海默病与帕金森病亚型

引言

阿尔茨海默病和帕金森病等神经退行性疾病临床异质性极高 ,这导致"一刀切"的治疗策略屡屡受挫。能否从海量临床数据中,提前识别出不同的疾病亚型,为精准干预铺平道路?

近日,一项发表于《Nature Aging》的研究带来了突破。牛津大学等机构的研究团队利用基于Transformer的深度学习框架,对英国两个大型队列中超过10万名患者的纵向电子健康记录进行了分析,成功识别并验证了阿尔茨海默病和帕金森病各自五种可重复的疾病亚型这些亚型具有独特的共病模式、症状轨迹、临床结局和遗传特征 ,甚至揭示了跨疾病共享的代谢-炎症等表型,为理解神经退行性疾病的异质性提供了全新的、可扩展的数据驱动框架

基本信息

文章标题 :Subtyping Alzheimer's disease and Parkinson's disease using longitudinal electronic health records

期刊 :Nature Aging

影响因子 :19.4

发表时间 :2026年2月26日

研究单位 :英国牛津大学妇女与生殖健康奈菲尔德深度医学部;英国牛津大学沃尼福德医院精神病学系

Github地址https://github.com/SereneLian/Subtyping_EHR_AD_PD

论文地址https://doi.org/10.1038/s43587-026-01085-3

研究内容与方法

1. 数据集构建

  • 数据来源与队列划分

    • 主数据集采用CPRD Aurum按GP划分为80%推导队列和20%内部验证队列外部验证及遗传分析采用UK Biobank数据集
    • 仅纳入满足以下条件的病例:年龄≥40岁,2005-2018年间首次诊断AD/PD,符合CPRD质量标准、HES链接资格,且至少有12个月GP注册记录
  • 数据范围定义仅使用预诊断EHR记录用于模型训练与聚类,诊断后5年数据仅用于聚类结果解读

  • 对应代码片段:

    python 复制代码
    def filter_patients(df, min_age=40, start_year=2005, end_year=2018, min_reg_months=12):
        # Filter by age at diagnosis
        df = df[df['age_at_diagnosis'] >= min_age]
        # Filter diagnosis year
        df = df[(df['diagnosis_year'] >= start_year) & (df['diagnosis_year'] <= end_year)]
        # Filter registration duration
        df = df[df['registration_duration_months'] >= min_reg_months]
        return df

2. 基于Transformer的EHR序列表示学习

  • 数据预处理将诊断、操作、药物编码映射到统一临床词汇表 ,结合就诊时的年龄、日历时间戳构建时序输入序列
    对应代码片段:

    python 复制代码
    def encode_ehr_events(events, vocab, age, year):
        # Map events to vocab indices
        event_ids = [vocab[event] for event in events if event in vocab]
        # Combine with age and year embeddings
        age_emb = get_age_embedding(age)
        year_emb = get_year_embedding(year)
        # Concatenate event, age, year embeddings
        seq_emb = torch.cat([event_emb, age_emb, year_emb], dim=-1)
        return seq_emb
  • 模型架构 :采用多层Transformer编码器,联合嵌入临床事件与时间特征 ,最终聚合序列首尾隐藏层得到患者级嵌入向量
    对应代码片段:

    python 复制代码
    class EHRTransformer(nn.Module):
        def __init__(self, vocab_size, hidden_size, num_layers, num_heads):
            super().__init__()
            self.event_embedding = nn.Embedding(vocab_size, hidden_size)
            self.age_embedding = nn.Embedding(100, hidden_size)  # Age 0-99
            self.year_embedding = nn.Embedding(2030-1900, hidden_size)  # 1900-2029
            self.transformer = nn.TransformerEncoder(
                nn.TransformerEncoderLayer(hidden_size, num_heads, dim_feedforward=hidden_size*4),
                num_layers=num_layers
            )
            self.pooler = nn.Linear(hidden_size, hidden_size)
    
        def forward(self, event_ids, age_ids, year_ids, mask=None):
            event_emb = self.event_embedding(event_ids)
            age_emb = self.age_embedding(age_ids)
            year_emb = self.year_embedding(year_ids)
            x = event_emb + age_emb + year_emb
            x = self.transformer(x, src_key_padding_mask=mask)
            # Aggregate first and last hidden states
            cls_emb = x[:, 0, :]
            last_emb = x[:, -1, :]
            final_emb = torch.cat([cls_emb, last_emb], dim=-1)
            final_emb = self.pooler(final_emb)
            return final_emb
  • 双阶段训练目标

    • 掩码事件建模 :随机掩码15%的临床事件,模型预测掩码事件的原始编码,学习事件共现与时序模式
      对应代码片段:

      python 复制代码
      def mask_events(event_ids, mask_prob=0.15):
          mask = torch.rand(event_ids.shape) < mask_prob
          masked_ids = event_ids.clone()
          masked_ids[mask] = vocab['<MASK>']
          return masked_ids, mask
    • 对比学习 :采样同一患者的两个连续预诊断片段作为正样本,不同患者的片段作为负样本,通过对比损失优化患者嵌入的区分度
      对应代码片段:

      python 复制代码
      def contrastive_loss(emb1, emb2, temperature=0.1):
          # Normalize embeddings
          emb1 = F.normalize(emb1, dim=-1)
          emb2 = F.normalize(emb2, dim=-1)
          # Compute cosine similarity
          sim = torch.matmul(emb1, emb2.T) / temperature
          # Labels are diagonal (same patient)
          labels = torch.arange(emb1.shape[0]).to(emb1.device)
          loss = F.cross_entropy(sim, labels) + F.cross_entropy(sim.T, labels)
          return loss / 2

研究设计与分析工作流

3. 患者轨迹聚类与亚型选择

  • 聚类方法对Transformer生成的患者嵌入向量应用K-means聚类,遍历聚类数K∈3,8

  • 最优聚类数选择以预测强度≥0.95为预设阈值,选择满足条件的最大K值 ;同时结合轮廓系数、Davies-Bouldin指数、bootstrap调整兰德指数(ARI)等指标验证聚类稳定性
    对应代码片段:

    python 复制代码
    def prediction_strength(clusters, test_data, k):
        # Compute cluster centroids
        centroids = np.array([np.mean(test_data[clusters == i], axis=0) for i in range(k)])
        # Assign test data to centroids
        test_clusters = np.argmin(cdist(test_data, centroids), axis=1)
        # Calculate prediction strength
        ps = []
        for i in range(k):
            idx = clusters == i
            if np.sum(idx) == 0:
                ps.append(0)
                continue
            test_idx = test_clusters == i
            intra_sim = np.sum(cdist(test_data[idx], test_data[test_idx]) < cdist(test_data[idx], test_data[~test_idx]))
            ps.append(intra_sim / (np.sum(idx) * np.sum(test_idx)))
        return np.min(ps)
  • 聚类验证

    • 通过t-SNE可视化聚类分布,评估类间分离度
    • 计算基于距离的分配置信度:
      Confidence=1−min_dist(x,centroids)max(min_dist(x,centroids))Confidence = 1 - \frac{min\_dist(x, centroids)}{max(min\_dist(x, centroids))}Confidence=1−max(min_dist(x,centroids))min_dist(x,centroids)
      其中min_dist(x,centroids)min\_dist(x, centroids)min_dist(x,centroids)为患者嵌入到所属聚类中心的欧氏距离
      对应代码片段:
    python 复制代码
    def assignment_confidence(embeddings, centroids):
        distances = cdist(embeddings, centroids)
        min_dist = np.min(distances, axis=1)
        # Normalize to [0,1]
        norm_dist = min_dist / np.max(min_dist)
        confidence = 1 - norm_dist
        return confidence

4. 基准模型对比方法

  • TF-IDF+K-means基准:将预诊断编码事件转换为TF-IDF特征向量,再应用K-means聚类
  • 临床变量基准:以年龄、性别、IMD(多重剥夺指数)、诊断年份、年均就诊频率、2年Charlson合并症指数为输入特征进行聚类

5. 遗传特征分析方法

  • 多基因风险评分(PRS)分析

    • 对比各聚类与对照组、聚类间的AD/PD PRS分布采用双侧t检验进行差异检验,并用Benjamini-Hochberg法校正多重检验
    • 计算效应量Cohen's d:
      d=μ1−μ2(n1−1)σ12+(n2−1)σ22n1+n2−2d = \frac{\mu_1 - \mu_2}{\sqrt{\frac{(n_1-1)\sigma_1^2 + (n_2-1)\sigma_2^2}{n_1+n_2-2}}}d=n1+n2−2(n1−1)σ12+(n2−1)σ22 μ1−μ2
      对应代码片段:
    python 复制代码
    def prs_comparison(prs_data, clusters, control_group):
        results = []
        # Cluster vs control
        for cluster in np.unique(clusters):
            cluster_prs = prs_data[clusters == cluster]
            control_prs = prs_data[control_group]
            t_stat, p_val = stats.ttest_ind(cluster_prs, control_prs)
            results.append({'group1': f'Cluster {cluster}', 'group2': 'Control', 'p_val': p_val, 'cohen_d': cohen_d(cluster_prs, control_prs)})
        # Cluster vs others
        for cluster in np.unique(clusters):
            cluster_prs = prs_data[clusters == cluster]
            others_prs = prs_data[clusters != cluster]
            t_stat, p_val = stats.ttest_ind(cluster_prs, others_prs)
            results.append({'group1': f'Cluster {cluster}', 'group2': 'Others', 'p_val': p_val, 'cohen_d': cohen_d(cluster_prs, others_prs)})
        # FDR correction
        p_vals = [res['p_val'] for res in results]
        corrected_p = stats.false_discovery_control(p_vals)
        for i in range(len(results)):
            results[i]['corrected_p'] = corrected_p[i]
        return results
  • SNP分析

    • 针对AD/PD相关候选SNP,构建加性Logistic回归模型 ,以聚类成员为因变量,SNP剂量(0/1/2)为自变量,调整年龄、性别、前3个遗传主成分,采用Bonferroni法校正多重检验
    • 进行探索性双侧Fisher精确检验 ,对比所有聚类组合间的SNP携带者状态差异
      对应代码片段:
    python 复制代码
    def snp_logistic_regression(snp_data, clusters, covariates):
        results = []
        for snp in snp_data.columns:
            for cluster in np.unique(clusters):
                y = (clusters == cluster).astype(int)
                X = pd.concat([snp_data[[snp]], covariates], axis=1)
                model = sm.Logit(y, X)
                try:
                    res = model.fit()
                    or_val = np.exp(res.params[snp])
                    or_ci = np.exp(res.conf_int().loc[snp])
                    p_val = res.pvalues[snp]
                    results.append({'snp': snp, 'cluster': cluster, 'OR': or_val, 'OR_CI': or_ci, 'p_val': p_val})
                except:
                    continue
        # Bonferroni correction
        num_tests = len(results)
        for res in results:
            res['corrected_p'] = res['p_val'] * num_tests
            if res['corrected_p'] > 1:
                res['corrected_p'] = 1
        return results

AD和PD聚类的遗传特征

实验结果分析

基于纵向电子健康记录的阿尔茨海默病与帕金森病亚型识别

本研究应用基于Transformer的无监督聚类框架,对来自英国两个大型队列(CPRD Aurum和UK Biobank)超过10万名患者的纵向电子健康记录进行分析,成功识别、验证并描述了阿尔茨海默病(AD)和帕金森病(PD)的五个可重复亚型这些亚型具有独特的共病模式、症状轨迹、预后结果和遗传特征

亚型特征与预后差异

下图展示了AD和PD各亚型的关键特征、人群分布以及诊断后5年的死亡率和住院率。

图注:AD和PD的亚型特征及预后结果。a, b分别为AD和PD各亚型的标签与主要特征。c, d分别为AD和PD在CPRD验证集中的亚型人群分布、5年全因死亡率及住院率。e, f展示了AD患者诊断后5年的平均MMSE评分及10年MMSE评分趋势。

  • 亚型构成与特征 :研究为AD和PD各确定了五个亚型。AD亚型包括:经典晚发型(簇1)血管相关型(簇2)精神进展型(簇3)代谢-炎症型(簇4)感觉运动相关型(簇5) 。PD亚型包括:经典遗传型(簇1)血管相关型(簇2)严重精神型(簇3)代谢-炎症型(簇4)心血管-运动型(簇5)
  • 预后差异显著不同亚型在死亡率和住院率上存在显著差异 。对于AD,簇1(经典晚发型)的预后最好 ,而簇5(感觉运动相关型)的死亡率和住院率最高 。对于PD,簇1(经典遗传型)预后最佳簇5(心血管-运动型)预后最差这些差异在外部验证队列(UK Biobank)中也得到了基本一致的验证

亚型特异的共病与症状轨迹

下图分别以热图形式展示了AD和PD各亚型在诊断前的主要共病情况,并描绘了关键症状在诊断前后10年间的累积发生率轨迹。

图注:AD亚型的共病与疾病相关症状。a, 热图显示了CPRD验证数据集中各AD亚型诊断前共病的患病率。b, 展示了五个关键症状在诊断前后5年(共10年)的累积发生率轨迹。

图注:PD亚型的共病与疾病相关症状。a, 热图显示了CPRD验证数据集中各PD亚型诊断前共病的患病率。b, 展示了五个关键症状在诊断前后5年(共10年)的累积发生率轨迹。

  • 独特的共病模式每个亚型都有其主导的共病特征 。例如,AD和PD的血管相关亚型(簇2)均以极高比例的高血压为特征 ;而代谢-炎症亚型(簇4)则与糖尿病、肾脏疾病和肥胖高度相关
  • 差异化的症状演进症状轨迹分析揭示了亚型间的早期差异和不同的疾病进展模式 。例如,AD的精神进展亚型(簇3)表现出最高的抑郁和焦虑发生率,且认知下降速度略快PD的严重精神亚型(簇3)则表现出更严重的运动和非运动症状,且在诊断前数年就出现震颤

亚型的遗传学基础

下图通过多基因风险评分和"一对多"比较,分析了各亚型与对照组及其他亚型在遗传风险上的差异。

图注:AD和PD亚型的遗传特征。a, b分别展示了AD和PD各亚型与对照组相比的多基因风险评分分布。c, d分别为AD和PD各亚型与其余所有亚型合并组进行的"一对多"PRS比较。

  • AD亚型的遗传异质性所有AD亚型的AD-PRS均显著高于对照组 。值得注意的是,代谢-炎症亚型(簇4)的AD-PRS显著低于其他亚型 ,提示其发病可能更少依赖于传统的AD遗传风险通路 ,而更多由代谢等因素驱动
  • PD亚型的遗传异质性所有PD亚型的PD-PRS也均高于对照组 ,但精神进展型(簇3)和代谢-炎症型(簇4)的评分显著低于其他亚型 ,表明这些亚型可能由非遗传或替代风险因素主导
  • 特定基因变异 :进一步的单核苷酸多态性分析发现,AD的代谢-炎症亚型(簇4)中APOE ε4等位基因频率降低,而APOE ε2等位基因频率升高 ,这与该亚型较低的遗传风险相一致。在PD中,血管相关亚型(簇2)显示出LRRK2基因变异的富集趋势

优势与局限

优势

大规模真实世界数据 :研究基于超过10万名患者的纵向电子健康记录 ,涵盖两个大型英国队列,数据规模大、代表性好,增强了亚型发现的统计效力与临床泛化性

多模态整合与可解释性 :框架融合了临床轨迹、遗传风险评分和单核苷酸多态性数据 ,不仅识别了表型亚型,还揭示了其遗传基础与预后差异 ,为机制探索提供线索。

早期预测与临床实用性利用诊断前的长期纵向数据识别亚型 ,有助于早期风险分层和预后评估,为未来靶向干预和个性化管理奠定了基础。

局限

诊断准确性与数据完整性依赖 :亚型基于临床诊断代码,缺乏生物标志物确认 ;症状记录可能不完整,认知测试数据稀疏,可能影响亚型定义的精确性

潜在检测偏倚 :医疗记录可能受到医疗接触频率差异的影响,尽管研究进行了调整,但残留的检测偏倚仍可能影响亚型特征的解读

探索性分析与机制验证不足 :研究本质为探索性,识别的共享亚型(如代谢-炎症型)提示了跨疾病机制,但尚未通过独立生物样本或前瞻性设计验证其因果关系

参考文献

  1. Fan, Z. et al. Identification of heart failure subtypes using transformer-based deep learning modelling: a population-based study of 379,108 individuals. EBioMedicine 114, 105657 (2025). 该研究提出了基于Transformer的深度学习模型 ,用于从电子健康记录中识别疾病亚型。本研究借鉴了其模型架构和表征学习方法,将其应用于阿尔茨海默病和帕金森病的纵向数据驱动的亚型识别。
  2. Tibshirani, R. & Walther, G. Cluster validation by prediction strength. J. Comput. Graph. Stat. 14, 511--528 (2005). 本文介绍了预测强度分析 ,用于评估聚类结果的稳定性和可重复性。本研究采用该方法(阈值设定为0.95)来确定阿尔茨海默病和帕金森病各自的最佳亚型数量(K=5)
  3. Banerjee, A. et al. Identifying subtypes of heart failure from three electronic health record sources with machine learning: an external, prognostic, and genetic validation study. Lancet Digit. Health 5, e370--e379 (2023). 该研究利用电子健康记录和机器学习对心力衰竭进行亚型分析,并进行了外部验证和遗传学解释 。本研究参考了其整合临床数据与遗传风险评分的分析框架,以揭示不同神经退行性疾病亚型的生物学基础。
  4. Alexander, N., Alexander, D. C., Barkhof, F. & Denaxas, S. Identifying and evaluating clinical subtypes of Alzheimer's disease in care electronic health records using unsupervised machine learning. BMC Med. Inform. Decis. Mak. 21, 343 (2021). 该论文利用无监督机器学习 从电子健康记录中识别阿尔茨海默病的临床亚型。本研究在此基础上,扩展了方法学(采用Transformer模型) ,并平行分析了帕金森病,揭示了跨疾病的共享表型(如代谢-炎症型)
  5. Scheltens, P. et al. Alzheimer's disease. Lancet 397, 1577--1590 (2021). 这篇综述系统阐述了阿尔茨海默病的流行病学、病理机制和临床异质性 。本研究针对其中提到的疾病异质性和治疗挑战,通过数据驱动的亚型划分,为开发精准干预策略提供了新的证据和框架。
相关推荐
架构师汤师爷1 小时前
WorkBuddy 保姆级教程开源了!600 多篇 Agent 资料一次性放出
人工智能
辰辉创聚1 小时前
重组细胞因子全解析:定义、分类与应用指南
人工智能·eclipse·emacs·白细胞介素·重组蛋白·重组细胞因子
小小测试开发1 小时前
RAG评测:把忠实度、检索命中率、噪声敏感度做成可回归的流水线
人工智能·数据挖掘·回归·kotlin
问天_观心1 小时前
深入学习Transformer(一)
人工智能·python·深度学习·神经网络·学习·transformer
腾讯数据架构师1 小时前
摩尔线程 GPU 怎么接入 Kubernetes 跑 DeepSeek?CubeStudio 摩尔线程(MUSA)适配实操
人工智能·云原生·容器·kubernetes·开源·mlops·maas
liliangcsdn1 小时前
skewness收益偏度取负因子背后逻辑的探索
人工智能·算法·机器学习
yyxx4121231 小时前
钉钉专属版一年多少钱?2026最新价格
大数据·人工智能·物联网
雷帝木木1 小时前
DVC数据版本控制实战:让训练数据像代码一样可追溯
人工智能·python·深度学习·机器学习
楠楠子呀1 小时前
号码验证技术解析:从原理到实践
运维·人工智能·ai·electron·自动化