信息速览
NHEFS 是 NHANES I 流行病学随访研究的缩写。它在 1971–1975 年那批做过体检的美国人身上,一路追到 1992 年,把当时的血压、血清胆固醇、膳食记录,与二十年后的住院、入养老院和死亡证书,放回同一个人的同一条记录里。
这件事在公开数据里并不常见。绝大多数队列要么只公开基线、要么只公开随访结果,要么两个都公开却没有可核对的统一编号。NHEFS 三样都有:统一编号、逐轮随访、死亡结局。它因此成为少数能在没有许可门槛的情况下,直接做「基线暴露 → 长期死亡」设计的公开数据。
一屏速览见下表。
§1 它到底是什么
§1.1 一句话定义
NHEFS 是 NCHS 与美国国家老龄研究所(NIA)联合发起的国家级纵向研究,队列由 NHANES I 中所有完成医学检查、年龄在 25–74 岁之间的人组成(官方页面给出的 n = 14,407),随后在 1982–1984、1986、1987、1992 四轮随访中追踪其发病、死亡、住院与机构化情况。
把这句定义拆开,可以看到三个彼此独立的决定:
| 决定 | 官方表述 | 后果 |
|---|---|---|
| 谁进队列 | 在 NHANES I 完成医学检查的 25–74 岁者 | 未参加体检者、25 岁以下者、75 岁以上者全部不进;这不是"全国 25–74 岁人口" |
| 追什么 | 发病、死亡、住院利用,以及风险因素、功能受限、机构化的变化 | 结局是多维的,死亡只是其中一维 |
| 追多久 | 1982 年至 1992 年,公开文件止于此 | 2011 年延展版不在公开渠道 |
第三行是全文多处要回到的边界。官方页面把 2011 年延展放在「Data Linkage」栏目里单独介绍,与公开文件是两件事。
§1.2 为什么它不是一个普通数据集
普通数据集是「一批观测」;NHEFS 是「一批人的两段时间」。基线是第一段,随访是第二段,两段之间隔了七到二十一年。中间发生了什么、没发生什么,都被记录成时间戳。
这种结构带来三件普通横断面数据给不了的事:
第一,时间顺序是硬约束。基线体检在随访之前,这是设计决定的,不是研究者假设的。做时序建模时不需要额外论证先后关系,但也不能反过来用随访结果去预测基线——那在数据上可行、在时间上不可能。
第二,有真正的删失结构。有些人活到 1992 年还在,有些人在某轮之后失联,有些人在两轮之间死亡。这三种状态在生存分析里必须区别对待,混成一个"缺失"会直接毁掉估计。
第三,同一个人有多轮观测。这意味着可以直接看变化量,而不是比对两个不同人群的横断面。1982 年的血压与 1992 年的血压属于同一个人,差值有意义。
一句话:NHEFS 的价值不在于人多,而在于「同一个人前后两次被量到」。
§1.3 三十秒决策卡
| 你的处境 | NHEFS 能帮你什么 |
|---|---|
| 想研究某个 1970 年代的暴露(血清胆固醇、血压、膳食、吸烟)对长期死亡的影响 | 基线暴露与 1992 年前死亡证书在同一编号下可直接拼接 |
| 手上有横断面 NHANES 结果,被审稿人问"能不能看结局" | 用 NHEFS 的死亡随访补上结局维度 |
| 要做生存分析的方法学演示,但不想申请受限数据 | 公开文件内有足够的死亡人数与删失结构 |
| 关心住院与入养老院的长期轨迹 | 五份机构停留文件覆盖基线至 1992 年的住院与机构化史 |
| 想比较美国上一代人二十年间的风险因素变化 | 四轮访谈 + 基线体检,但须先处理样本框差异(见 §7) |
| 想估计 1975 年美国某病患病率 | 应该去用 NHANES I 本身,而不是这份随访文件 |
最后一行的道理很简单:NHEFS 的文件是"活着被追到的人",越往后越偏向健康者。用它算患病率,算出来的是幸存者的患病率。
§1.4 不适合谁
如果你的需求是下面几类,NHEFS 给不了你:
- 当期健康监测。数据止于 1992 年。要讨论今天美国人的健康,去看 NHIS 或近年的 NHANES 周期。
- 临床诊断任务。NHEFS 没有影像、没有病理报告、没有诊断金标准。它的"标签"是死亡与自报疾病,不是临床结论。
- 高维测量的机器学习基准。每条记录几百个变量,几乎全是分类或整数,没有连续信号、没有序列、没有图像。想找深度学习基准,去影像或信号类数据集。
- 2011 年及以后的死亡结局。延展版在 RDC 里,公开渠道拿不到。
- 亚裔、原住民等小群体的单独分析。1971 年的抽样框决定了某些族群在本队列中的样本量极小,切片后置信区间宽到不能解读。
明确写出这些边界不是自贬。一个数据集的可信度,有一半来自它承认自己做不到什么。
§1.5 它回答的是哪一类问题
把 NHEFS 能回答的问题列出来,特征很清楚:它们都是「某个早期状态,后来怎么样了」。
反过来的问题——「现在的情况是什么」——它一个都答不了。这不是局限,是定位。一份冻结在 1992 年的随访数据,能贡献的只有「后来」,不能贡献「现在」。
认清这一点之后,下文所有技术细节(合并、权重、删失、去重)都只是把它用对的手段,而不是它的目的。
§2 数据构成与规格
§2.1 队列规模与随访人数
官方页面与 README 给出的是同一组数:
| 轮次 | 时间 | 对象与人数 | 采集方式 |
|---|---|---|---|
| 基线 | 1971–1975 | NHANES I 中完成医学检查、25–74 岁的 14,407 人 | 家庭访谈 + 医学检查 + 化验 + 膳食调查 |
| 第一轮 | 1982–1984 | 全队列 | 追踪 + 本人或代理面访 + 测脉搏/体重/血压 + 摘录住院与养老院记录 + 收集死亡证书 |
| 第二轮 | 1986 | 基线时 55–74 岁且 1982–84 轮时已知未死亡者,不足四千人 | 约 30 分钟电话辅助访谈(CATI),不体检 |
| 第三轮 | 1987 | 全部已知未死亡者 11,750 人 | 同上 |
| 第四轮 | 1992 | 全部已知未死亡者 11,195 人 | 同上 |
| 死亡信息 | 截至 1992 | 4,497 名已识别死者 | 死亡证书,ICD-9 多死因编码 |
四轮随访的追踪率与访谈率官方给了区间:各轮追踪率 90%–94%,访谈率是已追踪者的 91%–96%;到 1992 年为止,全研究人群中 96% 的人至少在某一个时点被成功追踪到。
这组数的读法值得单独说一句。3,980 与 11,750、11,195 不是"三个递减的全队列",而是三个不同的准入条件:1986 年只做老龄段,1987 年与 1992 年才回到全队列。如果把 1986 年的 3,980 当成"全队列只剩四千人",后面的分析会全线错位。
§2.2 四类文件与它们各自的记录单位
公开数据分成四个组成部分,这不是按文件类型分,而是按记录单位分:
| 组成 | 记录单位 | 每条记录代表什么 | 覆盖轮次 |
|---|---|---|---|
| Vital and Tracing Status | 人 | 一个人在各轮的追踪状态、生死状态与人口学信息 | 四轮汇总为一份 |
| Interview | 人 × 轮 | 某人在某一轮的访谈内容 | 1982-84、1986、1987、1992 各一份 |
| Health Care Facility Stay | 次住院 / 次机构入住 | 一次过夜的住院或养老院停留 | 四轮各一份,另有补充文件 |
| Mortality | 人 × 轮(死者) | 一次死亡事件及其 ICD-9 死因编码 | 汇总为一份 |
这个表比任何字段清单都重要。做任何合并之前,先确认你要合并的两张表记录单位是否相同。 访谈表一人一轮一条,机构停留表一人可以对应多条,直接按人键左连接会行数膨胀。
官方 README 里的文件体积表列出的是磁带时代的 MB 数(例如 1982-84 访谈为 10.6 MB 文档 + 50.7 MB 数据),现在从网页下载的定宽文本体积与之一致,可以直接据此估算读取时间。
§2.3 一条记录长什么样
以 1992 年访谈文件为例,定宽文本的前几个字段是这样的:
#-- 1992 Interview 文件前若干列的定宽布局(来源:intv92.inputs.labels.txt)
#-- @1 HANESEQ $CHAR5 SAMPLE SEQUENCE NUMBER
#-- @6 BLANK1 $CHAR2 填充空白
#-- @8 LINTSTAT $CHAR2 MOST RECENT COMPLETED INTERVIEW
#-- @10 LINTDATE $CHAR6 DATE OF MOST RECENT COMPLETED INTERVIEW
#-- @16 BLANK2 $CHAR1 填充空白
#-- @17 LSSEX $CHAR2 SEX OF SUBJECT
#-- @19 LNDOB $CHAR6 DATE OF BIRTH
#-- ... 后续字段依次为既往病史模块(L 前缀)、当轮题项、设计变量
三个细节值得注意。
其一,样本序列号叫 HANESEQ,不叫 SEQN。SEQN 是后来 NHANES 连续调查(1999 年至今)的主键名,NHEFS 属于 NHANES I 时代,沿用 HANESEQ。这一条是连接基线文件与随访文件时最容易踩空的坑:按 SEQN 去 join 会得到空结果,而且不报错。
其二,大量字段以 L 开头。README 的字段标签里,LARTH、LSTROKE、LDIABETE、LHIGHBP 这些的含义都是「前次访谈中报告的 X」。也就是说,每一轮访谈不仅记录当轮信息,还重述上一轮的病史,用来做纵向核对与补漏。理解这一点才知道:为什么 1992 年文件里含有 1982 年就能看到的信息。
其三,日期是双份存储。既有 $CHAR6 的组合日期(如 LINTDATE),又有拆分后的月/日/年变量。组合形式在某些统计软件里不能直接转日期,用拆分变量更稳。
§2.4 主键与设计变量
| 变量 | 位置 | 含义 | 用法 |
|---|---|---|---|
| HANESEQ | 各文件头部 | 样本序列号,$CHAR5 | 跨文件、跨轮次合并的唯一键 |
| STRATUM | 文件尾部设计区 | 抽样层 | 复杂抽样方差估计 |
| PSU | 文件尾部设计区 | 初级抽样单元 | 聚类稳健方差 |
| SUBSAMPL | 文件尾部设计区 | 子样本标识 | 判断该记录属于哪个子样本 |
| SWGT1–SWGT6 | 文件尾部设计区 | 六套样本权重 | 按分析对象选对应权重,不是随便挑一套 |
| TRACSTAT | 访谈文件 | 1992 轮生死状态 | 生存分析的事件指示 |
| NEWDODYR | 访谈文件 | 死亡年份 | 生存时间计算 |
| DCRECD | 访谈文件 | 死亡证书接收标记 | 判断死因是否可查 |
六套权重是这份数据里最容易被忽略的设计。不同权重的适用对象不同(不同子样本、不同轮次的代表性调整),官方在 Series 2 第 121 号报告里专门讨论过权重使用问题。README 明确把使用者指向那份报告,说明这不是可以自行发挥的部分。
§2.5 与同源数据的关系
NHEFS 不是独立采集的样本,它的基线就是 NHANES I。三者的关系可以这样画:
#-- 数据血缘(自上而下为时间顺序)
NHANES I (1971-75)
├── 家庭访谈 ────────────────┐
├── 医学检查(血压/身高体重/脉搏)│
├── 生化化验(血清胆固醇等) ├──> 完成检查的 25-74 岁者 = NHEFS 队列
└── 膳食调查 ────────────────┘
↓
1982-84 面访 + 体检 + 住院摘录 + 死亡证书
↓
1986 CATI(仅老龄段)→ 1987 CATI(全队列)→ 1992 CATI(全队列)
↓
1992 Mortality(ICD-9 多死因)
箭头说明一件事:基线变量不在这批随访文件里,而在 NHANES I 的公开数据文件里。README 的原话是「NHEFS 公开数据磁带应与 NHANES I 公开数据文件链接,才能进行恰当的纵向分析」。想拿到 1971 年那次的血清胆固醇,必须回 NHANES I 的文件里去取,再按 HANESEQ 接上。
§2.6 定位差异
| 资源 | 观测单位 | 结局 | 是否公开 | 与本数据的差别 |
|---|---|---|---|---|
| NHEFS | 人 × 四轮 | 死亡 + 住院 + 自报疾病 | 公开(2011 延展版除外) | 同源纵向,基线暴露可回接体检 |
| NHANES I | 人(一次性) | 无 | 公开 | 有全部基线测量,但没有结局 |
| 后续 NHANES 周期(1999 起) | 人(每周期独立样本) | 需另做死亡链接 | 公开 + 受限链接 | 周期不重复访同一人 |
| NHIS | 人(年度横断面) | 自报;另有死亡链接 | 公开 + 受限链接 | 抽样与问卷都不同,不能混用 |
| 队列类(如 ARIC、HRS) | 人 × 多轮 | 多种 | 需申请/注册 | 年代更近,但门槛更高 |
这张表的核心是第二行与第一行的对比:同一个样本,有没有结局,是两种完全不同的研究可能性。
§2.7 基线与随访的体积不对称
从下载区的标注能看出一个结构性事实:随访文件很大,基线文件不在其中。
四份访谈文件的标注体积合计超过一百四十 MB,五份机构停留文件合计六十 MB 上下,死亡与生死状态合计不到十 MB。信息量集中在访谈与住院记录里,而不是死亡结局。
但基线文件不在这个清单上。要拿到 1971 年的体检测量,得再去 NHANES I 的数据目录下载另一批文件,再按 HANESEQ 拼过来。它在体量上不重,在流程上却是另一条下载链。
做项目规划时容易漏掉这一点:只看 NHEFS 页面的文件清单,会以为拿全了数据,实际拿到的是半份。
§3 覆盖层:这批人是谁
§3.1 抽样框与实际覆盖
基线抽的是美国平民非机构人口的全国概率样本。NHEFS 只取其中完成医学检查且年龄落在 25–74 岁的人。
这三个限定叠在一起,意味着 NHEFS 不能代表"1971 年的美国成年人"。它代表的是"1971 年愿意并能够到检查点完成体检的 25–74 岁平民非机构人口"。愿意体检这一条本身就筛掉了一部分健康状况差、行动不便或对医疗系统不信任的人。
后续各轮的追踪是"追到受试者当前位置"(官方原话是 attempts to trace and interview all study subjects at their current location),不是固定在原住址。这在当时是相当强的设计,代价是地理信息被淡化。
§3.2 各轮的样本框差异
| 轮次 | 纳入条件 | 隐含的选择 |
|---|---|---|
| 1982–84 | 全队列 | 只需活到这一轮 |
| 1986 | 基线 55–74 岁且未死亡 | 叠加年龄下限,等同于"老龄段幸存者" |
| 1987 | 全部未死亡者 | 又回到全年龄段(幸存者) |
| 1992 | 全部未死亡者 | 同上,但幸存者更少 |
这张表解释了为什么"轮次之间的均值变化"不能直接解读为"人群在变化"。1986 年那一轮的均值只代表 55 岁以上的人,1987 年的均值代表所有还活着的人,两者的差距里有很大一部分来自年龄构成的突变,而不是健康本身的变化。
做趋势分析时的正确做法是:先把分析限制在所有轮次都满足同一条件的子集上(例如基线和 1986 年都 ≥55 岁的人),再比较轮次间变化。
§3.3 失访与死亡的区别
在 NHEFS 里,"没有 1992 年访谈记录"至少有四种原因:
- 已死亡(有死亡证书)
- 追踪到但拒绝访谈
- 追踪失败(地址失联、迁移国外)
- 该轮不在目标样本内(如 1986 年仅限老龄段)
只有第一种是竞争事件,后三种属于删失或结构性缺失。把它们统一编码成缺失值,会在生存分析里制造出大量假删失,把死亡率算低。
vital and tracing status 文件的价值正在于此:它逐轮记录了每个人的追踪状态,让使用者可以区分这四种情况,而不必靠猜。
§3.4 死亡与死因的可得性
公开的 1992 年死亡文件覆盖截至 1992 年识别出的全部死者,按 ICD-9 多死因编码。README 说明文件里有一个调查期标识变量,允许使用者在四轮之间筛选取用某轮的死亡信息。
这带来一个实操细节:同一个人可能在死亡文件里出现不止一次。如果按人计数死亡人数而不做去重,会得到比真实死者数更高的数字。正确做法是先按序列号去重,或按调查期变量筛选。
死因编码用的是 ICD-9。这在今天做跨年代比较时会遇到版本问题:ICD-10 在 1990 年代中后期才在美国逐步采用,ICD-9 与 ICD-10 的死因类目不是一一对应。把 NHEFS 的死因与 2000 年后的登记数据直接比较,需要先做编码映射。
§3.5 九年缺失的这段空档意味什么
第一轮在 1984 年收尾,第二轮在 1986 年启动,中间空了两年;第二轮与第三轮之间只有一年;第三轮到第四轮又隔了五年。这个不规则的时间间隔不是疏漏,而是经费与设计目标的产物:1986 年那一轮的存在理由是把老龄段补密,好让老龄化的发病与死亡过程有更细的时间分辨率。
对建模的含义有两层。浅的一层是:随访时间点不均匀,任何"每轮等距"的假设都错。深的一层是:事件时间的精度受制于访谈间隔。一个人如果在 1987 与 1992 两次访谈之间报告了新发疾病,事件只能定位到"这五年里某个时点",除非访谈里有确诊年份变量把时间细化。死亡不同——死亡证书有确切日期,所以死亡的生存分析精度远高于自报疾病的发病时间分析。
这也是一个常见的取舍判据:如果研究目标是死亡,NHEFS 的时间精度足够;如果目标是某种慢性病的发病时间,就必须依赖自报确诊年份,误差量级从几个月到几年不等。
§3.6 为什么官方要强调"不应提供患病率"
README 结尾那句提醒值得单独拆开。原文说的是:NHEFS 采集的数据在设计上是纵向的,因此在多数情况下不应用来提供患病率估计。
这句话背后的机制是幸存者结构。假设 1982 年要估计 1975 年某病的患病率,可用人群是活到 1982 年并被访谈的人。这个人群已经经过了七年死亡筛选,患病者的死亡风险通常更高,于是他们在样本里的比例被系统性压低。算出来的患病率会偏低,且偏低程度与该病的致死性正相关——越是致命的病,低估越严重。
这个偏倚的量级不是小数。正因为如此,官方把这句话写进 README,而不是留在方法报告的脚注里。使用时的做法是:要患病率,回到 NHANES I 的基线文件(那里没有幸存者筛选),或者用其他横断面调查。
§4 随访层:每一轮到底问了什么
§4.1 1982–1984:唯一带体检的一轮
这一轮是四轮中信息最厚的一轮,因为它是唯一同时具备三件事的:面访(不是电话)、体检(脉搏、体重、血压)、以及跨机构记录摘录(医院与养老院)。
面访由本人或代理完成。代理访谈在这个人群里不可避免——已经患病或认知受损的人无法自答,只能由家属代答。官方没有在这一轮的公开说明里给出代理比例,但后续分析必须把代理标志当作协变量,否则代理比例高的子群体(高龄、患病人群)在主观题项上的测量误差会系统性偏大。
§4.2 1986、1987、1992:三轮 CATI
三轮的形式统一:约 30 分钟的电话辅助访谈,不测体重血压,不摘录新增的体检数据。这个固定形式的代价是明确的——从 1986 年起,NHEFS 不再有客观测量,只剩自报。
对建模者的含义是:基线(1971–75)与 1982–84 有客观测量,1986 之后没有。想研究"血压变化"的,只能用 1971–75 与 1982–84 两个时点;想研究"自报健康状况变化"的,四轮都能用。把两种测量的变化混在一起比较,是在比较测量方法而不是比较人。
三轮的样本框差异已在 §3.2 说明,此处只补一句:1986 年那一轮是全部四轮中样本最小的,做亚组分析时最容易撞上样本量下限。
§4.3 访谈文件里的"上一轮回顾"结构
1992 年访谈文件的前几十个字段全部是 L 前缀的回顾变量:前次访谈中的婚姻状况、是否工作、父母的生死、各类疾病史及其确诊年份。
这个结构的设计意图是:以最后一次完整访谈为参照,只收集此后的增量。对使用者的好处是,一份 1992 年文件里就含有此前的病史轮廓,不必每次都把四份访谈文件全部读进内存;坏处是,回顾变量与当轮变量混杂在同一张宽表里,做特征选择时容易把"上一轮已报告"误当成"当轮新发"。
区分的办法看变量名:L 前缀 = 上一轮已报告;无前缀的模块 = 当轮询问并记录。确诊年份变量(如 LARTHYR、LBCANCYR、LBKHIPYR)是回溯时间信息,做事件时间分析时很有用,但都是自报。
§4.4 机构停留文件:为什么有五份
Health Care Facility Stay 系列共五份:四轮各一份(1982-84 那份是修订版),另有一份补充文件。
五份的存在理由不是冗余。每一轮访谈只记录了"本轮访谈期间报告的"住院,而受试者可能在访谈间隙回忆起更早的住院,或在某轮失访后才被追踪到、补报了失访期间的住院。补充文件专门装载"1992 年随访期间收到、但描述的是 1992 年之前发生的停留"这一类记录。
官方 README 的说法是:五份合并后,才构成基线至 1992 年的完整住院与机构化史。少合一份,就会漏掉一类住院。
§4.5 随访数据的三种用法
按分析对象分,随访数据有三种典型用法,每种需要的数据组合不同:
| 用法 | 需要合并 | 时间单位 | 关键字段 |
|---|---|---|---|
| 死亡生存分析 | 基线 + vital status + mortality | 月或年 | 体检日期、死亡日期、生死状态、基线协变量 |
| 疾病发生时间分析 | 基线 + 各轮访谈 + 确诊年份变量 | 年 | L 前缀确诊年份、当轮新发病记录 |
| 住院/机构化轨迹 | 基线 + 五份机构停留文件 | 次 | 入院/出院日期、机构类型、诊断摘要 |
第一种用法最成熟,公开文献里的应用也最多——因为死亡日期是硬事件,不依赖自报。第二种受自报诊断年份的回忆误差影响,需谨慎。第三种受回忆与记录完整性双重影响,适合做描述性刻画而非精确推断。
§5 取数层:怎么把它读进分析环境
§5.1 访问性质:完全公开,但有一个例外
公开使用文件可以在 CDC 页面直接下载,不需要注册、不需要签署使用协议、不需要申请。许可性质是美国联邦政府作品,README 只提出引用要求(建议的引用格式是「Source: National Center for Health Statistics (NHEFS)」),并要求在发表物中声明分析结论由作者负责、NCHS 只对原始数据负责。
唯一的例外是 1992 年之后的死亡随访。 官方页面在「NHEFS Data Linkage」区域说明,链接死亡文件把随访延至 2011 年 12 月 31 日、死者总数增至 9,035 人,并通过概率匹配接入国家死亡指数(NDI)。由于保密要求,这份文件只能通过 NCHS 研究数据中心(RDC)访问。
同一区域还列了三条其他链接:社会保障局数据(至 2007 年 12 月 31 日)、Medicare(1991–2007)、Medicaid(1999–2009)。四条都在受限通道里。
§5.2 文件获取
#-- 在工作目录下取回公开文件与配套的 SAS 声明文件
mkdir -p nhefs && cd nhefs
BASE=https://wwwn.cdc.gov/nchs/data/nhefs
for f in readme_ftp.txt \
n92vitl.txt vitl.inputs.labels.txt 1992vital.pdf \
N92mort.txt mort.inputs.labels.txt 1992mort.pdf ; do
curl -sSLO "$BASE/$f"
done
#-- 访谈文件较大,按需取
curl -sSLO "$BASE/N92int.txt"
curl -sSLO "$BASE/intv92.inputs.labels.txt"
每个数据文件都配一个 *.inputs.labels.txt。它不是普通文档,而是 SAS 的 INPUT 与 LABEL 语句集合,可以当作列位置与变量标签的权威来源直接用。
§5.3 读入与合并
import pandas as pd
BASE = "nhefs/"
#-- 官方给的是 SAS 输入语句,先用 pandas 读定宽再赋列名
#-- 这里只演示关键列;完整列位置见 intv92.inputs.labels.txt 的 @n 标记
colspecs = [(0, 5), (7, 9), (9, 15), (16, 18), (18, 24)]
names = ["HANESEQ", "LINTSTAT", "LINTDATE", "LSSEX", "LNDOB"]
int92 = pd.read_fwf(BASE + "N92int.txt", colspecs=colspecs,
names=names, dtype=str)
int92["HANESEQ"] = int92["HANESEQ"].str.strip()
#-- 生死状态文件是名单底册,一人一条
vital = pd.read_fwf(BASE + "n92vitl.txt", dtype=str)
vital.columns = [c.strip() for c in vital.columns]
vital = vital.rename(columns={vital.columns[0]: "HANESEQ"})
vital["HANESEQ"] = vital["HANESEQ"].str.strip()
panel = vital.merge(int92, on="HANESEQ", how="left", validate="one_to_one")
print(len(vital), len(panel), panel["LINTSTAT"].value_counts().head())
关键在 validate="one_to_one"。生死状态文件应当一人一条,访谈文件也应当一人一条;如果这个校验报错,说明有一边存在重复序列号,这在真实数据里是会发生的事(同一人在不同调查期出现多次),必须先去重再合并,否则后面的生存时间会算错。
§5.4 机构停留文件的行数膨胀
import pandas as pd
hcfs = pd.concat(
[pd.read_fwf(f"nhefs/{f}.txt", dtype=str) for f in
["n82hcfs", "n86hcfs", "n87hcfs", "n92hcfs", "n92hcfsp"]],
ignore_index=True,
)
hcfs["HANESEQ"] = hcfs.iloc[:, 0].str.strip()
#-- 一人可以对应多次住院,先聚合到人,再与名单底册合并
stays = hcfs.groupby("HANESEQ").size().rename("n_stays").reset_index()
panel = panel.merge(stays, on="HANESEQ", how="left")
panel["n_stays"] = panel["n_stays"].fillna(0).astype(int)
这段的重点不是代码本身,而是 groupby 那一步。五份机构停留文件纵向拼接后,记录单位是"次停留",直接按人左连接会让 panel 行数翻倍再翻倍。
§5.5 权重与设计变量
#-- 设计变量在访谈文件尾部,SE 估计必须带上它们
#-- 以下用 R 的 survey 包示意口径,权重按分析子集从 SWGT1-SWGT6 中选
#-- 具体选哪一套,须查 Series 2 No.121 报告,不要凭习惯选第一套
library(survey)
nhefs <- read.csv("nhefs_panel.csv")
des <- svydesign(ids = ~PSU, strata = ~STRATUM,
weights = ~SWGT1, data = nhefs, nest = TRUE)
#-- 死亡比例的点估计与设计感知置信区间
svymean(~factor(vital_status), des, na.rm = TRUE)
nest = TRUE 不能省。NHEFS 的 PSU 编号在层之间可能重复,不加这个参数,R 会把不同层的同号 PSU 当成同一个,方差被低估。
§5.6 一份可核对的自检清单
拿到数据后,按这个顺序核一遍,能挡住大部分误用:
| 检查 | 期望 | 不符合说明什么 |
|---|---|---|
| 生死状态文件行数 | 与官方队列数一致 | 读取时丢行或重复 |
| HANESEQ 唯一性 | 生死状态文件中唯一 | 该文件不是名单底册,或读错文件 |
| 1992 访谈人数 | 应小于全队列 | 大于说明混入了其他轮次 |
| 死亡文件去重后的人数 | 应等于官方给出的死者数 | 大于说明未按人去重 |
| 死亡日期 − 体检日期 | 全部为正 | 出现负值说明日期字段解析错位 |
第四行的坑很隐蔽:死亡文件按"人 × 调查期"组织,同一个人若在多轮被重复确认死亡,会出现在多行。不先去重就数,数字会偏高。
§5.7 贯穿案例:一次 HANESEQ 合并失败的完整复现
把前面几节串起来,最典型的一次翻车是这样发生的:
第一步,从一个 NHANES 时代的脚本模板复制合并代码,模板里写的是 on="SEQN"。运行不报错,得到一个行数有限的表,代码继续往下走,生存分析也跑出了结果。
第二步,结果里的死亡比例明显偏低。检查发现合并后的表几乎全是空值——两个文件里都没有 SEQN 这一列,pandas 的合并没有匹配上任何一行,left join 保留了左表的全部行,右表字段整列为 NaN,任何按右表字段做的缺失值过滤都把这些行悄悄丢掉了。
第三步,改成 on="HANESEQ",但列值是定宽文本,尾部带填充空格。"10001 " 与 "10001" 在字符串比较里不相等,于是仍然大量匹配失败。加 .str.strip() 之后才真正对齐。
第四步,对齐之后行数比预期多。原因是死亡文件按"人 × 调查期"组织,同一个人出现了多次。加 drop_duplicates("HANESEQ") 或按调查期筛选,才回到一人一条。
前述案例的四步分别对应四个不同的失败模式:键名错、键值未清洗、记录单位不同、去重时机错。四者都不会抛出异常,只会让结果安静地偏向某个方向。这也是为什么 §5.6 的自检清单要把"生死状态文件行数"放在第一条——它是唯一一个能在最早阶段暴露前三步的检查。
§5.8 主键误用为什么会静默失败
静默失败在这类数据上格外危险,因为它伪装成「数据就是这样」。§5.7 的案例是典型:四步全部不报错,结果只是偏了一点。
如果合并键写错,得到的是空值而非报错。如果权重选错,标准误偏小而点估计不变,肉眼看不出异常。如果分母用错,死亡率会高到不合理,但如果不做外部对照,这个"不合理"也不会自己跳出来。
三种情况下,唯一可靠的防线都是外部对照:与官方给出的人数对、与已发表文献的效应量对、与常识量级对。前两节已经给出对照的做法,这里只强调一点——对照要在写模型之前做,而不是在结果可疑之后补做。
§6 与库内资源的分工
§6.1 分工:横断面、随访、死亡登记各管一段
库内已经有三类相邻资源,彼此重叠但不互相替代:
| 库内资源 | 它负责哪一段 | 它给不了什么 |
|---|---|---|
| nhanes | 一次访谈加一次检查,测的是某一时点的状态 | 没有结局,随访对象不重复 |
| nhis | 家庭访谈的调查面板,年度连续监测 | 抽样与问卷体系不同,不能与 NHEFS 直接拼样本 |
| human-mortality-database | 按人群汇总的死亡登记 | 没有个体层面的基线暴露 |
| NHEFS | 同源基线 → 四轮随访 → 死亡结局 | 只要横断面,它反而绕远 |
这张表要说清的是一个容易混淆的点:nhanes 与 NHEFS 不是"新旧两版",而是同一批设计的不同截面。nhanes 那条讲的是那个横断面调查体系本身;NHEFS 是在它之上长出来的随访分支。想用 1971 年那次体检的原始测量,要回到 nhanes 所描述的 NHANES I 文件;想接死亡结局,才来 NHEFS。
这个分工不是回避重叠,而是重叠本身必须讲清楚:NHEFS 的基线数据并不在 NHEFS 的随访文件里。这是两份数据、两处下载、一次按 HANESEQ 的拼接。
§6.2 与队列类资源的关系
aric、hrs、nurses-health-study 都是纵向队列,与 NHEFS 的差别在三点:
一是年代。NHEFS 的基线在 1970 年代前期,这在美国队列里属于最早的一批。二是门槛。NHEFS 完全公开,其他队列多数需要申请或注册。三是维度。NHEFS 的结局偏死亡与住院,其他队列的测量维度更宽(生物标志物、基因、认知量表)。
做方法学复现时,NHEFS 常被当作"门槛最低的纵向死亡数据"来用;做当代问题时,则应转向测量更新的队列。
§6.3 与汇总类资源的关系
gbd-results 与 world-health-survey 提供的是人群层面的汇总或调查估计。NHEFS 是这些估计的原始素材之一——1970 年代的美国死亡与风险因素分布,最终会以某种形式进入全球疾病负担的估算链条。但两者不能互相替代:一个是个体记录,一个是建模输出。
§6.4 在 AI 流程中的位置
在一条典型流程里,NHEFS 通常出现在三个位置:
| 位置 | 作用 | 注意 |
|---|---|---|
| 预训练/特征筛选 | 从几百个 1970 年代变量里找出与长期死亡相关的少数因子 | 筛选必须带权重,否则找到的是"样本大的子群体"的特征 |
| 外部验证 | 用在别处训练的生存模型,在独立的老队列上验证 | 变量定义要先对齐,1970 年代的题项口径与现代量表不同 |
| 方法学基准 | 检验竞争风险、时变协变量、代理访谈偏倚等方法的稳健性 | 样本量足以支撑分层,但不足以支撑高维模型 |
第三行值得强调。NHEFS 的变量数在几百量级,事件数(死亡)在几千量级,算不上高维,做深度模型没有优势。它的合适位置是"方法验证场",而不是"性能竞技场"。
§7 质量评估与局限性
§7.0 阅读本节前需要知道的一件事
用评价机器学习数据集的框架来评价 NHEFS,会得出"没有标注、没有划分、没有基准分数"这类结论——这些结论都对,但都答错了问题。
NHEFS 不是为训练模型造的,它是为流行病学推断造的。它的质量标准是:队列是否代表目标人群、随访是否完整、结局是否可靠、权重是否正确。用"有没有 train/test split"来打分会误判。
同样,把它当成"上个世纪的老数据、没有 AI 价值"也是误判。老数据的价值恰恰在于时间跨度——没有第二个公开数据集能让你看到 1971 年的血清胆固醇与 1992 年的死亡证明之间的关系。
§7.1 逐条局限
| 局限 | 具体表现 | 影响 | 缓解 |
|---|---|---|---|
| 设计决定不可估患病率 | README 明确说该数据"多数情况下不应提供患病率估计" | 用它算患病率会系统性偏低 | 患病率改用 NHANES I 本身或其他横断面 |
| 幸存者选择 | 越往后越只剩健康者 | 后期轮次的均值向健康端偏 | 做趋势分析时固定同一子集 |
| 客观测量止于 1982–84 | 1986 起只有自报 | 后期的血压血糖无法直接测量 | 前后两段分别建模 |
| 代理访谈 | 患病、高龄者由他人代答 | 主观题项误差集中在这部分人 | 把代理标志当协变量 |
| 自报诊断回忆 | 确诊年份靠回忆 | 事件时间分析有测量误差 | 做敏感性分析 |
| 死因编码版本 | ICD-9,与后来的 ICD-10 不完全对应 | 跨年代死因比较需映射 | 用映射表,报告映射损失 |
| 公开止于 1992 | 之后的死亡在 RDC | 长随访研究需受限通道 | 明确声明随访截止 |
| 族群样本不均衡 | 1971 年抽样框限制 | 小群体切片后不可解读 | 只在足够大的分组上分析 |
| 膳食方法年代差异 | 1971 年的膳食调查方法与今日不同 | 营养摄入不可跨年代直接比较 | 只做同代内比较 |
§7.2 数据质量评分(DAIMS 框架)
DAIMS(Data and Information Management System,数据与信息管理系统)是一套面向数据产品的能力自评框架。按它的几个维度对 NHEFS 打分如下——分数是依 §7.1 的逐条事实给出的判断,不是官方评分:
| 维度 | 评分 | 依据 |
|---|---|---|
| 完整度 Completeness | 4/5 | 四轮随访齐全,追踪率高;2011 延展不在公开渠道 |
| 准确性 Accuracy | 4/5 | 死亡证书与化验为客观来源;自报题项与确诊年份有回忆误差 |
| 一致性 Consistency | 3/5 | 四轮样本框不同,跨轮比较需先对齐 |
| 及时性 Timeliness | 1/5 | 公开文件最后更新于 1996 年,此后只在受限通道延展 |
| 可访问性 Accessibility | 5/5 | 免注册下载,定宽文本加 SAS 声明文件即可读入 |
| 可理解性 Understandability | 3/5 | 四份 Series 1 计划与操作报告加一份 Series 2 统计问题报告;字段标签偶有拼写错误 |
| 可追溯性 Provenance | 5/5 | 每一轮的抽样、访谈、编码方法都有单独的方法报告 |
| 复用价值 Reusability | 5/5 | 支持生存分析、竞争风险、纵向建模等多种设计 |
这张表最有信息量的一行是及时性。1 分不是贬低,而是提醒:这份数据的公开形态已经冻结了近三十年。
§7.3 外部验证与对照
| 验证方式 | 做法 | 能发现什么 |
|---|---|---|
| 与 NHANES I 对账 | 按 HANESEQ 回接基线,核对人数与关键测量 | 拼接是否丢人、主键是否用错 |
| 与已知死亡率对账 | 用官方追踪率与死者数反推粗死亡率 | 分母是否用错(如把全队列当 1992 年存活者) |
| 与后续 NHANES 周期比对 | 比较同年龄段、同年代的风险因素分布 | 抽样差异与测量方法差异的大小 |
| 与队列文献比对 | 找已发表的使用同一文件的生存分析,比对效应量方向 | 权重与子集处理是否正确 |
第二条最容易被忽略。粗死亡率 = 死者数 ÷ 人年数。分母若用 1992 年存活人数,会得出一个高得离谱的死亡率;若用全队列总人年,才是对的。这个错误在复现文献时很常见,它与前述案例的失败属于同一类:合并与字段都没错,错在分母把「存活者」当成了「全体」。
§7.4 版权与引用合规
README 给的引用格式很短:表格底部写「Source: National Center for Health Statistics (NHEFS)」,文献表里按 NCHS 的机器可读文件格式著录。它还要求发表物包含免责声明,明确分析、解释与结论由作者负责,NCHS 只对初始数据负责。
对二次分发的含义是:数据本身是美国联邦政府作品,可以再分发,但再分发时应当保留出处说明,且不得让人误以为再分发版本经过 NCHS 认可。
§7.5 与年代相关的一条使用红线
有一条红线与具体分析无关,却几乎每次都会踩到:不要用 NHEFS 讨论当代的疾病负担或政策效果。
原因不在数据质量,而在暴露的年代太早。1971 年的膳食结构、吸烟率、医疗可及性与今天差了一代,从这份数据估出的效应量,迁移到当代人群时会发生变化。它可以作为历史基线,可以作为方法验证,但不能直接充当代结论。
判断规则很直接:如果结论句里出现的是「今天」「当前」「如今」,NHEFS 只能是背景,不能是论据。
§8 版本、生态与历史
§8.1 版本节奏:一次冻结
NHEFS 没有版本迭代的概念。1982–84 访谈文件在 1987 年 12 月发布,修订版机构停留文件 1990 年 11 月,1986 与 1987 两轮在 1990–1991 年,1992 轮的全部文件(生死状态、死亡、访谈、机构停留、补充文件)集中在 1996 年 7 月。此后公开文件不再变动。
这个节奏说明:NHEFS 是磁带时代的产物,数据随交付载体一次性定稿,不像后来的数据产品那样持续打补丁。使用时的隐含假设是——公开文件里有什么就是什么,不会有下一代修正错误。
§8.2 历史沿革
| 时间 | 事件 |
|---|---|
| 1971–1975 | NHANES I 基线:家庭访谈、医学检查、化验、膳食调查 |
| 1982–1984 | NHEFS 第一轮:追踪 + 面访 + 体检 + 住院摘录 + 死亡证书 |
| 1986 | 第二轮:仅基线 55–74 岁且在世者 |
| 1987 | 第三轮:全队列在世者,改为电话访谈 |
| 1992 | 第四轮:全队列在世者,最后一轮公开随访 |
| 1996 | 1992 轮文件发布,公开数据定稿 |
| 后续 | 死亡随访延展至 2011 年,转受限渠道 |
由 NCHS 与 NIA 联合发起这一点值得注意。老龄化是这次随访的核心动机之一,1986 年那轮专门针对老龄段,也印证了这个取向。
§8.3 生态位:它是方法学的教科书案例
NHEFS 在流行病学教学与因果推断文献里出现频率很高,原因不是数据新,而是结构干净:
- 有明确的暴露(基线测量)与明确的结局(死亡证书)
- 有时间顺序,不需要额外论证
- 有混杂结构(年龄、吸烟、体重等同时在两侧起作用)
- 有大量已发表的复现
这使它成为演示倾向评分、逆概率加权、工具变量、G 计算等方法的常见案例。方法学教材选它,是因为它的问题结构可以被讲清楚,而不是因为它的数据规模大。
§8.4 为何能持续:它靠什么活到今天
一份 1990 年代冻结的公开数据,为什么三十年后还有人在用?
第一,替代品不存在。1971 年的美国全国体检样本,只有这一份。想研究那个年代基线暴露的长期影响,没有第二个来源。
第二,成本极低。免注册、体积在几百 MB 量级、格式简单。研究者的启动成本几乎为零,这使它在教学与试算中被反复选用。
第三,方法学惯性。教材与论文用惯了它,新的方法论文献会继续拿它当基准,形成自我强化。
第四,机构背书。NCHS 是联邦统计机构,方法报告(Series 1 的 22、25、27、35 号,Series 2 的 121 号)把抽样、访谈、编码、加权都写清楚了。没有这些报告,数据再干净也不敢用。
四条里最容易被低估的是第四条。一份数据能长期被使用,靠的不是数据本身,而是围绕它的方法文档是否足够让人"放心地犯错后还能查出哪里错了"。
§8.5 一个被反复误用的字段:死亡年份
1992 年访谈文件里的死亡年份字段,看起来是最简单的一个变量,实际用法要绕三道弯。
第一道,它是字符型。定宽文件里所有字段都是 $CHAR,直接参与算术会按字符串处理,"1990" - "1975" 在某些环境下得到拼接而非减法。必须显式转数值。
第二道,它不是所有人的非缺失值来源。访谈文件里死亡年份是访谈轮次内收集的;而统一的生死状态在另一份文件里。有人可能在死亡文件里有记录、在访谈文件里没有,因为访谈未完成。用访谈文件的死亡年份做生存时间,会漏掉一部分死者。
第三道,它与体检日期的差值必须为正。若出现负值或零,一般是日期解析错位(例如把月日年当成日月年),或该记录本不属于本队列。
三道弯走完,才得到一个能用于生存分析的 time 与 event;三道弯的正确走法,与 §5.7 的案例同源——都是把某个「看起来对但其实错」的假设先排除掉。这也是 §9.3 那段最小骨架里为什么有两个看起来多余的步骤——数值转换与正数过滤。
§9 使用指引
§9.1 三种角色的路径
| 角色 | 第一步 | 第二步 | 产出 |
|---|---|---|---|
| 流行病学研究者 | 读 Series 2 No.121 的权重部分 | 回接 NHANES I 建基线暴露 | 带设计感知方差的关联分析 |
| 数据工程师 | 从 inputs.labels 文件生成列位置清单 | 写可复现的合并脚本 | 一份人 × 轮的面板表 |
| 教学者 | 用生死状态与死亡文件做最小示例 | 加入基线协变量 | 生存分析授课案例 |
§9.2 最小可运行流程
import pandas as pd
def load_panel(vital_path, int_path):
"""把生死状态与某一轮访谈按 HANESEQ 合并成面板。"""
vital = pd.read_fwf(vital_path, dtype=str)
vital.columns = [c.strip() for c in vital.columns]
vital = vital.rename(columns={vital.columns[0]: "HANESEQ"})
vital["HANESEQ"] = vital["HANESEQ"].str.strip()
vital = vital.drop_duplicates("HANESEQ", keep="first")
itv = pd.read_fwf(int_path, dtype=str)
itv.columns = [c.strip() for c in itv.columns]
itv = itv.rename(columns={itv.columns[0]: "HANESEQ"})
itv["HANESEQ"] = itv["HANESEQ"].str.strip()
itv = itv.drop_duplicates("HANESEQ", keep="first")
return vital.merge(itv, on="HANESEQ", how="left", validate="one_to_one")
panel = load_panel("nhefs/n92vitl.txt", "nhefs/N92int.txt")
print(panel.shape, panel["HANESEQ"].nunique())
最后一行打印的两个数应当相等。不相等,说明合并后有序列号重复。
§9.3 生存分析的骨架
import pandas as pd
from lifelines import CoxPHFitter
df = panel.copy()
df["time"] = (pd.to_numeric(df["NEWDODYR"], errors="coerce")
- pd.to_numeric(df["EXAMYEAR"], errors="coerce"))
df["event"] = (df["TRACSTAT"].astype(str).str.strip() == "1").astype(int)
#-- 随访时间为 0 或负的记录必须先剔除再建模
df = df[df["time"] > 0]
df = df[["time", "event", "LSSEX"]].dropna()
cph = CoxPHFitter()
cph.fit(df, duration_col="time", event_col="event")
cph.print_summary()
时间单位的定义(年还是月)、零点(体检日期)、事件定义(是否限于某类死因)三者必须同时写清楚,否则结果无法与已发表研究对照。
§9.4 在长流程中的分工
在一条"从历史暴露到当代政策"的流程里,NHEFS 的角色是中段:
#-- 分工示意
NHANES I 文件 → 基线暴露(血清胆固醇、血压、膳食、吸烟)
↓ HANESEQ
NHEFS 随访文件 → 结局(死亡、住院、机构化、自报疾病)
↓ 权重与设计变量
设计感知估计 → 人群层面的关联效应
↓ 与当代队列比对
迁移与外部验证 → 效应量是否随时间改变
这个链条最关键的一环是 ↓ HANESEQ。它是整条流程唯一的人工衔接点,也是最容易出错的地方。
§9.5 迁移到其他数据时的注意事项
在 NHEFS 上跑通的代码,迁到别的队列时有三处必须改。
一是键名。HANESEQ 是 NHANES I 时代的命名,其他队列各有各的序列号,有的沿用 SEQN,有的用自造 id,有的是复合键。把键名硬编码进函数参数,迁过去必然断。
二是时间零点。NHEFS 的零点可以取体检日期,也可以取某一轮访谈日期。两个选择给出不同的风险集,结论也会不同。迁到别的队列时,零点要重新确定,不能照搬。
三是权重。六套权重与 NHEFS 的抽样设计绑定,换数据就要换权重口径。把权重变量名照抄过去,轻则报错,重则悄悄用了别人的权重。
三处里最隐蔽的是第二处:代码能跑通、结果也像样,但风险集里的人完全不同。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 性质 | 观察性纵向队列的公开二手数据,非临床数据、非登记全量 |
| 推荐用途 | 长期死亡结局建模、住院轨迹刻画、生存与竞争风险方法验证、流行病学教学 |
| 不建议用途 | 当期患病率估计、临床诊断模型训练、把公开文件当 2011 年随访版本 |
| 伦理边界 | 死亡与疾病记录涉及已故与在世个体,做再识别推断越界;族群细分需评估小样本表述风险 |
| 引用要求 | 表格标注 NCHS 为原始来源,文献表按 NCHS 机器可读文件格式著录 |
| 版本声明 | 本页描述的是公开使用文件;2011 年延展版的行为须另作说明 |
| 状态 | 公开文件已冻结;使用前应核对官方页面是否新增文件 |
| 责任划分 | 分析与结论由使用者负责,NCHS 仅对初始数据负责 |
常见误读
| 常见说法 | 实际情况 | 证据 |
|---|---|---|
| 主键是 SEQN | 是 HANESEQ;SEQN 属后来 NHANES 连续调查的命名 | 1992 访谈文件 inputs.labels.txt 首列 |
| 四轮随访是 1982、1987、1992,外加一次核对 | 是 1982–84、1986、1987、1992 四轮,"1986"本身是完整的一轮 | 官方页面 Survey Description |
| 1986 年样本小是因为失访严重 | 是设计上只做基线 55–74 岁的老龄段 | 官方页面给出该轮人数,远小于全队列 |
| 死亡随访到 2006 年 | 公开文件止于 1992;受限链接版到 2011 年 12 月 31 日 | 官方页面 Data Linkage 段落 |
| 死亡人数随年份增加,公开文件里也在增加 | 公开文件固定记录 1992 年前识别出的死者;9,035 是受限版总数 | 官方页面与 README 分别陈述 |
| 拿到随访文件就有基线体检数据 | 基线在 NHANES I 文件里,须按 HANESEQ 回接 | README:应与 NHANES I 公开文件链接 |
| 公开文件需要申请 | 免注册直接下载;只有链接数据需走 RDC | 官方页面下载区与 Data Linkage 区 |
| 死亡文件一人一行 | 按人 × 调查期组织,同一人可能多行 | README 提到提供调查期标识变量以筛选取用 |
| 可以用它估计 1975 年美国患病率 | 官方明确说纵向设计多数情况下不应提供患病率估计 | README 结尾段落 |
| 四轮均值的变化就是人群健康的变化 | 各轮样本框不同,构成变化会混入 | 官方页面逐轮给出不同纳入条件 |
常见问题
Q1:NHEFS 和 NHANES I 是同一份数据吗?
不是。NHANES I 是 1971–1975 年的一次性调查,NHEFS 是在它的受试者身上做的后续追踪。基线测量在 NHANES I 的文件里,随访结果在 NHEFS 的文件里,两者靠序列号拼接。
Q2:为什么队列人数有两种常见说法?
官方统一给的是"完成医学检查的 25–74 岁者"。有人按"全部 NHANES I 受试者"算,会得到更大的数;有人按"有随访记录者"算,会得到更小的数。做分母时先想清楚要回答哪个问题。
Q3:1982–84 那轮为什么特殊?
它是四轮里唯一既做面访又做体检、还系统摘录住院记录的一轮。此后三轮统一改为电话访谈且不体检。所以"客观测量"只存在于基线与这一轮。
Q4:可以用它做机器学习吗?
可以,但要想清楚任务。它的变量是几百个分类与整数,事件数是几千,适合生存模型与表格模型,不适合高维或深度模型。把它当方法验证场比当性能竞技场更合适。
Q5:死亡证书里有什么?
死因按 ICD-9 多死因程序编码,另有死亡日期、死亡地点等信息。详细死因文字与精确地理标识在受限层。
Q6:想延长随访怎么办?
只能走 NCHS 研究数据中心。公开渠道没有 1992 年之后的记录。官方页面在 Data Linkage 区列出了链接版的可申请内容。
Q7:代理访谈会不会毁掉数据?
不会毁掉,但会引入系统性误差。代理比例高的子群体(高龄、患病)在主观题项上误差更大。把代理标志放进模型,误差的影响就能被部分吸收。
Q8:权重有六套,怎么选?
按分析对象选,不是凭习惯。官方把使用者指向 Series 2 第 121 号报告,那份报告讲的就是统计问题与权重使用。选错权重不会报错,只会让标准误悄悄偏掉。
Q9:可以把四轮访谈文件纵向拼起来吗?
可以,但拼之前要确认每轮的样本框。1986 年只含老龄段,直接拼接会让 1986 年的记录在年龄上与其他轮次不可比。
Q10:为什么字段名有拼写错误?
原始 SAS 标签里存在若干拼写问题(如 OSTEOPORSIS、BORKEN)。这些是文件中的既有状态,不是转载错误。处理时保留原拼写,否则与官方声明文件对不上。
术语表
| 术语 | 含义 |
|---|---|
| NHANES I | 第一次全国健康与营养检查调查,1971–1975 年执行 |
| NHEFS | NHANES I 流行病学随访研究,本页描述的对象 |
| NCHS | 美国国家卫生统计中心,CDC 下属 |
| NIA | 美国国家老龄研究所,NHEFS 的共同发起方 |
| CATI | 计算机辅助电话访谈,1986 年后三轮采用的形式 |
| HANESEQ | 本数据的样本序列号,跨文件合并键 |
| SEQN | 后来 NHANES 连续调查的序列号命名,不可用于本数据 |
| Vital and Tracing Status | 逐轮追踪与生死状态文件,一人一条 |
| Health Care Facility Stay | 住院与养老院停留记录,一次一条 |
| 多死因编码 | 按死亡证书上列出的全部死因编码,而非只取根本死因 |
| ICD-9 | 国际疾病分类第九版,本数据死因编码所用版本 |
| NDI | 国家死亡指数,用于概率匹配识别死亡 |
| RDC | NCHS 研究数据中心,受限数据现场分析场所 |
| 竞争风险 | 生存分析中多种互斥终点的情形,如死亡与失访 |
| 删失 | 随访结束时尚未观察到事件的状态 |
| 设计变量 | 分层、PSU、权重,用于复杂抽样的方差估计 |
| 代理访谈 | 由家属或照护者代答的访谈 |
| 幸存者偏倚 | 越往后越只剩健康者导致的选择偏差 |
| 定宽文本 | 按固定列位置排列的文本数据格式 |
| 输入声明文件 | 描述列位置与标签的 SAS 语句集合 |
附录 A 文件清单
| 文件 | 内容 | 配套文档 | 约体积 |
|---|---|---|---|
| n92vitl.txt | 1992 生死与追踪状态 | vitl.inputs.labels.txt / 1992vital.pdf | 4 MB |
| N92mort.txt | 1992 死亡数据 | mort.inputs.labels.txt / 1992mort.pdf | 2 MB |
| N92int.txt | 1992 访谈 | intv92.inputs.labels.txt / 1992intv.pdf | 72 MB |
| n87int.txt | 1987 访谈 | intv87.inputs.labels.txt / 1987intv.pdf | 50 MB |
| n86int.txt | 1986 访谈 | intv86.inputs.labels.txt / 1986intv.pdf | 18 MB |
| N82int.txt | 1982–84 访谈 | intv82.inputs.labels.txt / 1982intv.pdf | 较小 |
| n92hcfs.txt | 1992 机构停留 | hcfs92.inputs.labels.txt / 1992hcfs.pdf | 4 MB |
| n87hcfs.txt | 1987 机构停留 | hcfs87.inputs.labels.txt / 1987hcfs.pdf | 3 MB |
| n86hcfs.txt | 1986 机构停留 | hcfs86.inputs.labels.txt / 1986hcfs.pdf | 2 MB |
| n82hcfs.txt | 1982–84 修订机构停留 | hcfs82.inputs.labels.txt / 1982rhcfs.pdf | 10 MB |
| n92hcfsp.txt | 机构停留补充 | hcfssup.inputs.labels.txt / hcfssupl.pdf | 29 MB |
| readme_ftp.txt | 总说明、引用格式 | — | 15 KB |
附录 B 变量与主键
| 类别 | 代表变量 | 说明 |
|---|---|---|
| 主键 | HANESEQ | 跨文件、跨轮次唯一 |
| 追踪状态 | TRACSTAT | 1992 轮生死状态 |
| 死亡 | NEWDODYR / DOD / CAUSEDTH / DCRECD | 死亡年份、日期、死因、证书接收标志 |
| 基线日期 | GPEXDATE / EXAMYEAR | 体检日期,生存时间零点 |
| 上一轮回顾 | L* 前缀(LARTH、LSTROKE 等) | 前次访谈已报告的病史 |
| 确往年 | LARTHYR、LBCANCYR、LBKHIPYR | 自报诊断年份 |
| 设计 | STRATUM / PSU / SUBSAMPL / SWGT1-6 | 分层、聚类、子样本、六套权重 |
| 机构停留 | 各轮 hcfs 文件的入院出院与诊断摘要 | 一次停留一条 |
附录 C 术语与缩写补充
| 缩写 | 全称 |
|---|---|
| NHANES | National Health and Nutrition Examination Survey |
| NHEFS | NHANES I Epidemiologic Follow-up Study |
| NCHS | National Center for Health Statistics |
| NIA | National Institute on Aging |
| NDI | National Death Index |
| RDC | Research Data Center |
| ICD-9 | International Classification of Diseases, 9th Revision |
| CAPI | 计算机辅助个人访谈 |
| PSU | Primary Sampling Unit,初级抽样单元 |
附录 D 常见误读补充
| 场景 | 常见处理 | 问题 | 建议 |
|---|---|---|---|
| 数死亡人数 | 直接对死亡文件取行数 | 一人多行导致偏高 | 先按序列号去重 |
| 算死亡率 | 分母用 1992 年存活人数 | 分母过小,结果偏高 | 用人年或全队列 |
| 拼四轮访谈 | 直接纵向 concat | 1986 轮样本框不同 | 先固定子集 |
| 比较均值 | 直接比各轮均值 | 构成变化混入 | 按年龄分层或标准化 |
| 找血压变化 | 四轮都用 | 1986 后无客观测量 | 只用前两轮 |
| 选取权重 | 默认用第一套 | 权重口径可能不匹配 | 查 Series 2 No.121 |
| 接基线 | 按 SEQN join | 键名不对,得空表 | 用 HANESEQ |
| 用死因 | 当根本死因 | 多死因编码含所有死因 | 明确取哪一条 |
附录 E 引用与再分发注意事项
| 事项 | 要求 |
|---|---|
| 表格来源标注 | 建议写 Source: National Center for Health Statistics (NHEFS) |
| 文献著录 | 按 NCHS 机器可读文件格式著录,注明为数据文件与文档 |
| 免责声明 | 声明分析、解释与结论由作者负责,NCHS 只对初始数据负责 |
| 技术描述一致性 | 若发表数据的技术描述,应尽量不与 NCHS 已发表描述冲突 |
| 二次分发 | 数据为美国联邦政府作品,可再分发;须保留出处,不得暗示官方背书 |
| 受限数据 | 链接死亡文件及其余链接数据不可再分发,只在 RDC 内分析 |
| 版本核对 | 使用前应回官方页面核对文件清单与发布状态 |
| 联系渠道 | 数据链接相关问题由官方页面给出的数据链接邮箱承接 |
编辑说明
核验时间:2026-10-29。核验方式:以 CDC NCHS 官方 NHEFS 页面与官方 README、1992 访谈文件的 SAS 输入声明文件为准;文件体积取自官方下载区的标注。未覆盖内容:各轮访谈的完整字段清单、各轮实际访谈完成人数、基线与随访文件拼接后的实际行数。这些需要在下载全量文件后统计,超出本次写作范围。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- jphc — 共享标签:公共卫生与流行病学 / 队列研究 / 死亡登记 / 流行病学
- charls — 共享标签:公共卫生与流行病学 / 队列研究 / 调查数据 / 流行病学
- nhanes — 共享标签:公共卫生与流行病学 / 调查数据 / 流行病学
- nhis — 共享标签:公共卫生与流行病学 / 调查数据 / 流行病学
- cvss-nvss — 共享标签:公共卫生与流行病学 / 死亡登记 / 流行病学
- mesa — 共享标签:公共卫生与流行病学 / 队列研究 / 流行病学
- chns — 共享标签:公共卫生与流行病学 / 队列研究 / 调查数据
- elsa — 共享标签:公共卫生与流行病学 / 队列研究 / 调查数据
- hunt-study — 共享标签:公共卫生与流行病学 / 队列研究 / 调查数据
- nurses-health-study — 共享标签:公共卫生与流行病学 / 队列研究 / 调查数据
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

