☰
TyHGB复合指标在CHARLS队列中的构建与应用解析
2026/10/10 6:09:42 网站建设 项目流程

1. 为什么是TyG:代谢流行病学里最像“基础设施”的指数

近半个月我做的最有满足感的一件事,是把 TyHGB 这个复合指标的完整计算流程和分析链路整理上线到了自己的数据平台上。过程中顺手在 CHARLS 相关文献里检索了一圈,结果和标题里说的差不多:这个方向目前确实还有不少可以做的空间。TyG 指数本身不算新,但把它和血红蛋白放在同一个框架里,再用中国中老年纵向队列去验证,这样的组合还远远谈不上拥挤。这篇文章把我这些天踩过的点整理出来,给准备用公共数据库做代谢流行病学或老年代谢研究的同行一个参考。

先说清楚 TyG 是什么。TyG 的全称是 triglyceride-glucose index,即甘油三酯-葡萄糖指数,计算公式是:

TyG = ln[空腹甘油三酯(mg/dL) × 空腹血糖(mg/dL) / 2]

这个指标最早是为了解决一个很现实的问题:胰岛素抵抗的金标准评估方法比较麻烦,正葡萄糖钳夹技术不是普通人能用到的,HOMA-IR 虽然好,但必须同步测空腹胰岛素。很多大型队列在建队的时候根本没想到后来要做胰岛素抵抗研究,或者测了胰岛素但不同批次之间的检测方法漂移,数据根本不稳。反而是甘油三酯和空腹血糖这两个项目,几乎任何一个常规体检都会做,存量大、历史久、跨队列可比性好,于是 TyG 就承担了“不需要胰岛素也能估胰岛素抵抗”的任务。

它的内在逻辑也不难理解。胰岛素抵抗发生之后,脂肪组织脂解增加,血里游离脂肪酸变多,肝脏合成 VLDL 的原料变多,甘油三酯自然就高;与此同时,外周组织对葡萄糖的利用效率下降,空腹血糖会往上走。所以 TG 和血糖任意一个升高都提示代谢出了问题,两个放在一起,信号会更集中。这也是为什么 TyG 在糖尿病、高血压、非酒精性脂肪肝、心脑血管事件、全因死亡里都有相对稳定的表现。

TyG 不是一个新东西,但它在公共数据库研究里几乎是最划算的暴露指标之一。你没有胰岛素的年代,可以用它;你没法做身体成分测量的年代,也可以用这套思路去复合别的变量。后来衍生出的 TyG-BMI、TyG-WC、TyG-WHtR,本质就是把 TyG 的代谢信号和肥胖的身体结构信号叠加。TyHGB 是同一个家族里的新成员,只不过这次叠加的不是腰围、BMI,而是血红蛋白。

我在这里先提一个单位和计算上的细节。CHARLS 等国内队列发布血检数据的时候,不同文件、不同批次可能用 mg/dL 也可能用 mmol/L。只要你整套数据内部统一,问题就不大,因为 TyG 在 log 变换下只差一个常数项,对于后续秩相关和回归系数方向没有本质影响。但如果要在文章里报告原始值,还是要严格按编码手册写清楚单位,尤其是 TG 换算系数和葡萄糖换算系数不一样,这是最容易翻车的地方。

2. TyHGB把血红蛋白拉进赛道:组合逻辑和指标构建

为什么单独把血红蛋白拉进来?我第一次听到这个组合的时候,第一反应也是“这两个东西量纲都不一样,怎么合”。但做代谢研究时间长了就会发现,胰岛素抵抗不是一个孤立的糖脂问题,它和慢性缺氧、红细胞功能、血液携氧效率都有关系。

