表观遗传年龄预测 Horvath 时钟¶
一句话说明¶
Horvath 时钟是一个用 353 个 CpG 位点的甲基化水平来预测人体生物学年龄的数学模型——就像看树的年轮判断树龄,但这里看的是 DNA 上的甲基化"年轮"。
核心知识点¶
要点1:什么是表观遗传时钟¶
- 表观遗传时钟 = 用 DNA 甲基化水平预测生物学年龄的模型
- 随着衰老,某些 CpG 位点的甲基化会有规律地升高或降低
- 生物学年龄 ≠ 实际年龄:吸烟、肥胖会加速,运动会减缓
- 白话类比:实际年龄是身份证上的,生物学年龄是身体真实的"磨损程度"
要点2:主要表观遗传时钟¶
| 时钟 | 年份 | CpG 数 | 训练数据 | 特点 |
|---|---|---|---|---|
| Horvath | 2013 | 353 | 多组织 | 第一代,跨组织通用 |
| Hannum | 2013 | 71 | 血液 | 血液专用,精度高 |
| PhenoAge | 2018 | 513 | 血液 | 预测死亡率和疾病风险 |
| GrimAge | 2019 | 1030 | 血液 | 预测寿命最准确 |
| DunedinPACE | 2022 | 173(+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 |