跳转至

表观遗传年龄预测 Horvath 时钟


一句话说明

Horvath 时钟是一个用 353 个 CpG 位点的甲基化水平来预测人体生物学年龄的数学模型——就像看树的年轮判断树龄,但这里看的是 DNA 上的甲基化"年轮"。


核心知识点

要点1:什么是表观遗传时钟

  • 表观遗传时钟 = 用 DNA 甲基化水平预测生物学年龄的模型
  • 随着衰老,某些 CpG 位点的甲基化会有规律地升高或降低
  • 生物学年龄 ≠ 实际年龄:吸烟、肥胖会加速,运动会减缓
  • 白话类比:实际年龄是身份证上的,生物学年龄是身体真实的"磨损程度"

要点2:主要表观遗传时钟

时钟年份CpG 数训练数据特点
Horvath2013353多组织第一代,跨组织通用
Hannum201371血液血液专用,精度高
PhenoAge2018513血液预测死亡率和疾病风险
GrimAge20191030血液预测寿命最准确
DunedinPACE2022173(+19827归一化探针)血液衡量衰老速度而非年龄

要点3:Horvath 时钟的建模方法

  • 算法:弹性网络回归(Elastic Net Regression)
  • 训练数据:8000+ 样本,涵盖 51 种组织和细胞类型
  • 输入:450K 芯片的 ~21000 个 CpG 位点 → 选出 353 个最具预测力的
  • 输出:DNA 甲基化年龄(DNAm Age)
  • 误差:约 ±3.6 年(跨组织)

要点4:年龄加速的含义

  • 年龄加速(Age Acceleration)= DNAm Age - 实际年龄
  • 正值 → 身体比实际更"老"(加速衰老)
  • 负值 → 身体比实际更"年轻"
  • 与疾病风险关联:年龄加速与癌症、心血管疾病、全因死亡率正相关

实战代码

# ===== R: 用 Horvath 时钟计算表观遗传年龄 =====

# 方法1:使用 methylclock 包(推荐,简单直接)
# BiocManager::install("methylclock")
library(methylclock)

# 输入数据:甲基化 beta 值矩阵
# 行 = CpG 探针(如 cg00000029),列 = 样本
# beta 值范围 0-1,0 = 未甲基化,1 = 完全甲基化
beta_matrix <- readRDS("beta_values.rds")

# 计算多种时钟的年龄
clock_results <- DNAmAge(beta_matrix,
    clocks = c("Horvath", "Hannum", "PhenoAge", "skinHorvath"))

# 查看结果
head(clock_results)
# 输出包含每个样本的 Horvath 年龄、Hannum 年龄等

# 方法2:手动用 Horvath 的 353 个 CpG 计算
# 下载 Horvath 的系数文件
# 文件包含:CpG 探针名、系数(coefficient)、截距
horvath_coef <- read.csv("horvath_coefficients.csv")

# 提取 353 个 CpG 的 beta 值
cpg_353 <- horvath_coef$CpG[-1]  # 第一行是截距
beta_sub <- beta_matrix[cpg_353, ]

# 年龄转换函数(Horvath 的反函数)
# 模型输出的是转换后的年龄,需要反转换
anti_trafo <- function(x, adult_age = 20) {
    ifelse(x < 0,
        (1 + adult_age) * exp(x) - 1,   # 儿童期(非线性)
        (1 + adult_age) * x + adult_age)  # 成年期(线性)
}

# 计算 DNAm Age
intercept <- horvath_coef$Coefficient[1]  # 截距
coefficients <- horvath_coef$Coefficient[-1]  # 353 个系数
# 线性组合
raw_age <- intercept + as.numeric(coefficients %*% beta_sub)
# 反转换得到最终年龄
dnam_age <- anti_trafo(raw_age)

# ===== 年龄加速分析 =====
# 已知实际年龄
actual_age <- c(25, 30, 45, 60, 70)  # 示例

# 计算年龄加速(残差法更准确)
# 用线性回归去除实际年龄的影响
model <- lm(dnam_age ~ actual_age)
age_acceleration <- residuals(model)
# 正值 = 加速衰老,负值 = 减缓衰老

# 可视化
library(ggplot2)
df <- data.frame(actual = actual_age, dnam = dnam_age,
                 acceleration = age_acceleration)

# 实际年龄 vs DNAm 年龄散点图
ggplot(df, aes(x = actual, y = dnam)) +
    geom_point(size = 3) +               # 散点
    geom_abline(slope = 1, intercept = 0, # 对角线(理想)
                linetype = "dashed", color = "red") +
    labs(x = "实际年龄", y = "DNAm 年龄",
         title = "Horvath 时钟年龄预测") +
    theme_minimal()

面试常问点

★ Horvath 时钟和 GrimAge 有什么区别?

参考答案:Horvath 时钟是第一代时钟(2013年),用 353 个 CpG 直接预测年龄,跨组织通用但与疾病预测能力一般。GrimAge(2019年)是第二代时钟,它先用甲基化数据预测血浆蛋白水平和吸烟包年数等中间表型,再用这些中间表型预测死亡率,在预测寿命和疾病风险方面远优于 Horvath。简单说,Horvath 告诉你"身体多少岁",GrimAge 告诉你"还能活多久"。

★ 表观遗传年龄加速在临床上有什么意义?

参考答案:年龄加速已被证实与多种疾病和死亡风险相关。例如每加速 5 年,全因死亡率增加约 15-20%。在临床应用中,年龄加速可以作为干预效果的评估指标——如果某种治疗(如热量限制、运动)能降低年龄加速,说明可能减缓了衰老进程。


速查卡片

问题一句话答案
Horvath 时钟 CpG 数353 个
算法弹性网络回归(Elastic Net)
预测误差约 ±3.6 年
适用组织跨组织通用(51 种)
年龄加速含义DNAm 年龄 > 实际年龄 = 加速衰老
预测寿命最强的时钟GrimAge
测量衰老速度的工具DunedinPACE
R 包推荐methylclock