血红蛋白的核心功能是携带氧气。组织对葡萄糖的利用不是凭空发生的,需要氧参与氧化代谢,而胰岛素要顺利把葡萄糖送进细胞,也需要正常的组织灌注和氧供。HGB 偏高,红细胞比容很容易跟着升,血液黏度增加,末梢微循环灌注变差,组织长期处于一种“糖很多但用不进去”的相对缺氧状态;HGB 偏低,则是另一种方向的氧供不足,同样会影响胰岛素信号通路和代谢效率。所以 HGB 和代谢指标之间的真实关系很可能不是简单的一条直线,而是存在某种拐点。

从机制链条上想,至少有这样几条通路值得在文章里写:

  • 慢性缺氧会激活交感神经系统,促进儿茶酚胺释放,增加糖原分解和肝糖输出,和胰岛素抵抗互相强化。
  • 缺氧诱导因子 HIF-1α 在低氧环境下会诱导红细胞生成,同时调节糖酵解相关基因表达,等于说血液系统本身就在参与糖代谢重塑。
  • 血红蛋白水平受吸烟、慢性阻塞性肺病、睡眠呼吸暂停、肾功能等多因素影响,这些因素同样和心血管预后相关,所以把 HGB 放进来,也能部分抓住这些传统 TyG 抓不到的“非代谢”因素。
  • 有研究表明,在糖尿病和代谢综合征人群里,血红蛋白和糖脂代谢指标呈正相关,但相关性不强,这就给了复合指标“增量信息”的空间。

问题在于,TyHGB 还没有一个全世界公认的固定公式。我看到过的做法里,有人把 TyG 和 HGB 标准化之后相加,有人在 TyG 基础上乘血红蛋白,有人按 TyG 和 HGB 的中位数做四分类组合。这不是一个简单的对错问题,而是要看你的研究设计。

我当前项目里采用的版本是:先把 TyG 和 HGB 分别做 z-score 标准化,然后相加作为连续型 TyHGB 分数。理由很简单,标准化之后两个变量都落在同一量纲上,不会出现 HGB 因为数值大就把 TyG 完全压掉的情况。与此同时,我会再做一组按性别分层中位数划分的联合分类变量:TyG 高/低乘以 HGB 高/低,形成 4 组,以“TyG低/HGB低”为参照,这样既能看连续效应,也能看交互作用。两个版本都跑,结论要一致才敢往文章里写。

如果你不是自己开发指标,而是准备引用某篇已发表的 TyHGB 定义,那更简单——直接按那篇文章的公式用就可以,但一定要注意它用的是 g/L 还是 g/dL,用的是空腹血糖还是糖化血红蛋白,以及它的人群是什么年龄段。这些细节决定了你的结果和它是否可比较。如果完全没人用过这个名字,那我强烈建议你在论文里写清楚“TyHGB-score v1”之类的版本号,并把 z-score 构建过程完整放上去。一个新指标最怕的不是不完美,而是说不清楚自己是怎么造出来的。

我不建议一上来就把 TyHGB 定义成线性主效应完事。血红蛋白和代谢结局很可能是 U 型或 J 型关系,所以你至少应该做一次限制性立方样条(RCS),看看 TyHGB 与结局之间是不是真的线性。如果样条图显示明显的拐点,那就要考虑分段、阈值效应,或者干脆报告非线性关系。这一步不仅是统计方法问题,更是帮你判断 TyHGB 到底应该当作连续变量还是分类变量来用。

3. 为什么我认定CHARLS是这块蓝海的落脚点

先用大白话介绍 CHARLS:中国健康与养老追踪调查,英文全称 China Health and Retirement Longitudinal Study,主要研究中国 45 岁及以上中老年人群的健康、养老、收入和生活方式,2011 年基线开始,差不多每两年追访一次。它有几个特点让做代谢流行病学的人很难绕开。

第一,样本量大,覆盖范围广。CHARLS 的抽样设计覆盖全国多个省份,包含了城市和农村社区,不是单中心小样本,做出来的年龄别、性别别亚组分析还像样。第二,它有完整的问卷信息和实测体格指标,血压、身高、体重、腰围这些都有,不是全靠自报。第三,它有血检数据,甘油三酯、空腹血糖、糖化血红蛋白、总胆固醇、高密度脂蛋白、低密度脂蛋白、C 反应蛋白等都在里面,TyG 的核心原料直接可以从生化文件里拿。第四,它是纵向设计,从 2011 年一路追到后面好几轮,够你做时间-事件分析。

