最近在CHARLS数据里折腾胰岛素抵抗相关指标的时候我顺手去医院统计了一下PubMed上TyG类复合指标的发文量。坦白说TyG-BMI、TyG-WC、TyG-WHtR这类组合已经被很多人做过了CHARLS数据库上的相关论文一年比一年多肉眼可见地卷起来。但有一个方向到现在几乎还是空白——把血红蛋白HGB并进TyG里做复合指标。我在几个公共数据平台和文献库里搜了一圈以TyHGB命名的研究稀疏得可怜在CHARLS平台里更是基本没有人系统验证过。这意味着一件事先上车的人有肉吃。所以这篇东西我不打算写泛泛的通告直接把我验证TyHGB的经验、计算公式、CHARLS数据处理流程、统计建模的坑全部摊开。你如果手头正缺一个能落地、能复现、能冲一区或者保毕业的创新指标认真读完这篇按步骤跑完数据基本可以出自己的成果了。1. 为什么TyG和TyHGB值得做——核心逻辑与临床价值1.1 TyG是什么为什么比HOMA-IR更香先把手握方向盘的手放平重新说一遍TyG这个老朋友。TyG全称triglyceride-glucose index也就是甘油三酯-葡萄糖指数计算公式很经典TyG ln[TG(mg/dL) × FBG(mg/dL) / 2]其中TG是空腹甘油三酯FBG是空腹血糖。为什么是ln自然对数因为TG和FBG的乘积偏态非常严重取对数之后分布更接近正态后续做回归更稳。为什么除以2这是原始文献里为了和HOMA-IR数量级对齐做的调整。如果你非要较真除以2不除以2对模型的影响其实微乎其微因为对数变换会把这个常数项吸收到一个平移量里真正影响结果的是研究对象内部相对排序的变化但你发论文还是乖乖按原始公式来审稿人看着才眼熟。TyG能火起来核心原因是它完美避开了HOMA-IR的软肋。HOMA-IR需要空腹胰岛素值而很多大规模流行病学数据库的血检里根本没有胰岛素这一项。我自己跑数据时最头疼的就是一堆队列要么没测胰岛素要么测了但样本量断崖式下跌。TyG只需要常规生化里的甘油三酯和血糖这两个指标在CHARLS、NHANES、UK Biobank里全是标配数据可得性高得离谱。更重要的是TyG这个指标和胰岛素抵抗的相关性并不亚于HOMA-IR尤其在中老年人群里。目前主流学术界的看法是TyG可以很好地反映骨骼肌和肝脏组织的胰岛素敏感性和钳夹技术测出来的胰岛素抵抗程度相关性相当稳定。过去几年大量Meta分析也反复确认TyG升高和2型糖尿病、代谢综合征、动脉粥样硬化风险显著相关。这玩意儿已经不是一个单纯凑出来的指数了人家是有机制背书的。1.2 TyHGB的设计思路为什么偏偏加血红蛋白既然TyG已经够用为什么要多此一举加上血红蛋白HGB我最初看到TyHGB这个名字的第一反应也是同一句话。仔细捋下来这里面的逻辑其实蛮扎实的。首先血红蛋白在代谢疾病里扮演的角色比多数人想象得更复杂。传统上临床只把血红蛋白看成贫血指标但近十年关于铁代谢与代谢疾病的研究越来越多发现血红蛋白水平和胰岛素抵抗之间不是线性关系而是个U型关系血红蛋白太高红细胞增多血液黏稠度上升组织供氧和胰岛素信号传导都可能出问题血红蛋白太低携氧能力不足组织缺氧反而激活HIF-1α通路同样加重胰岛素抵抗。把HGB加进TyG本质上是在胰岛素抵抗的信号里多放进一个氧代谢维度的信息。其次从纯粹统计的角度讲一个复合指标的价值在于能否捕捉到单一指标漏掉的信息。我试过在好几个数据平台里把TyG和HGB放在同一模型里看交互项交互项往往显著而且方向在不同人群里还挺稳定的。这意味着TyG和HGB之间确实存在效应修饰或协同关系把两者组合成一个新指标在预测效能上通常优于单独用TyG。最后TyG类复合指标的套路已被验证过了。TyG-BMI、TyG-WC华丽丽地发了大量文章核心路径就是把TyG与一个代谢相关的躯体指标乘积组合。HGB作为血液学指标和BMI、腰围这类体格指标在生物学机制上走不同的通路组合进去之后信息重叠更小分布也更有区分度。所以TyHGB并不是简单跟风是在跟风的基础上换了一个更合理的搭档。1.3 蓝海判断检索现状和发文空间用大白话讲蓝海就是说别人还没怎么进场。我做这个判断是有依据的不是标题党式的烟雾弹。目前以TyG为主题词的公开研究已经有数千条但具体到TyG×HGB或者直接在命名上用TyHGB的我检索下来两位数都不到很多还是动物实验或者小样本临床研究。中国人群大队列里用CHARLS做TyG相关研究的论文很多然而真正做到TyHGB这个复合指标、并且放进中老年社区队列去验证长期结局的几乎是一页纸都翻不满的状态。不过这里要说句公道话蓝海意味着机会也意味着你需要自己填坑。没有现成的文献给你担保公式定义没有现成的切点更没有现成的路径图。好处是你先把文章发出去定义权和话语权在你手里后续别人跟进都得引你的文章坏处是如果审稿人对指标构造质疑你得有完整的敏感性分析和生物学解释去接招。这也是我写这篇文章的动因把整套方案梳理清楚减少后进场者的重复踩坑。2. CHARLS数据库解析从变量拿到样本2.1 CHARLS能提供什么要说清楚TyHGB在CHARLS上怎么落地得先让大家对这个数据库有个全局画面。CHARLS全称是中国健康与养老追踪调查是一个面向45岁及以上中老年人的全国性纵向队列。基线是2011年覆盖了全国150个县级单位、450个村级单位大约1.7万人的样本规模。后续又有2013、2014生命历程调查、2015、2018、2020多轮追访随访数据一直在更新。为什么CHARLS适合做TyHGB理由很直白它既有完整的血检数据又有人口学、慢性病史、生活方式、体力活动、认知功能等丰富协变量还能通过随访数据做前瞻性队列分析。你要的甘油三酯、空腹血糖、血红蛋白都在血检模块里你要的结局信息比如新发糖尿病、心血管事件、死亡也都能在后续随访文件里撞出来。对于没有足够资源做自有队列的研究者来说CHARLS就是做代谢指标验证的黄金平台数据免费可申请样本量够随访年份够机制变量够多。另外一点CHARLS的抽样设计是多阶段分层整群抽样不是简单随机抽样。这意味着你的估计必须考虑抽样权重、分层变量和整群效应否则结论可能偏。很多人跑公共数据库时把数据当成简单随机样本来用审稿人不提则以一提就可能被要补一大堆东西。后面我会专门说这个。2.2 关键变量对应关系与单位陷阱做CHARLS最痛苦的部分就是把不同模块的数据拼起来。我建议把所有变量按功能分类整理成一张速查表这能省掉大量反复翻代码书的痛苦。变量所属模块官方代码书中的典型变量名单位说明空腹血糖Blood-Based Biomarkers我实际使用中通常用血液样本数据里的BC_GLU或类似字段常见为mg/dL但也有版本直接给mmol/L必须逐波核对甘油三酯Blood-Based Biomarkers我习惯查血检结果表里的TG字段常见为mg/dL同理注意版本差异血红蛋白Blood-Based Biomarkers血常规相关模块里的HGB字段常见为g/L少数文件为g/dL注意除以或乘以10年龄Demographics常用出生年份或年龄字段岁性别Demographics性别字段1/2编码务必对照代码书腰围/体重/身高Anthropometrics体格测量模块厘米/公斤注意异常值清洗结局事件Health Status / Death Module自报疾病或死亡记录复合慢性病字段需自行定义诊断日期单位陷阱必须单独拿出来说。我第一次处理CHARLS血检数据时就吃过亏某些波次的文件里变量标签写的是mg/dL但实际数据分布一看不对劲空腹血糖动辄两三百明显不是正常血糖的尺度。后来和同行核对才发现那批数据实际是mmol/L。如果你用mmol/L的数值直接套进TyG公式去和mg/dL的TG相乘整个指标分布直接崩掉。处理这些问题没有捷径只能是每一波数据都把血糖、TG、HGB的分布拉出来看分位数和公认的中老年人群参考范围做一个逻辑比对确认单位没问题再进计算流程。2.3 数据清洗与样本筛选的实操流程CHARLS数据的清洗一般分四条线人口学基线、体格测量、血检生化、随访结局。我这里给一个适合TyG研究的通用工作流。第一步把基线人口学变量、体格测量变量、血检变量按个人ID合并。CHARLS的个人ID是跨模块唯一标识符merge键记得用字符型别让前导零丢失。第二步严格定义你的分析人群。做TyG与代谢结局研究时我一般会排除以下对象基线年龄小于45岁的基线时已经被医生明确诊断过糖尿病的正在使用降糖药或胰岛素治疗的以及血检关键变量TG、FBG、HGB任一缺失的。为什么排糖尿病因为确诊糖尿病之后生活方式、药物使用、血糖波动都会大幅改变TyG的临床解释基线就带病的人群不适合做新发结局分析。当然如果你做的结局不是新发糖尿病而是心血管事件或死亡那糖尿病人可以保留只是必须把基线糖尿病史作为调整变量放进模型。第三步做体格变量的异常值清洗。身高体重这块CHARLS原始数据相对干净但腰围存在个别极端值BMI超过45或者低于15的我建议要么删掉要么做敏感性分析。第四步判断是保留单波数据做横断面还是拼接多波数据做纵向队列。做纵向分析时以2011年为基线用2013、2015、2018、2020各波的自报新发疾病作为结局。这里要特别留意受访者失访问题CHARLS的失访率中等基本可控但一定要在方法部分写清楚排除失访/缺失结局后最终纳入的样本量变化。3. TyHGB的计算与代码实现3.1 计算公式与单位统一TyHGB目前没有写进教科书的标准公式但根据我已验证过的数据和文献规律最值得推荐的构造方式是乘积式复合也就是TyHGB TyG × HGB其中HGB采用g/dL单位。为什么要乘积式TyG-BMI的套路证明了这种形式可行且审稿人熟悉血红蛋白和BMI一样都是正偏态、越界分布相对少乘积后指标的变异度和区分度都更好。当然我强烈建议你在正式分析前做至少两种变体的敏感性分析比如同时算一下TyGHGB加法式和一个按中位数二分后的高TyG-高HGB联合分类变量三个版本结果方向一致文章才能无懈可击。实际计算步骤分两段。第一段计算TyG公式里要求TG和FBG都是mg/dL所以如果你的CHARLS数据里血糖是mmol/L先乘以18得到mg/dLTG是mmol/L的话乘以88.57得到mg/dL。第二段拿到HGB如果原始数据是g/L直接除以10转成g/dL再与TyG相乘。我拿一组典型数值走一遍过程。假设某人的TG150 mg/dLFBG100 mg/dLHGB14 g/dL。那么TyGln(150×100/2)ln(7500)≈8.92TyHGB8.92×14≈124.9。如果同一个样本你错误地用mmol/L的血糖5.6直接算TyG就变成ln(150×5.6/2)ln(420)≈6.04TyHGB就变成约84.6后面的整个分配和模型系数全变样。单位换算没做好一切白搭。3.2 R代码写一个完整计算流程R代码我直接贴实际验证过的版本你在CHARLS数据上跑通后换NHANES或者别的库也只需要改变量名。library(dplyr) library(survey) # 假设已把基线数据读入dat关键变量为 # GLU_mmol 空腹血糖(mmol/L), TG_mmol 甘油三酯(mmol/L), HGB_gL 血红蛋白(g/L) dat - dat %% mutate( # 单位统一血糖 mmol/L - mg/dL乘18 FBG_mgdl GLU_mmol * 18, # 甘油三酯 mmol/L - mg/dL乘88.57 TG_mgdl TG_mmol * 88.57, # 血红蛋白 g/L - g/dL除10 HGB_gdl HGB_gL / 10, # 计算 TyG TyG log(TG_mgdl * FBG_mgdl / 2), # 计算 TyHGB乘积式 TyHGB TyG * HGB_gdl ) # 看一下分布是否合理 summary(dat$TyG) summary(dat$TyHGB) # 如果做加权分析定义复杂抽样设计 # psus 初级抽样单位, strata 分层变量, weight 基线权重 design_obj - svydesign( ids ~psu_id, strata ~strata_id, weights ~baseline_weight, data dat, nest TRUE )这段代码里有两个点要特别说明。第一单位换算系数我用的是18和88.57不是粗略的四舍五入。血糖从mmol/L转mg/dL最常见的系数是18.016乘18在流行病学研究中完全够用但你如果连这个都要被审稿人挑刺就统一写18.016。甘油三酯的分子量按885.7来换算系数就是88.57。第二TyG取ln是自然对数不是以10为底的对数很多临时抱佛脚的代码用log10算算出来的分布形状完全不同所有阈值和系数随之变味这个错误出现过太多次了。3.3 复合指标的分布特征与分组方法算完TyHGB之后先别急着往回归模型里塞花三分钟看一下它的分布特征。从我在CHARLS实际算出来的结果看TyHGB基本服从一个偏态不严重的近似正态分布均值大概在100~130之间波动标准差约20左右具体数值依赖你纳入人群的年龄结构和代谢状况。这个分布形态意味着你可以很舒服地把它当连续变量用进线性回归和Cox模型。但应用层面的回答往往需要分组。这个人群类别怎么分目前文献里处理TyG类复合指标最通用的是三分位或四分位数组。我个人的偏好是优先按三分位数分组因为中老年队列里代谢指标分布尾部较厚四分位会容易出现低组和高组样本量失衡。如果你希望文章有临床转化价值也可以按受试者工作特征曲线去找约登指数对应的最优切点把人群分成低危和高危两组。这里有一个细节值得提醒分组方式直接影响结论的显著性。同一个数据按三分位数分组和按临床切点分组出来的风险比可能有差异尤其当复合指标与结局的关系不是完全线性时。我的建议是主分析按三分位分组展示趋势性P值P for trend敏感性分析用连续变量和两分组几个口径结果一致文章就站稳了。4. 研究设计怎么搭从横断面到队列分析4.1 暴露分组与结局选择TyHGB作为一个新指标拿到手里之后第一个能快速出的成果是横断面关联分析。你可以把TyHGB四分位分组作为暴露看它和代谢综合征组分、非酒精性脂肪肝风险、慢性肾脏病患病风险之间是否独立相关。这种文章的优势是工作量小、周期短但劣势是因果推断力度弱近年来的高分期刊越来越不爱收纯横断面文章。我更推荐做前瞻性队列研究。结局选择优先级这样排全因死亡排在最高位因为CHARLS的死亡模块相对完整且死亡事件是硬终点审稿人挑不出太多毛病新发糖尿病排在第二但你要做这个结局就得严格排除基线糖尿病患者而且要拿到足够长的随访期从2011年到2020年将近10年样本量足够支撑新发心血管事件排在第三这个结局在CHARLS里主要是自报的医生诊断心脏病和中风自报有一定的错分风险但流行病学上还算可以接受排在后面的还可以做认知功能下降CHARLS里有简易精神状态检查表数据。核心的原则是如果主要结局是新发事件基线期的现患病例必须排除。做全因死亡结局时如果受访者在基线调查时自报身体很差或者正在住院建议要么排除要么做亚组分析否则易受反向因果干扰。4.2 统计模型的构建顺序统计模型这块是最容易拉开文章档次的地方。我一般建议模型构建分四步走和大部分高分文章保持一致。第一步粗模型只纳入TyHGB暴露不做任何调整。这个模型的目的是展示总效应结果通常表现为高风险比但也可能因为混杂被压平甚至反转客观上帮助你看清楚数据结构。第二步最小调整模型纳入年龄、性别两个基本人口学变量。这两个变量是所有模型的基础底盘哪怕后面加入再多的协变量核心结论不应该因为年龄性别的调整而剧变。如果加入年龄和性别后效应量突然消失或者倍增说明你的指标和这两个基本变量之间纠缠很深要回头查分布。第三步多因素调整模型在第二步基础上加入收缩压、体质指数、腰围、吸烟饮酒史、受教育程度、居住地等。这个模型是主分析模型重点看TyHGB的效应是否独立于传统代谢风险因素。这里有一个潜在问题如果用步进式回归自动筛选变量容易把TyHGB的独立性筛掉。我建议手工指定协变量不要用自动选择。第四步如果在做生存分析模型要选Cox比例风险回归并检验比例风险假定。TyHGB随时间变化的可能性不小如果发现比例风险假设不满足有两种处理办法一个是把TyHGB拆解成时间依赖型协变量另一个是使用限制性立方样条Cox回归建模非线性剂量反应关系。后者还能顺带生成一张漂亮的剂量反应图很能打动审稿人。4.3 效应修饰与交互作用分析复合指标的复合价值在于它可能存在不同亚组里的差异效应。我在处理TyG类复合指标时的经验是性别、年龄组、体质指数分层、是否贫血这四个亚组最值得预先划分。性别为什么值得做铁代谢和血红蛋白水平本身存在显著的性别差异绝经前女性和男性血红蛋白谷值明显不同而TyHGB里把HGB直接乘进去其分布天然受性别影响。如果整体人群里效应量中等但女性亚组效应很强或者反过来这会成为文章非常有价值的发现点。年龄组的分层意义在于中老年代谢状态随年龄变化剧烈。建议把人群按65岁切分成中老年两组分别跑模型然后检验交互项P值。交互项P值小于0.05才敢说存在统计学上的效应修饰否则就只能描述亚组趋势。贫血亚组需要特别用心。因为TyHGB里含有血红蛋白如果一个人是严重贫血HGB极低TyHGB也极低但贫血本身是很多不良健康结局的风险因素这就造成一个悖论TyHGB低反而风险升高。这种U型甚至倒U型关联在不少复合指标中会出现解决方式是把基线血红蛋白过低的人群男性HGB低于130g/L、女性低于120g/L按临床常用标准单独分出来做敏感性分析或者干脆排除后重跑主模型。没有做这一步处理审稿人很容易迎面就是一记低TyHGB组包含了大量贫血患者请解释混杂。5. 实操中的常见问题与排查技巧5.1 单位换算踩过的坑与新指标核对清单单位换算的问题我再加一层重点说明。跑CHARLS这种多波次数据库最大的危险在于不同波次的变量单位不一致。我自己遇到过某波次的甘油三酯数据在某次更新后被调整为mmol/L而代码书对着旧版本还是写的mg/dL。后来我学乖了每次合并数据后都会做三件事第一单独把基线无糖尿病人群的中位数和四分位数拉出来比对中老年中国人群空腹血糖中位数如果在5.0~5.8mmol/L附近说明是mmol/L读数如果在90~104mg/dL附近说明是mg/dL读数第二甘油三酯中位数如果在120~150mg/dL附近就比较合理超过300就该怀疑单位了第三血红蛋白中位数男性在140~160g/L、女性在120~140g/L附近才算正常。这些逻辑比对比任何代码书都可靠。5.2 血红蛋白异常的极端值与缺失值处理血红蛋白这个变量的缺失率在CHARLS里不算太高但仍然存在。处理缺失值我建议首选完整案例分析也就是直接把关键变量缺失的观测删掉因为关键变量缺失率如果低于10%这样做对偏倚的影响可以忽略。如果你觉得删掉太多样本可惜可以用多重插补但多重插补在复杂抽样设计下的实现要小心插补模型里要放进抽样权重和分层变量否则插补出的数据仍然有偏。极端值的处理上血红蛋白低于60g/L或高于200g/L的个案我建议直接剔除或极端缩尾。这类值在社区队列里多数是检测误差或者录入错误留在数据里会对TyHGB的分布尾部造成不成比例的影响。有人主张保留极端值做敏感性分析那也是合理的但主分析应该先清理掉明显不可能的值。5.3 复杂抽样设计与权重问题的常见误解CHARLS的抽样权重问题是我见过最多人做错的地方。很多人眼睛只盯着暴露和结局变量完全忽略了CHARLS是多阶段分层抽样设计。你在分析时如果不加权重、不考虑分层、不指定初级抽样单元点估计可能差异不大但标准误大概率被低估显著性检验天然偏乐观。换句话说你的P值可能本来就应该是0.06因为忽略了抽样设计变成0.04文章发表后如果被复核数据的人发现非常尴尬。在R语言里用survey包处理很简单按我前面代码里的svydesign设置好psu、strata和weight后面所有统计量都基于这个设计对象做就没问题。做亚组分析时放到svyby里分组处理做Cox回归用svycoxph。不少审稿人看到你的方法部分写了account for complex sampling design会直接放心一半。5.4 审稿人会盯上的几个敏感点新指标的文章最容易被审稿人质疑的永远是这五件事指标构造的合理性、指标分布和切点的来源、关联的因果方向、贫血或低血红蛋白的反向解释、以及结局定义的可靠性。应对策略我一个个说透。指标构造合理性你需要在方法部分引用TyG原始文献和TyG-BMI类复合指标的既往研究说清楚你的乘积式构造是同类方法的自然延伸同时提供加法式和联合分类式的敏感性分析结果。切点来源不要随便编一个数字用三分位数做主分析用ROC最优切点做辅助两个来源在讨论部分解释清楚即可。因果方向问题通过排除基线现患病例和做一个反向分析来回应比如用TyHGB预测未来事件的同时检查基线事件不反向预测随访时的TyHGB变化。贫血的解药就是我前面提到的排除贫血人群敏感性分析。结局定义可靠性这块CHARLS的自报医生诊断虽然普遍采用但建议在敏感性分析里只定义由医生诊断且正在接受治疗的病例错分风险更小。最后再分享一个非常实用的细节。你要是想做亚组分析的森林图一定保证每个亚组的事件数达到两位数。CHARLS虽然样本量不小但分到某一年龄段的男性吸烟组里事件数可能掉到个位数这种亚组结果在审稿人眼里等于废纸。做之前先拉个表看每个亚组的事件数宁可合并亚组也绝不放空值分析。我自己的体会是TyHGB这类复合指标能不能跑出来关键不在统计方法有多炫而在前面的数据细节有没有较真。单位、缺失、抽样设计这三关过了文章就成功了一半。如果你也准备拿CHARLS做这个方向建议从横断面关联先写一篇热身把指标的可解释性摸透再放长线去做纵向队列后面发挥的空间还很大。