信息速览
CARDIA 是美国国家心肺血液研究所(NHLBI)在 1985 年启动的一项前瞻性社区队列,全称 Coronary Artery Risk Development in Young Adults,中文常译作「青年成人冠状动脉风险发展研究」。它在伯明翰、芝加哥、明尼阿波利斯、奥克兰四个现场入组了五千一百余名 18–30 岁的黑人与白人男女,此后每隔数年回访一次,至今已完成十轮检查,最新一轮的检查数据覆盖到 2020–2022 年。它的设计初衷很朴素:冠心病的病理过程在临床症状出现前几十年就已开始,如果只在四十岁以后才开始观测,看到的永远是半场之后的事。
它的核心资产是「同一批人的前半生」。基线时受试者平均二十出头,到第十轮检查时已是五十三至六十五岁,中间横跨了求学、就业、生育、迁居、吸烟与戒烟、体重上升与代谢紊乱这一整段人生。检查内容包括标准化体检、问卷、生化、口服葡萄糖耐量试验、肺功能,以及在特定轮次加做的 CT 钙化评分、超声心动图、颈动脉超声、骨密度与脑 MRI;另有全基因组基因型、DNA 甲基化、代谢组与蛋白组的子样本。
获取路径有两条且互不替代:表型数据走 BioLINCC(编号 HLB00030026a),遗传数据走 dbGaP,两者都要提交申请、签署协议,商业用途受分级限制。本篇写的是「青年入组」这一侧的队列,与库内已发布的中年入组队列形成前后接续关系,两者的分工在 §6.2 逐项说明。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | Coronary Artery Risk Development in Young Adults |
| 资助与管理 | NHLBI 资助,协调中心设于阿拉巴马大学伯明翰分校 |
| 基线年份 | 1985–1986 |
| 入组人数 | 5,115 人 |
| 入组年龄 | 18–30 岁 |
| 抽样设计 | 种族 × 性别 × 教育 × 年龄四格配额平衡 |
| 现场 | 伯明翰、芝加哥、明尼阿波利斯、奥克兰 |
| 检查轮次 | 十轮,Year 0 至 Year 35 |
| 随访跨度 | 三十五年(1985–2022),Year 40 在推进 |
| 主要影像 | CT 钙化评分三轮、超声心动图三轮、脑 MRI 两轮 |
| 组学 | 全基因组基因型、甲基化、代谢组、蛋白组子样本 |
| 生物样本 | 血清、血浆、DNA,随表型数据一并申请 |
| 获取途径 | BioLINCC(表型)/ dbGaP(遗传) |
| 许可 | 数据使用协议,商业使用分级限制 |
§1 它要解决的具体麻烦
1.1 你要的是「危险因素从哪一年开始偏离」,不是「今年谁有病」
大多数心血管数据集回答的是横截面问题:这一万人里,血压高的人冠脉钙化是不是更重。这个问题用一次调查就能答,样本越大越好,CARDIA 在这条赛道上并不占优——它只有五千人。它占优的是另一类问题:一个人二十三岁时低密度脂蛋白一百一十,三十三岁一百四十,四十三岁一百六十五,这条曲线在哪个节点开始脱离同伴,脱离之后二十年又对应什么样的钙化轨迹。
这类问题的分母不是「人数」,而是「人 × 次数」。五千人做十轮,理论上有五万个观测点,而真正稀缺的是「同一个人在四个不同年龄上被同一套方案量过」这件事。任何横截面调查,无论样本多大,都无法重建这条曲线;任何电子病历数据库,无论覆盖多广,都无法保证四十年前的测量方法今天还一致。
所以它的定位可以一句话概括:它不是用来估计患病率的,是用来估计轨迹的。把这两件事混起来,是误用的第一来源。
1.2 三条常见的错误期待
第一条期待是「五千人的样本应该能代表美国青年」。不能。四个现场是刻意选的,不是随机抽的,伯明翰与芝加哥的黑人社区、明尼阿波利斯的白人社区、奥克兰的健保会员群体,各自带着强烈的地方色彩。官方从未声称全国代表性,任何把 CARDIA 的患病率直接当作全国估计的做法都站不住。
第二条期待是「既然做了三十五年,每个人应该被量了十次」。也不是。十轮是项目层面的轮次,个体层面的到场次数取决于参与意愿、迁居、健康状况。后期轮次的到场人数明显少于基线,剩下的人是「愿意继续来且还活着」的那部分。这让后期数据在健康维度上偏优,而不是偏劣。
第三条期待是「有基因组就能做孟德尔随机化」。可以,但要看工具变量的来源。CARDIA 的基因型样本是子样本,暴露变量的测量轮次与基因型批次要能对上,且 dbGaP 的受控访问不含表型主表,需要另行申请链接。把「有基因数据」等同于「可以随手做 MR」,会在数据到手的第一周就卡住。
| 常见期待 | 实际情况 | 后果 |
|---|---|---|
| 代表全美青年 | 四现场便利样本,仅黑白两种族 | 患病率外推失效 |
| 人人十次随访 | 个体到场次数差异很大 | 面板数据不平衡,需用混合模型 |
| 有基因即可做 MR | 基因与表型分属两套审批 | 链接申请额外耗时 |
| 影像人人都有 | CT 与超声只在子样本 | 影像分析样本量骤降 |
| 变量名一致即可合并 | 跨轮次方法与单位有变更 | 纵向比较出现系统偏差 |
| 事件即为诊断编码 | 事件由委员会判定并附日期 | 需按判定规则而非 ICD 取数 |
1.3 它能给到的与给不到的
下表按「你带着什么需求来」组织,左列是需求,中列是它能提供的形态,右列是够不够用。
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 青年期危险因素的多次测量 | 十轮,间隔 2–5 年不等 | 够,且是全球少有的密度 |
| 亚临床动脉粥样硬化的客观指标 | 三轮 CT 钙化评分,Agatston 单位 | 够,但只有三个时点 |
| 心脏结构与功能的纵向变化 | 三轮超声心动图,含左室质量与应变 | 基本够,轮次不连续 |
| 心血管事件终点 | 委员会判定的事件与日期 | 够,但中年段事件数有限 |
| 基因—环境交互 | 全基因组基因型 + 三十五年暴露轨迹 | 够,样本量是瓶颈 |
| 多组学整合 | 甲基化、代谢组、蛋白组子样本 | 部分够,各层样本不完全重叠 |
| 全国或特定族群的代表性估计 | 无 | 不够,需换用 NHANES 类数据 |
| 儿童期暴露 | 无,入组时已成年 | 不够,最早只能回溯到自报的童年情况 |
| 亚裔、拉丁裔结论 | 无 | 不够,队列不含这两个群体 |
| 影像原始像素 | 不提供 DICOM,仅提供读片结果 | 不够,做影像组学要另找数据 |
最后一行值得单独说。CARDIA 提供的是钙化评分、左室质量、射血分数这类读片后的数值,不是可供深度学习直接消费的影像文件。这与影像类数据集是两种物种:前者适合做流行病学与风险建模,后者适合做分割与检测。把它们混为一谈,会在下载后发现「没有一张图」。
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 想证明某危险因素在青年期就已埋下后果 | 提供从十八岁起的暴露轨迹与中年结局 | 先定结局,再回推需要的轮次 |
| 手上有一个中年队列,缺前半段 | 可作为前置段拼接,但需对齐测量口径 | 逐条核对血压、血脂、吸烟定义 |
| 做心血管风险预测模型,缺长期随访 | 提供三十五年的事件时间与协变量 | 注意事件数,避免过拟合 |
| 研究健康差异,需要同方案双种族对照 | 四个现场内黑白同招、同方案 | 把现场作为随机效应 |
| 做钙化进展的影像遗传学 | 三轮钙化 + 基因型 + 多年暴露 | 确认三轮都到场者才是分析集 |
| 想快速做一次探索性分析 | 申请周期以月计,不适合临时起意 | 先用公开摘要与文献摸清结构 |
| 企业要做产品验证 | 商业使用受分级限制 | 提前走协商,不要假设可用 |
表中第二行是这类队列最常见的用法,也是最容易出问题的地方。拼接不是把两张表按年龄对齐就完事:CARDIA 的血压是三次读数的均值,ARIC 是两次;CARDIA 的血脂在早期用酶法、后期换过平台;吸烟问题在不同轮次的选项数不同。口径不一致时,宁可在拼接处留一个「队列」虚拟变量,也不要用一套换算公式硬对齐。
1.5 一句话判断
如果你要回答的是「危险因素怎样在人生前半程积累」,它是目前最好的公开队列之一;如果你要回答的是「这个人群现在病了多少」,它几乎帮不上忙。
1.6 不适合谁:四条边界
| 边界 | 具体表现 | 替代方案 |
|---|---|---|
| 要全国代表性 | 四现场、双种族、非概率抽样 | NHANES、NHIS 一类全国调查 |
| 要老年结局 | 队列到 2022 年才六十岁上下 | ARIC、Framingham、CHARLS |
| 要影像原始文件 | 只给读片数值 | 影像类公开数据集 |
| 要即时可用 | 申请加审批以月计 | 已开放下载的整理版数据集 |
第一条边界最容易被忽视。研究者看到「美国」「社区」「四个现场」这些词,容易默认它具有全国代表性,但 CARDIA 的抽样从一开始就是为了组间对比而不是总体推断:每个现场按种族、性别、教育、年龄四格配额招人,保证每一格里都有足够的人,代价是整体比例被人为设定。
第二条边界与 §6 的分工直接相关:CARDIA 的受试者在 2022 年刚进入六十岁,正是 ARIC 基线时的年纪。要研究七十岁以后的事,得换队列。
第三条边界对做深度学习的人尤其重要:这里没有 DICOM,只有数值。
§2 数据构成与规格
2.1 一次检查不是一张表,而是十几个模块
CARDIA 的数据组织方式是「按轮次分目录、按模块分文件」。每一轮检查会产生几十个数据文件:体检模块(血压、身高体重、腰围)、生化模块(血脂、血糖、胰岛素)、问卷模块(吸烟、饮酒、膳食、体力活动、心理量表)、影像模块(钙化、超声、颈动脉)、以及各类衍生变量文件。同一个概念在不同模块里可能以不同变量名出现,官方为此维护了跨轮次的变量对照表。
这意味着「下载数据」在实操中等于「下载一个几百个文件的压缩包,再花两周读字典」。这不是缺陷,是纵向队列的常态:三十五年里测量工具换过、问卷改过、实验室平台换过,强行做成一张宽表反而会掩盖这些变化。
规模上,基线是 5,115 人;到第十轮,累计观测记录数远大于人数。文件体积官方未在公开页面给出统一数字,实际取决于申请的数据子集——只要表型主表与只看几个模块,体积差一个数量级。
2.2 字段与模块的完整字典
下表按模块列出主要内容与采集轮次。轮次用 Y 加年份编号,Y0 为基线。
| 模块 | 主要内容 | 采集轮次 | 备注 |
|---|---|---|---|
| 人口学 | 出生日期、性别、种族、教育、婚姻、收入 | 全部轮次 | 教育与收入逐轮更新 |
| 人体测量 | 身高、体重、腰围、臀围、皮褶 | 全部轮次 | 方案统一,设备逐轮校准 |
| 血压 | 三次读数、体位、袖带规格、用药 | 全部轮次 | 取均值,附用药清单 |
| 血脂 | 总胆固醇、LDL、HDL、甘油三酯 | 全部轮次 | 早期酶法,后期平台更换 |
| 血糖 | 空腹血糖、胰岛素、OGTT 两小时血糖 | Y0 起多数轮次 | 糖耐量试验非每轮 |
| 炎症与凝血 | 纤维蛋白原、CRP、白细胞 | 部分轮次 | 批次差异需注意 |
| 吸烟 | 现状、起始年龄、包年、戒烟 | 全部轮次 | 选项数逐轮扩充 |
| 饮酒 | 频次、种类、量 | 全部轮次 | 自报,存在低估 |
| 膳食 | CARDIA 膳食史访谈 | Y0、Y7、Y20 等 | 访谈式,非简表 |
| 体力活动 | 自报问卷 + 加速度计子样本 | 问卷全轮,设备 Y20/Y30 | 两种口径不可混用 |
| 肺功能 | FEV1、FVC | 多数轮次 | 需按种族身高校正 |
| 体成分 | DXA 全身扫描 | 数个轮次 | 子样本 |
| 冠脉钙化 | Agatston 评分、体积、密度 | Y15、Y20、Y25 | 中心读片 |
| 超声心动图 | 左室质量、射血分数、舒张功能、应变 | Y5、Y25、Y30 | 设备与读片标准有变更 |
| 颈动脉超声 | 内中膜厚度、斑块 | 数个轮次 | 子样本 |
| 脑 MRI | 白质高信号、灰质体积、弥散指标 | Y25、Y30 | 样本较小 |
| 认知 | DSST、Stroop、RAVLT 等 | Y5 起多轮 | 测验组合逐轮调整 |
| 基因型 | 全基因组芯片、外显子芯片 | 单次采集 | 经 dbGaP 申请 |
| 表观遗传 | DNA 甲基化芯片 | 两个轮次 | 子样本 |
| 代谢组 | 靶向与非靶向 | 子样本 | 平台分批 |
| 蛋白组 | 适配体法面板 | 子样本 | 约三千人量级 |
| 事件 | 心血管事件、死亡、住院 | 持续判定 | 附日期与判定依据 |
这张表最该被记住的是最后两列的落差:加粗的模块人人都有,斜体的模块只有子样本。实际做分析时,样本量往往由最稀缺的那个模块决定,而不是由基线人数决定。
2.3 一条记录的完整解剖
把一位受试者在某一轮的全部变量摊开,形态大致如下。为便于阅读,这里用扁平的键值形式表示,真实文件是宽表 CSV,一行一位受试者。
{
"PID": "0000-0000",
"EXAM": 25,
"EXAM_DATE": "2010-06-14",
"AGE_AT_EXAM": 49,
"SEX": "F",
"RACE": "B",
"CENTER": "BIRMINGHAM",
"EDU_LEVEL": "some_college",
"WEIGHT_KG": 78.4,
"HEIGHT_CM": 165.2,
"BMI": 28.7,
"WAIST_CM": 92.1,
"SBP_MEAN": 124,
"DBP_MEAN": 78,
"BP_MEDS": "yes",
"TOTAL_CHOL": 196,
"LDL": 118,
"HDL": 52,
"TRIG": 128,
"GLUCOSE_FAST": 102,
"HBA1C": 5.7,
"SMOKE_STATUS": "former",
"PACK_YEARS": 8.5,
"CAC_AGATSTON": 68,
"CAC_VOLUME": 61,
"LV_MASS_G": 142,
"LVEF": 62,
"EVENT_CHD": 0,
"EVENT_DATE": null,
"DAYS_FROM_BASELINE": 9125
}
几个细节值得说明。第一,AGE_AT_EXAM 是衍生变量,官方文件里通常同时给出生日期与检查日期,用两者相减更稳,因为跨轮次的年龄字段偶尔会按整年取整。第二,BP_MEDS 不是一个可有可无的标记,血压分析必须决定是否对服药者做校正,否则治疗会系统性地压低暴露值。第三,CAC_AGATSTON 的零值与缺失值必须分开编码:零是「扫了,没钙化」,缺失是「没扫或不可判读」,把两者混在一起会把阴性结果变成缺失。
§4.3 的案例会把这条记录放回时间轴上看,届时可以看出单个时点的数字几乎没有意义,意义全在相邻两次之间的差。
2.4 十轮检查的时间账
| 轮次 | 日历年 | 受试者大致年龄 | 该轮的重点新增 |
|---|---|---|---|
| Y0 | 1985–1986 | 18–30 | 基线全套,四格配额入组 |
| Y2 | 1987–1988 | 20–32 | 短期重复测量,评估可靠性 |
| Y5 | 1990–1991 | 23–35 | 超声心动图首次加入 |
| Y7 | 1992–1993 | 25–37 | 膳食史访谈扩展 |
| Y10 | 1995–1996 | 28–40 | 体成分与胰岛素相关测量 |
| Y15 | 2000–2001 | 33–45 | CT 钙化评分首次加入 |
| Y20 | 2005–2006 | 38–50 | 钙化复查、加速度计子研究 |
| Y25 | 2010–2011 | 43–55 | 钙化第三次、脑 MRI 首次 |
| Y30 | 2015–2016 | 48–60 | 超声复查、认知组合扩展 |
| Y35 | 2020–2022 | 53–65 | 听力、体能、脑 MRI 复查 |
这张表里最容易读错的是「Y15 是 2000 年」。轮次编号是「距基线的年数」,不是「第几次检查」,所以 Y15 是 2000–2001 年,而不是 2000 年减十五。把它当成「第十五次检查」更是错得离谱——一共只有十轮。
第二个容易读错的地方是间隔不均。Y0 到 Y2 隔两年,Y2 到 Y5 隔三年,Y10 到 Y15 隔五年,Y30 到 Y35 隔五到七年(疫情影响了 Y35 的窗口)。做纵向模型时,时间变量必须用实际检查日期,不能用轮次编号当等距时间。
第三个细节是年龄跨度。每一轮的年龄区间是「基线年龄 + 轮次年数」,所以同轮之内年龄差仍有十二岁。这意味着「同轮同期」的两个人可能相差十二岁,任何以轮次为单位的分析都在混合不同年龄的人。
2.5 与同类资源的字段差异
| 字段大类 | CARDIA | ARIC | Framingham | UK Biobank |
|---|---|---|---|---|
| 入组年龄 | 18–30 | 45–64 | 成年起多代 | 40–69 |
| 检查轮次 | 10 | 9 | 30 余 | 多次但间隔长 |
| CT 钙化 | 3 次 | 有限 | 有子研究 | 有 |
| 超声心动图 | 3 次 | 有 | 有 | 有子集 |
| 脑 MRI | 2 次(小样本) | 有 | 有 | 有(大样本) |
| 全基因组 | 有(子样本) | 有 | 有 | 有(全员) |
| 生物样本库 | 有 | 有 | 有 | 有 |
| 事件判定 | 委员会 | 委员会 | 委员会 | 登记链接为主 |
| 原始影像 | 不提供 | 不提供 | 不提供 | 部分提供 |
差异的实质是「密度换广度」:CARDIA 用五千人换了十轮,UK Biobank 用五十万人换了一次详细基线。前者适合问「变化」,后者适合问「关联」。两者不是替代关系,是分工关系。
§3 核心层 A:它到底是一个什么样的队列
3.1 青年入组这一个决定,解释了其余一切
1983 年立项时,CARDIA 的发起者面对的是一个具体的空白:framingham 那一代研究已经把中年以后的危险因素与冠心病的关联摸得很清楚,但没人知道这些危险因素是什么时候开始变坏的。二十岁时的胆固醇能不能预测四十岁时的钙化?三十岁时的吸烟史在戒烟十五年后还留下多少痕迹?这些问题的共同前提是「从年轻时就开始量」。
于是整个设计被一个决定锁死:入组年龄定在 18–30 岁。这个决定带来了三个连锁后果。
第一,基线时几乎没有临床事件。这批人太年轻,冠心病、心衰、卒中的发病率接近于零,所以早期的研究产出只能靠危险因素本身和亚临床指标,不能靠硬终点。这也是为什么钙化评分在 Y15 才加入——等到 2000 年,最年长的受试者已经四十五岁,钙化才开始有足够的变异。
第二,随访必须足够长才有事件。三十五年之后,这批人五十三到六十五岁,事件才逐渐累积到可以做生存分析的量级。这意味着 CARDIA 的「收获期」是最近十年才到来的,前二十年它主要在做测量而不是做结局。
第三,退出与失访的形态不同于老年队列。年轻人迁居频繁、生活变动大,早期失访率高;但一旦进入中年,稳定性上升,长期参与者的黏性反而变强。这造成一个反直觉的现象:Y2 到 Y10 的到场率下降明显,Y15 之后反而相对平稳。
3.2 四格平衡:配额抽样留下的痕迹
官方对设计的表述是:样本按种族、性别、教育(高中及以下 / 高中以上)、年龄(18–24 / 25–30)四个维度做到大致平衡,且四成受试者的教育程度不超过高中。这句话看起来是描述,实际是约束——它规定了每一格必须招够人,而不是按自然比例随机抽。
| 设计维度 | 分层 | 目的 |
|---|---|---|
| 种族 | 黑人 / 白人 | 保证组间可比,不是按人口比例 |
| 性别 | 男 / 女 | 每格内性别平衡 |
| 教育 | 高中及以下 / 高中以上 | 保留社会经济梯度 |
| 年龄 | 18–24 / 25–30 | 覆盖青年期两端 |
| 现场 | 四个 | 地理与医疗体系差异 |
这个设计的直接后果是:CARDIA 里高中及以下教育者的比例远高于同代美国青年的自然比例。这不是抽样失误,是刻意为之——如果按自然比例抽,低教育组的人数会少到无法做分层分析。代价是任何「按教育加权的总体估计」都会失真。
第二个后果是种族与现场的交叉不均衡。四个现场里,伯明翰与芝加哥承担了较多的黑人受试者,明尼阿波利斯与奥克兰以白人为主。这导致「种族效应」与「现场效应」在统计上部分共线,做分层分析时若不控制现场,很容易把地方差异读成种族差异。
3.3 时间轴上的两次扩张:从血脂到生命历程
把三十五年拉成一条线,可以看到研究重心变过两次。
第一次是 1985 到 1995 年,主题是危险因素的自然史。这一阶段的产出集中在血压、血脂、体重、吸烟的分布与变化,方法是重复测量加描述。这段时期的数据干净、问题明确,也是很多教科书图表的来源。
第二次是 1995 到 2010 年,主题转向亚临床疾病。钙化评分、超声心动图、颈动脉超声、CT 体成分陆续加入,研究问题从「危险因素是多少」变成「危险因素造成了多少器质性改变」。这一阶段的关键词是「亚临床」,即在症状出现前识别损害。
第三次是 2010 年之后,主题转向生命历程与健康差异。脑 MRI、认知、听力、体能、社会经济轨迹进入视野,研究问题变成「前半生的处境如何塑造后半生的功能」。这一阶段的 CARDIA 不再只是心血管队列,而是一个老龄化与健康不平等的观测平台。
| 阶段 | 年份 | 主题 | 代表测量 |
|---|---|---|---|
| 第一期 | 1985–1995 | 危险因素自然史 | 血压、血脂、吸烟、体重 |
| 第二期 | 1995–2010 | 亚临床疾病 | 钙化、超声、颈动脉、体成分 |
| 第三期 | 2010–至今 | 生命历程与差异 | 脑 MRI、认知、听力、体能 |
这三次转向对使用者的意义是:同一个数据集在不同年份的「主变量」不同。如果你要的是 1990 年代的膳食数据,它有,但配套的结局很少;如果你要的是 2020 年的认知数据,它有,但配套的影像样本很小。选轮次等于选问题。
3.4 它与「全国代表性调查」的差别
NHANES 一类的调查每两年一轮,每轮换一批人,靠加权估计全国分布。CARDIA 相反:同一批人反复来,不做加权,不追求分布无偏。
| 维度 | CARDIA | NHANES 类调查 |
|---|---|---|
| 抽样 | 四现场配额 | 全国多阶段概率 |
| 个体随访 | 三十五年 | 无(横截面) |
| 加权 | 不适用 | 必需 |
| 优势问题 | 变化、轨迹、因果时序 | 患病率、分布、趋势 |
| 主要偏倚 | 志愿者与幸存者 | 无应答与测量误差 |
理解了这一层,就不会拿 CARDIA 去做「美国青年高血压患病率」这类题目,也不会拿 NHANES 去做「二十年间同一个人的血压变化」。
§4 核心层 B:质量从哪里来
4.1 中心实验室与中心读片
CARDIA 的质量控制不是靠某一个环节,而是靠「测量与判读分离」这条流水线。血液样本在四个现场采集后冷链送到中心实验室,用同一套方法测;影像在四个现场采集后送到中心读片室,由不知道受试者临床信息的读片人判读。现场只负责「采得对」,不负责「测得准」。
这条流水线解决的是多中心研究最古老的问题:不同地方的人用不同的手法量同一个东西。血压袖带规格、身高计校准、超声探头角度、CT 扫描参数,任何一处不统一,都会在数据里留下一个「现场效应」,而这个效应在分析时往往被误读成「地区差异」。
| 环节 | 现场负责 | 中心负责 | 留下的风险 |
|---|---|---|---|
| 采血 | 采集、离心、冻存、冷链 | 统一检测、批次质控 | 冻存时长差异 |
| 血压 | 三次读数、袖带选择 | 方案制定、培训 | 操作者手法 |
| CT | 扫描参数执行 | 钙化评分判读 | 设备代际差异 |
| 超声 | 图像采集 | 左室质量与功能测量 | 探头与软件版本 |
| 问卷 | 访谈执行 | 量表设计与编码 | 访谈者效应 |
表格最后一列是诚实的部分:中心化能消掉测量端的差异,消不掉采集端的差异。同一个钙化评分方案,2000 年的扫描仪和 2010 年的扫描仪在噪声特性上不同,这在做钙化进展分析时是一个真实的混杂来源,官方在不同轮次的读片说明里有相应提示。
4.2 影像与组学是分层放的
CARDIA 的测量不是「人人都做全套」,而是按成本与侵入性分层。问卷与体检全员做,血液生化全员做,CT、超声、MRI、DXA 只在子样本做,基因型与多组学只在有样本且同意的人里做。
| 层级 | 覆盖范围 | 代表测量 | 分析影响 |
|---|---|---|---|
| 全员 | 全部到场者 | 问卷、体检、常规生化 | 样本量最大 |
| 子样本(大) | 数千人 | CT 钙化、超声心动图 | 需考虑选择偏倚 |
| 子样本(小) | 数百至数千 | 脑 MRI、多组学 | 统计效力受限 |
| 单次采集 | 部分受试者 | 基因型、甲基化 | 与表型的重叠需核对 |
分层带来的第一个实际问题是分析集的定义。做钙化进展,分析集不是「基线五千人」,而是「三轮 CT 都到场且可判读的人」。这个数字官方没有在概览页给出,需要从各轮的技术报告里拼,通常在两三千人量级。做影像遗传学,分析集是这三个集合的交集,往往只剩一千多人。
第二个问题是选择偏倚的方向。愿意做 CT、愿意做 MRI、愿意提供血样做组学的人,系统性地更健康、教育程度更高、更可能是白人。这让子样本的关联估计通常比全样本「更干净」但也「更不代表性」。写论文时如果把子样本结果当作全队列结论,审稿人第一个问题就会是「你的分析集是怎么选的」。
4.3 案例:一位 1986 年 24 岁的伯明翰受试者
下面这条轨迹是按官方数据结构拼出的合成示例,不对应任何真实受试者,但每一个变量的形态都来自真实数据的组织方式。它用来说明一件事:CARDIA 的价值不在任何一个时点,而在时点之间的斜率。
1985 年冬,这位女性在伯明翰现场完成基线检查,24 岁,黑人,社区大学在读,体重 62 公斤,身高 165 厘米,血压 112/70,总胆固醇 172,低密度脂蛋白 104,不吸烟,每周运动两次。这一年的数据放进任何横截面里都平平无奇。
1992 年(Y7),她 31 岁,体重 71 公斤,低密度脂蛋白 128,开始吸烟,每天半包。1995 年(Y10),体重 76 公斤,血压 124/78,糖耐量试验两小时血糖 138。2000 年(Y15),38 岁,戒烟三年,CT 钙化评分为 0,超声左室质量指数正常。
2005 年(Y20),43 岁,钙化评分 12。2010 年(Y25),48 岁,钙化评分 68,血压 132/84,开始服用降压药,脑 MRI 显示少量白质高信号。2015 年(Y30),53 岁,钙化评分未再做,超声显示左室质量指数上升,舒张功能轻度减退。2020 年(Y35),58 岁,认知测验的 DSST 分数比同龄常模低半个标准差,听力在高频段下降。
| 时点 | 年龄 | 体重 | LDL | 收缩压 | 钙化 | 关键事件 |
|---|---|---|---|---|---|---|
| Y0 | 24 | 62 | 104 | 112 | 未测 | 基线 |
| Y7 | 31 | 71 | 128 | 118 | 未测 | 开始吸烟 |
| Y10 | 34 | 76 | 136 | 124 | 未测 | 糖耐量受损 |
| Y15 | 38 | 79 | 130 | 128 | 0 | 戒烟 |
| Y20 | 43 | 82 | 124 | 130 | 12 | 钙化出现 |
| Y25 | 48 | 84 | 118 | 132 | 68 | 开始降压 |
| Y30 | 53 | 85 | 112 | 128 | 未测 | 舒张功能减退 |
| Y35 | 58 | 84 | 110 | 126 | 未测 | 认知与听力下降 |
这张表里有三处是单点数据永远看不出来的。第一,低密度脂蛋白在 Y7 到 Y10 之间冲高,之后因为她戒烟与改变饮食而回落——如果只看 Y25 的 118,会误以为她一直血脂正常。第二,钙化从 0 到 12 用了五年,从 12 到 68 又用了五年,进展速度在加快,这正是「进展」这个词的实质。第三,降压药开始的时间点恰好落在钙化加速之后,如果分析时不区分「用药前血压」与「用药后血压」,会把治疗效应读成自然史。
§5.5 会说明怎么把这条轨迹变成一个可分析的变量;§7.3 会说明这类轨迹在统计上最容易踩的坑。
4.4 质量控制的五个抓手
| 抓手 | 做法 | 作用 |
|---|---|---|
| 统一方案 | 现场操作手册逐条规定 | 减少执行差异 |
| 集中培训 | 各轮开始前集中认证 | 减少操作者漂移 |
| 中心读片 | 影像集中判读,读片人盲法 | 消除判读偏倚 |
| 批次质控 | 实验室每批 insert 质控样本 | 监测检测漂移 |
| 数据核查 | 逻辑校验与异常值回查 | 拦截录入错误 |
五个抓手之外还有一条隐性的:轮次之间的可比性维护。当测量方法必须改变时(设备停产、试剂换代),CARDIA 的做法通常是在过渡轮次做桥接(bridging)——同一批人用新旧两种方法各测一次,用差值校正。这套做法在数据文档里有记录,但记录分散在各轮的技术报告里,不集中。
4.5 它的特色:把「年龄」当成自变量
大多数队列把年龄当协变量,CARDIA 把年龄当自变量。因为入组时年龄跨度是 18–30 岁,同一轮检查里既有二十二岁的人也有三十四岁的人,这就给了横截面上「年龄效应」的识别空间;而纵向上的重复测量又给了「队列效应」与「时期效应」的识别空间。三者合起来,是经典的年龄—时期—队列分解所需要的结构。
| 效应 | 识别来源 | 在 CARDIA 中的可行性 |
|---|---|---|
| 年龄效应 | 同一轮内不同年龄的横截面 | 可行,跨度十二岁 |
| 队列效应 | 不同出生年的受试者 | 有限,出生年跨度仅十二年 |
| 时期效应 | 同一轮次对所有人的共同冲击 | 可行,轮次即时期 |
需要提醒的是,出生年跨度只有十二年,队列效应的识别力很弱。想做强队列对比,得把 CARDIA 和出生代差二十年的 ARIC 放在一起——这正是 §6.2 要说的事。
§5 核心层 C:怎么把数据拿到手
5.1 三条路径,先分清哪条通向什么
| 路径 | 通向什么 | 门槛 | 周期 |
|---|---|---|---|
| BioLINCC | 表型数据、部分生物样本 | 提交申请、签数据使用协议 | 数周至数月 |
| dbGaP | 基因型、测序数据 | eRA 账号、机构签署、受控访问 | 数月至更久 |
| 协调中心 | 衍生变量说明、 ancillary 研究 | 提交分析提案或 ancillary 申请 | 视提案而定 |
第一条路径是主路径。BioLINCC 上 CARDIA 的编号是 HLB00030026a,标注为开放研究(Open BioLINCC Study),意思是任何符合条件的研究者都可以申请,不需要是 CARDIA 合作者。但「开放」不等于「无条件」:要签数据使用协议,要说明研究用途,商业使用受分级同意限制。
第二条路径是遗传数据。CARDIA 的基因型数据放在 dbGaP,走受控访问流程,需要机构层面签署数据使用认证,且不能与表型主表直接合并——链接需要额外审批。这一点在实操中经常被低估。
第三条路径适合已经有明确分析计划、需要衍生变量或想参与 ancillary 研究的人。协调中心维护了一份衍生变量清单,很多常用变量(如心血管健康评分、代谢综合征判定)已经有官方版本,直接用手册里的定义比自己做更省事,也更容易通过审稿。
5.2 BioLINCC 申请的实际步骤
流程本身不复杂,复杂的是准备材料。下面这段代码做的是「申请前自检」:把你要的分析变量列出来,逐条标注来自哪一轮、哪个模块,提前发现缺项。
#-- 申请前把变量需求整理成清单,避免批下来才发现缺变量
import csv
from pathlib import Path
need = [
("SBP_MEAN", "Y0,Y5,Y10,Y15,Y20,Y25,Y30,Y35", "体检"),
("LDL", "Y0,Y5,Y7,Y10,Y15,Y20,Y25,Y30", "生化"),
("CAC_AGATSTON", "Y15,Y20,Y25", "影像"),
("LV_MASS_G", "Y5,Y25,Y30", "影像"),
("SMOKE_STATUS", "全部", "问卷"),
("EDU_LEVEL", "Y0,Y5,Y10,Y20,Y30", "问卷"),
]
out = Path("cardia_var_request.csv")
with out.open("w", newline="", encoding="utf-8") as f:
w = csv.writer(f)
w.writerow(["variable", "exam_years", "module", "priority"])
for i, (v, yrs, mod) in enumerate(need, 1):
w.writerow([v, yrs, mod, "high" if i <= 3 else "medium"])
#-- 打印一份人读版,附在申请说明里
for v, yrs, mod in need:
print(f"{v:16s} {mod:4s} {yrs}")
print("total variables:", len(need))
这段代码的价值不在技术含量,而在它强迫你把「我要什么」写成一张表。BioLINCC 的申请表单会问研究问题、分析计划、变量清单,提前整理好能省掉一轮来回。
提交之后通常会有一次澄清(数据管理员会问某些变量是否真的需要),然后签署协议、拿到下载链接。下载的是压缩包,内含各轮数据文件与文档,文件命名规则在不同年份略有差异,读之前先看目录里的 readme。
5.3 dbGaP 这一侧要注意什么
遗传数据的申请与表型数据是两套体系。dbGaP 的受控访问要求机构签署数据使用认证,PI 需要有 eRA Commons 账号,审批通过后通过 SRA Toolkit 或云平台取数。取到的是基因型文件与样本层面的协变量,不含你从 BioLINCC 拿到的表型主表。
#-- 检查基因型文件与表型文件的样本编号能否对上
import pandas as pd
geno = pd.read_csv("cardia_geno_samples.txt", sep="\t", dtype=str)
pheno = pd.read_csv("cardia_pheno_y25.csv", dtype=str)
#-- dbGaP 的样本编号与 CARDIA 内部编号通常需要一张对照表
xwalk = pd.read_csv("sample_subject_xwalk.csv", dtype=str)
merged = geno.merge(xwalk, on="SAMPLE_ID", how="left")
merged = merged.merge(pheno, on="SUBJECT_ID", how="left")
print("genotyped samples:", len(geno))
print("mapped to subject:", merged["SUBJECT_ID"].notna().sum())
print("with y25 phenotype:", merged["CAC_AGATSTON"].notna().sum())
第三个数字通常远小于第一个,这就是现实:基因型样本、表型样本、影像子样本三者的交集,往往只有一千多人。做影像遗传学之前先算这个交集,比做完分析才发现样本不够要好。
5.4 变量字典与轮次对齐
跨轮次分析的第一件事不是建模,是造一张「变量 × 轮次」的可用性矩阵。官方文档里有这张表,但它分散在各轮的代码本里,需要自己拼。
#-- 把各轮数据读成长表,保留轮次标记,再拼成面板
import pandas as pd
from pathlib import Path
frames = []
for exam, fname in [(0, "y0.csv"), (5, "y5.csv"), (10, "y10.csv"),
(15, "y15.csv"), (20, "y20.csv"), (25, "y25.csv"),
(30, "y30.csv"), (35, "y35.csv")]:
p = Path("cardia") / fname
if not p.exists():
continue
df = pd.read_csv(p, low_memory=False)
df["EXAM"] = exam
frames.append(df)
panel = pd.concat(frames, ignore_index=True, sort=False)
panel["EXAM_DATE"] = pd.to_datetime(panel["EXAM_DATE"], errors="coerce")
panel["DOB"] = pd.to_datetime(panel["DOB"], errors="coerce")
panel["AGE_AT_EXAM"] = (panel["EXAM_DATE"] - panel["DOB"]).dt.days / 365.25
print(panel.groupby("EXAM")["PID"].nunique())
print(panel["AGE_AT_EXAM"].describe())
这段代码里有两个容易忽略的细节。第一,concat 会按列名对齐,不同轮次同名但含义不同的变量会被强行拼在一起——所以拼之前要先改掉那些「名字一样、口径不同」的列名。第二,AGE_AT_EXAM 用日期相减而不是用现成字段,是因为现成字段的取整方式在不同轮次不一致。
5.5 钙化进展与事件时间
钙化评分的分析有一套约定俗成的定义,最常用的是「进展」的复合定义:基线为零的人随访出现任何钙化,或基线在 1–100 之间的人年化增长超过十个单位,或基线超过一百的人年化增长率超过百分之十。这套定义来自 CARDIA 自己的方法学论文,被后续很多研究沿用。
#-- 按常用定义计算两年之间的钙化进展
import numpy as np
import pandas as pd
df = pd.read_csv("cac_three_exams.csv")
wide = df.pivot_table(index="PID", columns="EXAM",
values=["CAC_AGATSTON", "AGE_AT_EXAM"])
base = wide[("CAC_AGATSTON", 15)]
y20 = wide[("CAC_AGATSTON", 20)]
y25 = wide[("CAC_AGATSTON", 25)]
age15 = wide[("AGE_AT_EXAM", 15)]
age25 = wide[("AGE_AT_EXAM", 25)]
follow = y25.fillna(y20)
years = (age25 - age15).where(y25.notna(), np.nan)
years = years.fillna(5.0)
incident = (base == 0) & (follow > 0)
fast_mid = (base > 0) & (base < 100) & ((follow - base) / years >= 10)
fast_high = (base >= 100) & ((follow - base) / base / years >= 0.10)
df_prog = pd.DataFrame({
"PID": wide.index,
"baseline_cac": base.values,
"followup_cac": follow.values,
"progressed": (incident | fast_mid | fast_high).values,
})
print(df_prog["progressed"].mean())
print(df_prog["baseline_cac"].isna().sum())
第三个 print 是在查基线缺失——很多人会忘了「没做 Y15 的 CT」本身就是一个选择事件,直接删掉会让分析集偏向那些一直来的人。§4.3 的案例里那位受试者三轮都做了,属于相对配合的那一类。
5.6 六种常见取数错误
| 错误 | 表现 | 正确做法 |
|---|---|---|
| 把轮次当等距时间 | 直接以 EXAM 编号做时间轴 | 用实际检查日期算间隔 |
| 零值与缺失混同 | 钙化为 0 被当成没做 | 用单独的缺失标记 |
| 忽略用药校正 | 服药者血压被当作自然值 | 加用药虚拟变量或做校正 |
| 用宽表直接回归 | 同一人多次观测被当独立 | 混合模型或广义估计方程 |
| 跨轮次变量同名直拼 | 单位与方法不同被掩盖 | 先建变量对照表 |
| 子样本当全队列 | 影像结论外推到全部人 | 明确分析集并讨论选择偏倚 |
第三种错误在心血管研究里格外常见。降压药会把收缩压压低十到二十毫米汞柱,如果不区分「未治疗的高血压」与「治疗后的正常血压」,暴露与结局的关联会被系统性稀释。标准做法是加一个用药虚拟变量,或者对服药者加一个固定校正值——两种做法各有争议,但都比忽略要好。
§6 与库内词条的关系
6.1 关系图谱
库内的队列类词条已经形成一个谱系,按「入组年龄」排一遍,位置就清楚了。
| 词条 | 入组年龄 | 与 CARDIA 的关系 |
|---|---|---|
| Framingham Heart Study | 成年起,多代 | 心血管队列的源头,方法学祖先 |
| CARDIA | 18–30 | 本篇,青年段 |
| ARIC | 45–64 | 直接接续的中年段,最容易混淆 |
| MESA Sleep | 45–84 | 影像与睡眠分支,多民族 |
| CHARLS | 45 岁以上 | 中国样本,老龄化主题 |
| UK Biobank | 40–69 | 广度换密度,志愿者样本 |
| All of Us | 全年龄 | EHR 为主,随访刚起步 |
| SHHS | 中老年 | 睡眠专项,单域深挖 |
| NHANES 系列 | 全年龄 | 横截面,全国代表性 |
CARDIA 在这张谱系里的独特性是「唯一一个从十八岁开始、且随访超过三十年的公开队列」。Framingham 有更长的随访,但从成年起招募,没有青年段的密集测量;UK Biobank 有更大的样本,但入组时已四十岁;ARIC 的中年段更厚,但看不到三十岁以前。
6.2 与 ARIC 的分工:一段前传与一段正片
这是本篇最需要说清的一节。库内已有 aric 词条,两者都是 NHLBI 资助、都设四个现场、都刻意做成黑人与白人对照,连现场都有一处重叠(明尼阿波利斯),所以最容易被写成同一件事的两种说法。它们不是。
| 维度 | CARDIA | ARIC |
|---|---|---|
| 基线年份 | 1985–1986 | 1987–1989 |
| 入组年龄 | 18–30 | 45–64 |
| 基线人数 | 五千一百余 | 一万五千余 |
| 现场 | 伯明翰、芝加哥、明尼阿波利斯、奥克兰 | 杰克逊、福赛斯县、明尼阿波利斯、华盛顿县 |
| 现场重叠 | 明尼阿波利斯 | 明尼阿波利斯 |
| 种族设计 | 黑白各约一半 | 黑人约占四分之一,含全黑人现场 |
| 检查轮次 | 10 | 9 |
| 随访跨度 | 三十五年 | 三十五年以上 |
| 影像重点 | 钙化、超声、脑 MRI | 颈动脉、心脏、脑 |
| 事件密度 | 中年段偏低 | 中年段高 |
| 监测臂 | 无 | 有社区医院监测 |
第一层区别是人群。CARDIA 的四个现场是伯明翰、芝加哥、明尼阿波利斯、奥克兰;ARIC 的四个现场是杰克逊(密西西比)、福赛斯县(北卡)、明尼阿波利斯(明尼苏达)、华盛顿县(马里兰)。名字重叠的只有明尼阿波利斯一个,且两者在同一个城市招的是不同出生代的人——CARDIA 招的是 1955 到 1967 年出生的人,ARIC 招的是 1923 到 1944 年出生的人。所以「现场重叠」不等于「人群重叠」,这一点必须说清,否则会有人误以为可以按城市把两个队列的人合并。
第二层区别是设计意图。CARDIA 想知道「危险因素在十八到三十岁时怎样起步」,ARIC 想知道「危险因素在四十五岁以后怎样兑现」。一个看前半程的累积,一个看后半程的后果。反映到数据上:CARDIA 的早期轮次危险因素变异大、事件几乎为零;ARIC 的基线就有大量事件,且有一个覆盖四十万人的社区监测臂,用来给事件率提供分母。
第三层区别是随访区间的前后错位。CARDIA 的 Year 0 是 1985 年,ARIC 的基线是 1987 年,但两者的「研究时钟」起点不同:CARDIA 的受试者从二十岁开始被追,ARIC 的从五十岁开始被追。到 2020 年,CARDIA 的受试者五十五岁上下,正好进入 ARIC 基线时的年龄段。这创造了一个有价值的对照结构:同一年龄、不同出生代、不同时期。用 CARDIA 的 2020 年数据与 ARIC 的 1987 年数据比较五十五岁人群的危险因素水平,可以把「时期变化」从「年龄变化」里剥出来——这是单一队列做不到的。
第四层区别是变量深度分布不同。ARIC 的中年影像更全(颈动脉内中膜厚度、心脏、脑),CARDIA 的青年段测量更密(十轮,含三次钙化)。做钙化进展,CARDIA 更合适,因为它有三个时点;做卒中与认知的晚年关联,ARIC 更合适,因为它的老年段更长、事件更多。
第五层区别是不该合并的地方。两个队列的血压测量方案(读数次数、袖带)、血脂检测平台(早期方法不同)、吸烟问卷选项(分类粒度不同)都不完全一致。把两者拼成一个「超级队列」做暴露分析,必须先做测量等值化,并在模型里保留队列虚拟变量。直接按变量名合并,是把两个不同的尺子当成一把。
一句话概括分工:CARDIA 是前半生的观测记录,ARIC 是后半生的兑现记录。要研究「从青年到老年的完整生命历程」,正确做法不是二选一,而是把两者当作两段可拼接的序列,在拼接处显式建模口径差异;要研究单一段内的问题,就选对应的那一个,不要为了「样本更大」而混用。
6.3 检索路径
在库内找与 CARDIA 相邻的词条,可以按标签与关键词两条路走。
#-- 按标签找同类:所有带「队列研究」标签的记录
grep -rl "队列研究" /workspace/qianfanghub-study/writing/*/*_Wikipedia.md | head -20
#-- 找同时涉及钙化与随访的记录
grep -rl "钙化" /workspace/qianfanghub-study/writing/*/*_Wikipedia.md \
| xargs grep -l "随访" | head -20
#-- 找走 BioLINCC 或 dbGaP 的记录,这类通常可以直接对比申请路径
grep -rl "BioLINCC" /workspace/qianfanghub-study/writing/*/*_Wikipedia.md | head -20
检索时注意一个陷阱:标题里带「队列」的词条,未必真的满足队列的三要素(同一批人、至少两次测量、事件日期)。判断标准看正文有没有交代检查轮次与到场人数,而不是看标题。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
看到「三十五年随访」这四个字,最常见的误判是把它读成「数据很完整」。这是一个错位:随访时长描述的是项目存续了多久,不是每个人被观测了多久,更不是每个变量每轮都有。
真实形态是三条收缩同时发生。第一条是人数收缩:每一轮都会有人不再到场,后期轮次的到场人数明显少于基线,剩下的人在健康与教育上系统性偏优。第二条是变量收缩:某些测量只在特定轮次做,比如 CT 只在三个轮次,脑 MRI 只在两个轮次,跨轮次分析时可用的人由最稀缺的那次测量决定。第三条是精度收缩:早期的方法在后来的平台上看是粗糙的,跨轮次比较时旧数据的测量误差会放大。
所以正确的读法是:时间维度很富,横截面维度很薄,变量维度很不均匀。把这三件事分开看,才不会在建模时把「幸存者」当成「代表性」,把「轮次」当成「等距时间」。
7.1 五维评分
| 维度 | 分数 | 依据 |
|---|---|---|
| 规模 | 3/5 | 基线五千余人,在公开队列里属中等;子样本更小 |
| 时间深度 | 5/5 | 三十五年、十轮,青年段密度全球少见 |
| 结局确定性 | 4/5 | 事件由委员会判定并附日期,但中年段事件数有限 |
| 可接入性 | 2/5 | 双轨申请、禁商用、周期以月计 |
| 文档完整度 | 4/5 | 变量字典与检查组件齐全,跨轮次说明分散 |
评分不是排名。规模给三分是因为它的设计目标本来就不是规模,用规模去衡量它是错位的;可接入性给两分是实情,任何需要签协议、等审批的数据源都该拿这个分数。
7.2 DAIMS 维度逐项看
DAIMS 在这里按五件事评估:文档、可及性、完整性、元数据、可持续性。
| DAIMS 维度 | 评级 | 说明 |
|---|---|---|
| Documentation | 良 | 检查组件表、方案手册、数据收集表齐备;跨轮次变更需自行拼合 |
| Accessibility | 中下 | 表型走 BioLINCC,遗传走 dbGaP,商业用途受限 |
| Integrity | 优 | 中心实验室、中心读片、委员会判定三层质控 |
| Metadata | 良 | 变量字典完整,衍生变量有官方版本;部分口径需读技术报告 |
| Sustainability | 优 | 资助延续至 Year 40,协调中心稳定,数据持续更新 |
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 对分析的影响 |
|---|---|---|
| 幸存者偏倚 | 后期轮次只剩较健康者 | 老年段关联被低估 |
| 志愿者偏倚 | 入组者比同社区非入组者更健康 | 发病率略低于真实社区 |
| 地理偏倚 | 四现场非随机 | 不能外推全国 |
| 种族限定 | 仅黑人与白人 | 亚裔、拉丁裔结论缺位 |
| 子样本选择 | 影像与组学非随机 | 影像结论适用人群受限 |
| 测量方法变更 | 设备与平台逐轮更换 | 纵向比较出现系统偏差 |
| 检查间隔不均 | 2 到 7 年不等 | 时间轴需用真实日期 |
| 商业限制 | 协议分级限制 | 产业转化研究无法直接使用 |
§4.3 的案例提示了另一类不容易被写进表格的偏差:用药起始时间与测量时点的错位。那位受试者在 Y25 开始服降压药,如果分析时把 Y25 的血压当作「未治疗血压」,就会低估她真实的暴露水平;如果把 Y30 的血压当作「自然下降」,就会把治疗效应读成疾病缓解。这类错位在电子病历数据里更严重,在 CARDIA 里至少还有用药清单可以核对。
7.4 外部验证矩阵
| 结论类型 | 在 CARDIA 内的证据 | 外部验证情况 |
|---|---|---|
| 青年期 LDL 预测中年钙化 | 强 | 在多个队列中重复 |
| 青年期 BMI 轨迹预测心衰 | 中强 | 在 ARIC、Framingham 中方向一致 |
| 青年期血压与中年认知 | 中 | 在脑影像子研究中部分重复 |
| 钙化进展的预测因子 | 中强 | 在 MESA 等队列中重复 |
| 社会经济地位与心血管风险 | 中 | 在多个国家队列中重复 |
| 听力损失与认知下降 | 中 | 与 ARIC 的发现一致 |
外部验证矩阵的意义不是盖章,而是提示哪些结论已经跨队列稳住、哪些还是单队列发现。用 CARDIA 做训练集时,前两行对应的结局迁移风险最低。
7.5 它为何能持续:一批人愿意被量三十五年
大型队列的常见死法是「人跑光了」。CARDIA 没有,原因不神秘:每轮检查之间保持联系、现场工作人员与受试者长期熟悉、检查内容随年龄调整(年轻时问吸烟饮酒,中年时加问认知与体能),以及一套把「参与」变成习惯的运营。四十年里,最初那批二十多岁的人已经成了六十岁的人,他们回来的理由早已不是「帮一项研究」,而是「这是我自己的记录」。
这套机制也解释了它的数据特征:留下的样本偏向配合度高、健康素养好的人,这既是它能持续的原因,也是它最大的偏倚来源。
§8 生态位与历史
8.1 历史沿革
CARDIA 在 1983 年获得首轮资助,最初的合同期是五年,包含两轮检查。此后靠合同续签一轮一轮延长,每一轮续签都要重新论证科学价值。这个「分段续命」的模式决定了它的形态:不是一次性设计好的四十年计划,而是每五年根据当时的科学热点加入新测量。
| 阶段 | 年份 | 关键决定 |
|---|---|---|
| 立项 | 1983 | 首轮资助,五年两轮检查 |
| 基线 | 1985–1986 | 四现场入组,四格配额 |
| 扩张 | 1990 年代 | 加入超声、体成分、糖耐量 |
| 转型 | 2000 年代 | 加入 CT 钙化,转向亚临床 |
| 扩展 | 2010 年代 | 加入脑 MRI、认知、听力 |
| 延续 | 2020 年代 | Year 35 完成,Year 40 推进 |
8.2 它产出了什么
官方页面称,自 1985 年以来基于 CARDIA 数据的论文超过一千一百篇。这个数字的意义不在多,而在方向:早期论文集中在危险因素的分布与变化,中期转向亚临床疾病与风险预测,近期转向健康差异、认知老化与生命历程。
| 时期 | 主要产出类型 | 代表主题 |
|---|---|---|
| 1985–1995 | 描述性 | 血脂、血压、吸烟的年龄曲线 |
| 1995–2005 | 关联性 | 肥胖、胰岛素抵抗、亚临床改变 |
| 2005–2015 | 预测性 | 钙化、风险评分、心衰 |
| 2015–至今 | 机制与差异 | 认知、脑老化、社会决定因素 |
它也产出了一批方法学遗产:钙化进展的复合定义、青年期危险因素轨迹的建模方法、多队列合并时的口径对齐流程,这些都被后来的研究反复引用。
8.3 生态位:介于「单个小镇」与「全国调查」之间
Framingham 是一个小镇的三代人,深但窄;NHANES 是全国的概率样本,广但浅。CARDIA 在两者之间:四个城市、两个种族、五千人、三十五年。这个位置让它能做前两者都做不了的事——在同一批人身上同时观察种族差异与年龄变化。
| 类型 | 代表 | 深度 | 广度 | 适用问题 |
|---|---|---|---|---|
| 单镇家系 | Framingham | 极深 | 窄 | 家族聚集、长期自然史 |
| 多中心双种族 | CARDIA、ARIC | 深 | 中 | 种族差异、生命历程 |
| 全国概率样本 | NHANES | 浅 | 广 | 患病率、分布 |
| 超大型志愿者 | UK Biobank | 中 | 极广 | 遗传关联、风险预测 |
8.4 治理与资金
CARDIA 由 NHLBI 以合同方式资助,协调中心设在阿拉巴马大学伯明翰分校,四个现场各有自己的研究团队。数据与样本的对外分发由 NHLBI 的数据仓库体系承担,遗传数据由 dbGaP 承担。治理上有一套委员会结构:指导委员会、各分委员会、出版物委员会,任何使用数据的研究在投稿前要经过出版物的合规审查。
这套治理对使用者的实际影响是:申请时要写清研究问题,论文投稿前可能要提交审查,涉及 CARDIA 合作者的署名有约定。这些规则写在官方页面与出版物政策里,读一遍能省掉很多往返。
§9 使用指引
9.1 三种角色的路径
| 角色 | 最短路径 | 主要风险 |
|---|---|---|
| 流行病学研究者 | BioLINCC 申请表型 → 按轮次建面板 → 混合模型 | 到场人数下降导致的选择偏倚 |
| 临床心血管研究者 | 聚焦钙化与超声子样本 → 结合事件 | 子样本量小,事件数不足 |
| 数据科学 / 建模者 | 先用文献与衍生变量清单摸结构 → 再申请 | 误以为有原始影像 |
第一类人最容易犯的错是把 CARDIA 当成普通的面板数据,用固定效应模型直接跑,忽略检查间隔不均。第二类人最容易犯的错是低估事件数:中年段的事件密度不高,做预测模型时正例可能只有几百个。第三类人最容易犯的错是期待 DICOM——§2.5 已经说明,这里只给读片数值。
§4.3 的案例可以当作一个检验:把你打算建的模型套在那条轨迹上,看看它在 Y15 时能不能只用前四轮的数据预测出 Y20 的钙化。如果做不到,说明你选的变量不够或者时间窗不对。
9.2 一条最短的可用流程
从零到能跑第一个模型,最短的路径大致是这样。
#-- 第一步:确认研究问题与所需轮次,写成变量清单
python3 build_var_request.py
#-- 第二步:向 BioLINCC 提交申请,等审批与下载链接
#-- 第三步:解压后先读 readme 与代码本,不要急着 read_csv
ls cardia_download/
head -50 cardia_download/README.txt
#-- 第四步:读入、对齐、生成分析集
import pandas as pd
files = {
0: "y0.csv", 5: "y5.csv", 10: "y10.csv", 15: "y15.csv",
20: "y20.csv", 25: "y25.csv", 30: "y30.csv", 35: "y35.csv",
}
frames = []
for exam, name in files.items():
df = pd.read_csv(f"cardia_download/{name}", low_memory=False)
df["EXAM"] = exam
frames.append(df)
panel = pd.concat(frames, ignore_index=True, sort=False)
#-- 第五步:定义分析集(三轮 CT 都到场者)
cac = panel[panel["EXAM"].isin([15, 20, 25])]
keep = cac.groupby("PID")["CAC_AGATSTON"].apply(lambda s: s.notna().all())
analysis_ids = keep[keep].index
print("analysis set:", len(analysis_ids))
第五步的这个交集,通常只有两三千人。接受这个数字,是使用 CARDIA 的第一课:它的样本量从来不体现在基线的五千人上,而体现在「经过三轮筛选后还剩多少人」上。
9.3 引用方式
学术引用以官方指定的格式为准,通常引用基线设计论文与所用的具体数据版本。数据本身应注明来源为 NHLBI BioLINCC 与 CARDIA 协调中心,并注明数据获取编号与获取日期;使用遗传数据时另需注明 dbGaP 研究编号与审批号。方法部分建议写明所用的检查轮次与年份,而不是只写「CARDIA 数据」——因为不同轮次的样本与变量差别很大,不写清楚无法复现。
§10 AI 使用声明
| 项目 | 内容 |
|---|---|
| 文本生成 | 由大语言模型依据官方页面与论文摘要起草,经人工核对数字 |
| 数字来源 | CARDIA 官方站、BioLINCC 研究页、UAB 协调中心文档页、Europe PMC 论文摘要 |
| 未核实项 | dbGaP 研究编号、逐轮到场的精确人数,见附录 B |
| 代码 | 示例为通用写法,变量名按官方命名习惯推测,运行前须对照下载的代码本 |
| 图像 | 无真实图像,封面为生成式插画提示词 |
| 判断性内容 | 评分与区隔判断为编辑意见,非官方结论 |
| 更新机制 | 官方发布 Year 40 数据或修订文档时重核数字 |
| 责任边界 | 使用前以官方页面与数据使用协议为准 |
常见误读
| 常见说法 | 实际 | 证据 |
|---|---|---|
| CARDIA 和 ARIC 是同一个研究的两批数据 | 人群、年龄、现场、随访区间均不同 | 两者基线年份与入组年龄不同,仅明尼阿波利斯重叠 |
| 随访三十五年等于每人被量十次 | 个体到场次数差异很大 | 后期轮次到场人数明显少于基线 |
| 五千人可代表美国青年 | 四现场配额抽样,仅黑白两种族 | 官方设计说明为平衡分组而非概率抽样 |
| CT 钙化每轮都做 | 只有 Y15、Y20、Y25 三轮 | 后续轮次无 CT 记录 |
| 有基因组就能直接做 MR | 基因与表型分属两套审批 | dbGaP 受控访问不含表型主表 |
| 可以下载原始 CT 影像 | 只提供读片后的评分与测量值 | 数据文档中无 DICOM |
| 轮次编号就是检查次数 | 编号是距基线的年数 | Y15 对应 2000–2001 年 |
| 检查间隔是等距的 | 2 到 7 年不等 | 各轮日历年可查 |
| 商业机构可以申请使用 | 商业使用受分级同意限制 | BioLINCC 页面明确标注 |
| 加入新测量说明老数据被替换 | 新旧测量并存,需桥接校正 | 各轮技术报告有桥接说明 |
FAQ
Q1:CARDIA 与 ARIC 最本质的区别是什么?
入组年龄。CARDIA 在 1985–1986 年招 18–30 岁的人,ARIC 在 1987–1989 年招 45–64 岁的人。前者记录危险因素如何起步,后者记录它如何兑现。现场名字只重叠明尼阿波利斯一个,且招的是不同出生代。
Q2:基线到底多少人?
官方口径为五千一百一十五人,BioLINCC 与协调中心页面一致。后续轮次的到场人数逐轮下降,官方未在概览页给出逐轮数字。
Q3:CT 钙化有几次,分别在哪一年?
三次,分别在 Year 15(2000–2001)、Year 20(2005–2006)、Year 25(2010–2011)。此后轮次没有再安排 CT,所以钙化进展分析最多只有三个时点。
Q4:为什么入组要按四格配额,而不是随机抽?
为了让每个比较组都有足够的人。随机抽的话,低教育组、黑人组的人数会少到无法做分层分析。代价是整体比例被人为设定,不能用来估计总体分布。
Q5:数据申请要多久?
表型数据通过 BioLINCC 申请,通常在数周到数月;遗传数据通过 dbGaP 受控访问,周期更长,且需要机构签署数据使用认证。两者分别审批,不能相互替代。
Q6:可以只用 Year 25 的横截面数据吗?
可以,但那样就浪费了这个队列的核心价值。单轮数据在横截面上并不比全国调查更强,样本还更小。用它就该用它的纵向结构。
Q7:子样本有多少人?
没有统一的数字。钙化三轮都到场且可判读的人通常在两三千人量级,脑 MRI 与多组学更小。做任何子样本分析前,先用主键算一次交集。
Q8:变量名跨轮次一样,可以直接合并吗?
不可以直接合并。同名变量的测量方法、单位、编码可能变过,合并前要读代码本并做单位换算。官方的跨轮次变量对照表是必读材料。
Q9:能不能用来做深度学习的影像模型?
不能直接做。数据里没有 DICOM,只有读片后的数值(钙化评分、左室质量等)。要训练影像模型得另找有原始影像的数据集。
Q10:论文里该怎么写数据来源?
写清 BioLINCC 编号、CARDIA 协调中心、使用的检查轮次与年份、数据获取日期。只写「CARDIA 数据」不够,因为不同轮次的样本与变量差别很大。
Q11:如果我想同时用 CARDIA 和 ARIC,要注意什么?
先做测量等值化:血压读数方案、血脂检测平台、吸烟问卷选项三项必须逐条核对;在模型里保留队列虚拟变量;不要假设两个队列的人在同一个城市就同质。
术语表
| 术语 | 含义 |
|---|---|
| CARDIA | 青年成人冠状动脉风险发展研究 |
| 检查轮次(Exam) | 一次全队列回访,编号为距基线的年数 |
| Y0 | 基线检查,1985–1986 |
| Y35 | 第十轮检查,2020–2022 |
| Agatston 评分 | CT 钙化的标准量化指标,单位为任意单位 |
| 钙化进展 | 钙化评分随时间上升,按复合定义判定 |
| 亚临床 | 尚无临床症状但已有器质性改变的阶段 |
| 左室质量指数 | 左室质量除以体表面积,反映心脏重构 |
| 中心读片 | 影像集中到读片中心统一判读 |
| 桥接校正 | 测量方法更换时用同批样本建立换算关系 |
| 四格配额 | 按种族、性别、教育、年龄分层招满的设计 |
| 子样本 | 只在部分受试者中采集的测量 |
| 面板数据 | 同一批人在多个时点的重复观测 |
| 混合效应模型 | 同时估计固定效应与个体随机效应的模型 |
| 幸存者偏倚 | 后期只剩健康者导致的系统性偏差 |
| 志愿者偏倚 | 愿意参加者比非参加者更健康 |
| 选择偏倚 | 进入分析集的样本不代表目标人群 |
| 事件时间 | 从基线到结局发生的时间,用于生存分析 |
| 人年 | 随访人数乘以随访年数,事件率的分母 |
| 时期效应 | 同一时期对所有出生代的共同影响 |
| 队列效应 | 不同出生代之间的系统性差异 |
| 测量等值化 | 让不同来源的测量可以比较的处理 |
| DAIMS | 文档、可及、完整、元数据、可持续五维评估框架 |
| dbGaP | 美国基因型与表型数据库,受控访问 |
| BioLINCC | NHLBI 生物样本与数据仓库 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 基线年份 | 1985–1986 | 官方站、BioLINCC | 官方 |
| 基线人数 | 5,115 | 官方站、BioLINCC | 官方 |
| 入组年龄 | 18–30 岁 | 官方站、BioLINCC | 官方 |
| 现场数 | 4 | 官方站 | 官方 |
| 现场名单 | 伯明翰、芝加哥、明尼阿波利斯、奥克兰 | 官方站 | 官方 |
| 教育构成 | 四成不超过高中 | BioLINCC | 官方 |
| 检查轮次 | 10(Y0–Y35) | 官方站与论文摘要 | 官方 + 论文 |
| 随访跨度 | 三十五年(至 2022) | BioLINCC | 官方 |
| CT 钙化轮次 | Y15、Y20、Y25 | 论文摘要 | 论文 |
| 超声轮次 | Y5、Y25、Y30 | 论文摘要 | 论文 |
| 脑 MRI 轮次 | Y25、Y30 | 论文摘要 | 论文 |
| 可申请数据 | 检查数据至 Y35,结局至 2022 | BioLINCC | 官方 |
| 附属研究 | 28 项可申请 | BioLINCC | 官方 |
| 论文数 | 一千一百余篇 | 官方站 | 官方 |
| 商业使用 | 分级限制 | BioLINCC | 官方 |
| dbGaP 编号 | phs000285 | 官方遗传数据页链接 | 未逐字复核 |
附录 B:数字的来源分层
第一层:官方页面。 基线人数、年龄、现场、检查轮次、随访跨度、可申请数据范围、附属研究数量、商业使用限制,均来自协调中心官方站与 BioLINCC 研究页。这些数字在两处一致,可以放心引用。
第二层:论文摘要。 CT 钙化的三个轮次与对应年份、超声与脑 MRI 的轮次、Y35 到场者的年龄区间、Y25 胸部 CT 的样本规模,来自公开论文摘要。这些数字与官方检查组件表的方向一致,但具体年份边界以官方文档为准。
第三层:未核实。 dbGaP 的确切研究编号与版本号、逐轮到场的精确人数、基因型样本的准确数量、各子样本的交集规模。这些数字要么需要登录才能看到,要么分散在技术报告里,本篇没有逐一核对,正文中相应位置已标注「官方未在同一页面给出」或类似措辞。
分层的意义不是免责,而是让使用者知道哪些数字可以直接写进论文的方法部分,哪些需要自己再核一次。
附录 C:完整参考文献
- CARDIA 官方站,研究概览与研究者入口,https://sites.uab.edu/cardia/
- CARDIA 官方站,研究信息与检查组件文档,https://sites.uab.edu/cardia/for-researchers/study-information/
- NHLBI BioLINCC,CARDIA 研究页(编号 HLB00030026a),https://biolincc.nhlbi.nih.gov/studies/cardia/
- CARDIA 基线专著(Baseline Monograph),协调中心发布
- 冠脉钙化进展与中年认知功能的 CARDIA 研究论文摘要(Europe PMC)
- 生命早期心血管风险轨迹与中年钙化进展的 CARDIA 研究论文摘要(Europe PMC)
- CARDIA 睡眠附属研究设计与方法论文摘要(Europe PMC)
- CARDIA Year 35 听力与血糖关联研究论文摘要(Europe PMC)
- 美国国家心肺血液研究所 CARDIA 项目说明页
- dbGaP 中 CARDIA 遗传数据入口(经官方站链接跳转)
引用时以官方页面为最终依据,论文摘要用于补充官方概览页未列出的轮次细节。
附录 D:任务代码
下面这段代码把「变量清单 → 分析集 → 描述统计」串成一条可运行的最小流水线,适合在拿到数据的第一天跑一遍,确认结构符合预期。
#-- 最小流水线:清单、读入、分析集、描述统计
from pathlib import Path
import pandas as pd
BASE = Path("cardia_download")
FILES = {0: "y0.csv", 5: "y5.csv", 10: "y10.csv", 15: "y15.csv",
20: "y20.csv", 25: "y25.csv", 30: "y30.csv", 35: "y35.csv"}
def load_panel(base: Path, files: dict) -> pd.DataFrame:
frames = []
for exam, name in files.items():
p = base / name
if not p.exists():
continue
df = pd.read_csv(p, low_memory=False)
df["EXAM"] = exam
frames.append(df)
panel = pd.concat(frames, ignore_index=True, sort=False)
panel["EXAM_DATE"] = pd.to_datetime(panel["EXAM_DATE"], errors="coerce")
panel["DOB"] = pd.to_datetime(panel["DOB"], errors="coerce")
panel["AGE"] = (panel["EXAM_DATE"] - panel["DOB"]).dt.days / 365.25
return panel
panel = load_panel(BASE, FILES)
print("rows:", len(panel), "subjects:", panel["PID"].nunique())
#-- 每轮人数与年龄中位数,用来确认轮次对齐正确
summary = (panel.groupby("EXAM")
.agg(n_subject=("PID", "nunique"),
age_median=("AGE", "median")))
print(summary)
#-- 三轮 CT 都到场的人,才是钙化进展的分析集
cac_exams = [15, 20, 25]
has_all = (panel[panel["EXAM"].isin(cac_exams)]
.groupby("PID")["CAC_AGATSTON"]
.apply(lambda s: s.notna().sum() == len(cac_exams)))
ids = has_all[has_all].index
print("cac analysis set:", len(ids))
#-- 导出分析集的主键,供后续与基因型、影像子样本求交
pd.Series(ids, name="PID").to_csv("cac_analysis_ids.csv", index=False)
跑通之后,第一个要看的是每轮人数曲线:它应该单调下降但不应断崖,如果某一轮骤降,多半是文件缺失或者合并键写错了。
附录 E:如果只记五件事
- 基线是 1985–1986 年的五千一百余名 18–30 岁黑人与白人,四个现场,四格配额。
- 十轮检查跨三十五年,CT 钙化只有三次(Y15、Y20、Y25),超声三次,脑 MRI 两次。
- 表型走 BioLINCC,遗传走 dbGaP,商业使用受分级限制,周期以月计。
- 它与 ARIC 的分工是青年段与中年段:一个记录危险因素如何起步,一个记录它如何兑现;现场只重叠明尼阿波利斯,人群不同。
- 它的强项是轨迹不是分布,用它估计患病率是错位使用。
编辑说明
本篇的事实核对完成于 2026 年 10 月,核对方式为直接访问 CARDIA 协调中心官方站与 NHLBI BioLINCC 研究页,辅以 Europe PMC 的论文摘要。凡官方两处一致的数字,按官方口径记录;凡只有论文摘要支持的轮次细节,在附录 A 标注来源层级。未核实项已在附录 B 单列,不作推断。
篇幅上刻意压缩了分布类统计:本页不提供各变量的百分位、缺失率、标签频次。这类数字随数据版本变化,且需要下载全量数据才能得到,写进来只会过期。需要这类信息的分析者应在拿到数据后自行统计,并以官方代码本为准。
关于与 ARIC 的区隔:两者同属 NHLBI 四中心设计,现场有一处重叠,极易被合并叙述。本篇在 §6.2 用五个维度逐项拆开,并在多处强调「现场重叠不等于人群重叠」。若后续库内新增同源队列词条,应以同样的方式在各自 §6 中声明分工,避免重复介绍同一套设计原理。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- aric — 共享标签:队列研究 / 心血管疾病 / 公共卫生与流行病学 / GWAS
- dep-eas-gwas — 共享标签:队列研究 / 公共卫生与流行病学 / GWAS
- mesa — 共享标签:队列研究 / 心血管疾病 / 公共卫生与流行病学
- framingham — 共享标签:队列研究 / 心血管疾病 / 公共卫生与流行病学
- china-map — 共享标签:队列研究 / 公共卫生与流行病学 / GWAS
- superagers-family-study — 共享标签:队列研究 / 公共卫生与流行病学 / GWAS
- ckb — 共享标签:队列研究 / 公共卫生与流行病学
- nki-rockland — 共享标签:队列研究 / 公共卫生与流行病学
- all-of-us — 共享标签:队列研究 / 公共卫生与流行病学
- chns — 共享标签:队列研究 / 公共卫生与流行病学
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