为什么不用 NHANES?NHANES 虽然是横断面,只能做患病关联,没法做新发事件预测。为什么不直接上 UK Biobank?UKB 的数据质量确实好,但那是英国人群,人种、饮食习惯、代谢表型分布和我们差异很大,Hb 的参考范围和吸烟背景也不一样。你要论证一个针对中国中老年人的代谢指标,CHARLS 就是性价比最高的选择。这也是我判断“CHARLS 领域蓝海”的核心落脚点:数据和指标都在手里,差的只是有人去做组合。

再说说检索的真实情况。我在 PubMed 和几个中文数据库里用 CHARLS、TyG、hemoglobin、Hb 这些词交叉检索了一遍,至少在我检索的时间段里,把“TyG+血红蛋白复合指标”放到 CHARLS 队列里做的文章确实很少。更常见的是 TyG 单独做 CHARLS 的糖尿病或心脑血管文章,或者 TyG-BMI 做骨质疏松和衰弱。也就是说,TyG 的基础已经打得很厚,但“TyG 和 HGB 联合”这一步还很少有人系统做。用行话讲,这叫检索密度低,选题拥挤度低。

不过我得泼一盆冷水:“蓝海”不等于“没人做过”,更不等于“一定能写好发好”。很多人在公共数据库选题时有个误解,觉得越没人做过越好。实际上,完全没人做过可能说明这个数据组合本身存在硬伤,比如 CHARLS 血红蛋白变量覆盖不全、随访结局定义不清、指标定义没有依据。所以检索的目的不是找“空白”,而是找“有基础但没做完”的缝隙。TyHGB 正好属于这一类:TyG 的生物学机制有一堆文献支撑,HGB 与代谢的关系也有一堆生理学研究,只是很少有人把它们放到同一个公共队列里做成一个可发表的复合指标。

另外一个我比较看重的原因是 CHARLS 的结局空间足够大。你可以做新发糖尿病,也可以做新发高血压、心血管事件、全因死亡、认知功能下降,甚至可以往衰弱、跌倒、抑郁这些老年代谢相关的结局上延伸。同一个 TyHGB 分子式,换一个结局就是一篇新文章,换一个人群筛选条件又是一篇。这不是怂恿大家水文章,而是说复合指标这类研究的增量本来就可以靠“新的目标结局”“新的效应修饰因素”去累积。

4. 从想法到跑出结果:TyHGB在CHARLS里的完整操作链路

这部分我把实际跑的流程拆开讲,不绕弯子。第一步不是急着写代码,而是先把数据文件搞清楚。CHARLS 的数据要从官方网站注册下载,血检数据通常和基线问卷数据是分开的发布模块,里面还有编码手册。你要先确认你需要的变量在哪个文件里,变量名是什么,单位是什么。不要凭之前在别的队列里的印象猜,不同年份的编码方式可能都不一样。

我自己的习惯是建一个变量映射表,把原始变量名、所在文件、单位、编码说明、清洗规则全部放进去,这样后面做数据合并的时候能少花一半时间。下面是一个简化的示例:

变量类别变量内容通常来源模块需要留意的问题
暴露变量甘油三酯 TG基线血检数据文件mg/dL 还是 mmol/L
暴露变量空腹血糖 GLU基线血检数据文件与糖化血红蛋白不是一回事
复合变量血红蛋白 HGB血常规/血检相关模块变量可能分性别参考范围,单位注意 g/L 或 g/dL
结局变量新发糖尿病/高血压/心血管事件随访问卷+体检需要定义基线排除标准
时间变量随访时间、事件发生时间随访记录/死亡数据区分随访起点和终点
协变量年龄、性别、教育、吸烟、饮酒基线问卷编码多为分类变量,注意参照组设置
体格变量BMI、腰围、血压基线体检缺失率一般不高,但也要做缺失模式分析

变量目录理清楚之后,TyG 和 TyHGB 的计算用 pandas 就能完成。我给一个简化版的流程示例:

import pandas as pd import numpy as np # 假设已读入合并后的数据框 df # 变量名先按你自己的编码表改,下面只是演示逻辑 # 1. 单位换算和清洗 # 如果 TG 和 GLU 是 mmol/L,先按编码手册统一转换成 mg/dL # TG_mgdl = TG_mmolL * 88.57 # GLU_mgdl = GLU_mmolL * 18.02 # 2. 计算 TyG df['TyG'] = np.log(df['TG_mgdl'] * df['GLU_mgdl'] / 2) # 3. 标准化两个组分 df['zTyG'] = (df['TyG'] - df['TyG'].mean()) / df['TyG'].std() df['zHGB'] = (df['HGB_gL'] - df['HGB_gL'].mean()) / df['HGB_gL'].std() # 4. 构建 TyHGB 连续评分 df['TyHGB_score'] = df['zTyG'] + df['zHGB']

这里的标准化要特别注意:如果后续要按性别分层看结果,必须在分层后分别标准化,或者至少报告男性和女性各自的 HGB 参考范围。因为女性血红蛋白本身低于男性,如果不分性别直接标准化,等于把性别差异混进了指标里,最后 TyHGB 的高低可能只是性别的化身。

分类版本的构建我也顺手写了:

# 按 TyG 中位数分高低 df['TyG_high'] = (df['TyG'] >= df['TyG'].median()).astype(int) # 按性别分层后的 HGB 中位数分高低 df['HGB_high'] = df.groupby('gender')['HGB_gL'].transform( lambda x: (x >= x.median()).astype(int) ) # 四分类:1=TytG低/HGB低,2=TytG高/HGB低,3=TytG低/HGB高,4=两者都高 df['TyHGB_grp'] = df['TyG_high'] * 2 + df['HGB_high'] + 1

到这里暴露变量就算构建完了。接下来是统计模型的设计。第一步先做基线特征表,把人群按 TyHGB 的三分位或四分位分组,比较年龄、性别、BMI、血压、吸烟、慢性病史这些变量有没有组间差异。这一步不复杂,但决定了你能不能在文章里说清楚“高 TyHGB 人群到底比低 TyHGB 人群更‘不健康’”。基线表里最好同时展示连续变量和分类变量的缺失比例。

第二步做关联分析。如果结局是糖尿病或者心血管事件这种含发生时间的结局,首选 Cox 比例风险回归。模型从粗模型开始,逐步加年龄性别、再加代谢危险因素,最后加生活方式因素。典型的呈现方式是 Model 1、Model 2、Model 3。比如:

library(survival) cox_ph <- coxph( Surv(followup_years, event) ~ TyHGB_score + age + gender + BMI + sbp + dbp + education + smoking + drinking + baseline_diabetes, data = dat ) summary(cox_ph)

这里有几个必须检查的东西:协变量之间有没有共线性,HGB 和 TG 之间理论上不会高度相关,但如果你把 BMI、腰围、血压全塞进去,VIF 变大是很正常的;比例风险假设要用 Schoenfeld 残差检验;如果随访过程中有大量死亡发生,而结局是糖尿病这类非致命事件,还需要考虑竞争风险模型,用 Fine-Gray 模型做敏感性分析,不然死亡会把结局概率稀释掉。

第三步是做剂量-反应关系。TyHGB 是一个连续评分,直接看 HR 虽然简单,但有可能掩盖非线性。用 RCS 画出来是审稿人比较喜欢看到的图。R 里 rms 包写起来很方便:

library(rms) dd <- datadist(dat) options(datadist = "dd") fit_rcs <- cph( Surv(followup_years, event) ~ rcs(TyHGB_score, 4) + age + gender + BMI, data = dat, x = TRUE, y = TRUE )

第四次要,把亚组分析做扎实。性别、年龄组、BMI 分层、吸烟与否,这些是最常见也最有临床意义的修饰因素。尤其是性别,因为 HGB 本身就存在生理性性别差异,TyHGB 对男性的预测能力是不是显著强于女性,这是这篇文章最值得回答的问题之一。亚组分析的 p 值要做交互检验,不要只汇报“这组显著那不显著”,否则审稿人会认为你是拿 P 值挑结果。

最后不要忘了做敏感性分析。常见组合包括:只保留基线无糖尿病人群再跑一遍、把 HbA1c 代替空腹血糖放入 TyG 计算一遍、连续变量用四分类替换一遍、缺失协变量用多重插补而不是直接剔除。一个指标要是换了几种定义就翻车,那说明指标本身还不够稳。

5. 容易翻车的地方:我在类似分析里踩过的坑

先说单位坑。CHARLS 不同批次的生化数据单位,我在实际整理的时候发现并不完全可以靠文件名判断。甘油三酯有的文件直接给 mg/dL,有的给 mmol/L;血糖经常以 mg/dL 形式出现,但也有轮次或派生变量可能是 mmol/L。如果你不加处理直接用 mmol/L 去套 TyG 的 mg/dL 公式,得到的数值至少整体平移一个常数,如果混用单位,那整个样本的计算基础就崩了。解决办法只有一条:每次下载数据后先看编码手册,再随机抽几个样本核对原始值量级,比如正常人空腹血糖如果显示 90 左右,那基本是 mg/dL;如果显示 5.2 左右,那就是 mmol/L。

第二个坑是血红蛋白的单位。血常规里 g/L 和 g/dL 差 10 倍,很多人不注意,但在做 z-score 的时候影响不大,因为标准化抹掉了单位差异;可一旦要做临床切点、贫血定义、或者按性别参考范围分成高低组,单位错了整个分组全错。女性 HGB 低于 120 g/L 才叫贫血,你如果把 12 这个 g/dL 的数当成 120 g/L 处理,问题立刻出现。所以分组之前先看分布,心里要有数。

第三个坑是缺失和选择偏倚。CHARLS 血检数据不是每个人都在同一个时间点做的,有人有血样,有人只有问卷,有人血样检测失败,合并分析时样本量会突然掉一截。如果你直接只保留所有变量都完整的个体,最后的人群可能偏向身体条件更好、依从性更高的那部分人。处理办法是:先看缺失比例,做多重插补;如果缺失率太高,就把核心结果用完整病例分析和插补后分析同时汇报。插补数据在 Cox 模型里可以用 mice 和 survival 包联合处理,代码不复杂,但很多初学者根本没走到这一步。

第四个坑是随访时间定义。CHARLS 的访问时间点不是所有人同一天,如果只按“第几轮”来算年份,误差可以到半年甚至一年。对代谢指标这种长病程结局来说,时间定义粗糙一点也许还能接受,但如果你连这个都不写清楚,审稿人问一句“你的随访时间是怎么算的”你就被动了。稳妥做法是用个体实际访问日期计算生存时间,并把基线日期设定为血检采集或体检完成的日期。要注意,随访起点不是问卷访问时间,而是暴露变量真正测出来的那天。

第五个坑是抽样设计。CHARLS 是多阶段抽样,社区、家庭、个人层层嵌套,如果你的模型不处理聚类,标准误可能偏小。这一点在流行病学期刊里越来越被重视。最简单的处理是在 Cox 模型里加 cluster(community) 或者用稳健三明治方差估计,或者用 svydesign 对基线描述统计做加权。虽然复合指标更多是做“关联”,不是做“全国患病率估计”,但审稿人看到你考虑了复杂抽样设计,印象分会提升不少。

第六个坑是反向因果。你测基线 TyHGB 的时候,有些人可能已经处于糖尿病早期或心脏功能受损状态,这些人的 HGB 和糖脂指标本来就异常,结果随访期里发生事件,看起来是 TyHGB 预测了结局,实际可能是基线疾病状态造成的。处理方法是把基线已有目标疾病的人排除掉,或者把随访前两年发生的事件去掉做敏感性分析。对老年人队列,基线疾病史极多,这一步不能省。

还有一个细节容易被忽略:吸烟和慢性阻塞性肺病会导致继发性血红蛋白升高,吸烟本身又和心血管结局强相关。如果你不调整吸烟,TyHGB 的效应会被夸大。把吸烟变量放进模型之后,看效应衰减多少,这个差值其实本身就很有信息量,可以在讨论里写上一段。

6. 要不要追这个蓝海:我的判断和操作习惯

最后聊点实在的。很多人看到“蓝海”两个字就想立刻冲进去,但选题之前我习惯先问自己一个问题:这篇论文到底是想做“因素关联”还是想做“预测模型”。这两个方向对 TyHGB 的要求完全不同。

如果你做“因素关联”,那 TyHGB 只要满足机制上有道理、统计上稳健、效应量有临床意义就够。文章重点放在 Cox 回归的调整模型、RCS 的非线性趋势、亚组分析和敏感性分析上,结论落在“TyHGB 可能作为代谢紊乱的一个综合标志物”即可。这种文章好写,数据要求也低,但期刊档次通常不会特别高。

如果你想做“预测模型”,那就不能只给一个 HR 了。你要有内部验证、交叉验证或者 bootstrap 校准曲线,要比较 TyHGB 相对 TyG 单独使用的 C-index、NRI、IDI,还要做决策曲线分析说明在什么阈值下新增价值能转化为临床获益。预测模型文章的评审标准比关联研究严格得多,最容易出的问题是:“增量 AUC 只有 0.01,临床意义在哪里?”你要是没法回答这个问题,就别把文章往预测模型方向写。

还有一个经常被审稿人问的问题:为什么不直接用 TyG-BMI,非要用 TyHGB?这需要你准备两套证据。一是机制证据,说明 Hb 所代表的携氧状态不是 BMI 能替代的,尤其在中老年人群里,吸烟、慢阻肺、肾性贫血都直接影响 HGB,而 BMI 对这些因素基本无感。二是统计证据,在同一个模型里把 TyG、TyG-BMI、TyHGB 都放进去比较,展示 TyHGB 的模型拟合和预测指标确实有改善。哪怕改善幅度不大,只要能稳定地在多轮随访中复现,就已经是一个有价值的发现。

我的另一个操作习惯是给新指标做“家族式管理”。也就是说,我把 TyG、TyG-BMI、TyG-WC、TyHGB 全部放进一个内部平台上,统一计算公式、统一变量名、统一结局定义,跑同一个队列、同一套模型。这样就能非常快地看出哪个复合指标在哪个结局上表现更好。TyHGB 的代码版本、计算日期、数据版本我也会在平台里记下来。这个习惯帮我省了很多次“明明之前跑过但现在复现不了”的尴尬。

如果你现在准备动手,我建议第一批只做两件事:一是把 CHARLS 的编码手册下载下来,确认你需要的那几个变量都在;二是把检索词组合想好,在 PubMed 里重新查一遍,确认你心里那个切入点还没有被抢先发表。如果这两个条件都满足,那这个所谓蓝海至少值得你花一周时间跑一轮初步结果出来看看。

我实际操作下来的体会是,复合指标研究最难的从来不是建模,而是“命名、定义、可复现”这三个环节。TyHGB 这个名字听起来很唬人,但真正让它站住脚的,是一篇文章里能写清楚的分子式、能复现的代码、以及能说服人的生物学解释。把这些做扎实,它才有机会从一个小众组合变成更多人愿意引用的指标。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询