信息速览
一个家庭的晚饭吃多少油、几两肉、几碗饭,三天里每天称一次,连着称三十多年——这件事听起来琐碎,却是观察一个国家营养转型最直接的角度。中国从上世纪八十年代末以来经历的膳食结构变化,在宏观统计里是曲线,在家庭厨房里是具体的锅和碗。CHNS 把镜头架在了厨房门口。
它起步于 1989 年,由美国北卡罗来纳大学教堂山分校的卡罗来纳人口中心与中国疾控中心营养与健康所合作执行,按多阶段随机整群抽样在若干省份抽取县、村与城镇街区,此后每隔数年回访同一批家庭。截至 2015 年完成十轮,覆盖十五个省区,主抽样单元增至三百六十个村居。它的独特之处不在于某一轮做得多大,而在于同一批人被反复测量,个体的膳食、体格、收入与所在社区的变化能挂在同一条时间轴上。
代价同样清楚:它不是全国概率样本,新增省份与直辖市属于扩充样本,社区层数据受保密条款约束不能直接下载,跨越省界的迁移家庭不再追踪。它是一个能看到"变化"的调查,不是一个能估出"全国总数"的调查。一屏速览见下表。
| 维度 | 内容 |
|---|---|
| 全名 | China Health and Nutrition Survey(中国健康与营养调查) |
| 执行机构 | 卡罗来纳人口中心(美国北卡罗来纳大学教堂山分校)与中国疾控中心营养与健康所 |
| 启动年份 | 1989 年 |
| 已完成轮次 | 1989、1991、1993、1997、2000、2004、2006、2009、2011、2015,共十轮 |
| 覆盖省区 | 十五个(北京、重庆、广西、贵州、黑龙江、河南、湖北、湖南、江苏、辽宁、陕西、山东、上海、云南、浙江) |
| 抽样起点 | 按收入分层,每省抽四个县,另尽量抽省会与一个低收入城市 |
| 主抽样单元 | 三百六十个:六十个城区居委会、六十个郊区居委会、三十个镇、一百八十个村 |
| 单轮规模 | 2015 年约七千三百户、两万零九百人,三百六十个村居 |
| 累计参与者 | 曾参与个体逾四万二千人,曾参与家户逾一万一千户 |
| 膳食模块 | 家庭连续三日记账与库存,个体连续三日二十四小时回顾 |
| 体格模块 | 身高、体重、腰围、上臂围、头围、皮褶厚度、血压 |
| 生化模块 | 2009 年起,二十六项空腹血指标,此后每隔一轮采集生物样本 |
| 社区模块 | 社区问卷、食品市场走访、卫生与计划生育机构调查 |
| 文件格式 | SAS(.sas7bdat),每表配 PDF 码本 |
| 获取方式 | 家户与个体层经 UNC Dataverse 免费下载,社区层须签协议并缴费 |
| 典型用途 | 营养转型追踪、慢性病风险因素研究、卫生政策与收入不平等评估 |
§1 它要解决的具体麻烦
1.1 一顿饭的摄入量,无法用人均曲线替代
营养流行病学要回答的问题,几乎都落在个体层面:某个人的体重上升,是总热量增加造成的,还是体力活动下降造成的;一个村子的小卖部变多以后,村里儿童的含糖饮料摄入是不是跟着上去;收入提高之后,肉类的来源从自家养殖转向市场购买,这个转向对脂肪结构有什么影响。这些问题用国家统计局的粮食产量除以人口数都答不了,因为人均供给量与个体摄入量之间隔着储存、损耗、分配与年龄性别结构。
CHNS 的解法是把测量做进家庭。每个被抽中的家户要连续三天记录全部食物的购入与消耗,同时每一个家庭成员要做连续三天的二十四小时膳食回顾,由调查员逐项询问、逐项折算。家庭总量与个体摄入两条数据并行收集,前者用来验证后者,后者用来回答个体层面的问题。这套做法在八十年代末的中国属于少见的高成本设计,调查队需要携带秤具上门,对调味品、食用油这类难以计量的项目还要做家庭专用换算。
测量精度上的一个细节能说明这套设计的价值:官方在质量控制的说明里提到,调味品若按平均用量估算,一家人的能量摄入会有明显偏差;改用家庭专用称量,同一户的估计值会发生变化。这类差异在跨国比较或者简单的食物频率问卷里被抹平了,在 CHNS 里被显式记录了下来。
1.2 三条常见的错误期待
第一条,期待它是"中国版的全国营养调查"。全国营养调查由卫生主管部门组织,按全国代表性抽样,覆盖面与本调查不同。CHNS 的十五个省区里没有纳入西部若干人口大省,县域抽样是按收入分层抽取四个县而非按人口比例分配,把它当作全国患病率的分母会系统性偏离。
第二条,期待它有"一套从 1989 到最新一年的连续变量"。问卷在三十多年里改过多次,2004 年之前的编号体系与之后不同,变量名统一到 2000 年口径,部分 1989 年的问卷题目从未录入计算机文件。官方在文档里把这些断点逐一列出,使用者若不做轮次间的对齐,会得到一条把不同口径混在一起的假时间序列。
第三条,期待它像影像数据集那样"下载即用"。它的基本形态是上百个 SAS 表加 PDF 码本,每个表的分析单元各不相同,有家户、个体、职业、食物条目、卫生机构等层级,合并需要精确知道每张表的主键与排序变量。把它当作一张宽表来读,第一步就会在合并环节出错。
1.3 它能给到的与给不到的
| 你的需求 | 它给的 | 够不够 |
|---|---|---|
| 个体膳食摄入的纵向变化 | 连续三日回顾,跨轮次同编号追踪 | 够,但要处理轮次间问卷改版 |
| 家庭食物消耗与库存 | 连续三日记账,含调味品与自产食物 | 够,是它区别于其他调查的部分 |
| 体格与血压的多年趋势 | 身高体重腰围血压,多轮重复测量 | 够,测量规程在轮次间有调整需核对 |
| 血生化指标 | 2009 年二十六项空腹指标,此后隔轮采集 | 部分够,公开轮次有限 |
| 社区环境与食品可得性 | 社区问卷、食品市场、卫生机构 | 够,但须签协议缴费才能拿 |
| 全国患病率估计 | 十五省区非全国概率样本 | 不够,只能做有边界的推断 |
| 精确地理定位 | 只给社区编号,坐标从不原样发放 | 不够,需付费委托链接 |
| 临床诊断与用药明细 | 自报慢病与就医,无病历级记录 | 不够,诊断靠自报而非病案 |
1.4 你的处境与它能帮到的事
| 你的处境 | 它能帮你什么 | 下一步该做什么 |
|---|---|---|
| 你要研究中国居民膳食结构转型,需要个体级证据 | 提供同一批人跨十轮的膳食回顾与家庭记账 | 先确认目标轮次是否在同一问卷版本内,再决定是否跨版本合并 |
| 你在做慢性病风险因素研究,缺中国城乡对照 | 体格、血压、吸烟饮酒、体力活动齐备 | 用县级或村居层抽样单元做聚类稳健标准误,别按个体独立处理 |
| 你要评估某项卫生政策的地区差异 | 社区问卷含卫生机构、保险覆盖与服务可及性 | 需申请社区层数据,预算处理费与伦理审批周期 |
| 你在做营养与收入的联合分析 | 家户收入分项、个体收入、膳食摄入均在同一编号体系下 | 用派生收入文件而非原始问卷项,两套口径官方都已给出 |
| 你要训练一个膳食摄入预测或插补模型 | 三日回顾与家庭记账构成可交叉验证的两路测量 | 注意家庭总量不能直接平均到个人,须按人份分摊规则处理 |
| 你只需要一个开箱即用的表格 | 上百个 SAS 表、PDF 码本、多层主键 | 先画一张表与主键的对照图,再写一行导入代码 |
1.5 一句话判断
它最适合被当作"变化的放大镜",而不是"水平的标尺":同一批人身上的前后差异是它最可信的输出,跨人群的绝对高低则需要额外说明抽样边界。
1.6 不适合谁:四条边界
不适合做全国代表性估计。 抽样限于十五个省区,且按收入分层抽取固定数量的县,县域之间不是按人口规模加权。要用它估计全国患病率,必须重新加权并在方法节里说明推断范围。
不适合做临床诊断级研究。 慢病信息以自报为主,体检项目是体格与血压,血生化只有部分轮次。没有病历、影像、处方与住院记录。用它做疾病分型会缺少关键依据。
不适合做跨省迁移家庭的追踪。 官方说明跟随在原抽样单元内的移动,迁出到新社区的家庭不再追踪。研究流动人口的样本会系统性偏向未迁移者。
不适合做即插即用的机器学习基准。 变量跨轮次不一致、缺失码有多种约定、派生变量与原始变量并存。没有清洗与对齐脚本,直接喂进模型会得到无法解释的噪声。
§2 数据构成与规格
2.1 三层数据:家户、个体、社区
整个调查的数据按三个层级组织,每层各有一张主键。家户层的主键是九位家户编号,个体层的主键是十二位个体编号,社区层的主键是六位社区编号,三者都带一个轮次变量。同一轮次内,个体编号可以上挂到家户编号,家户编号再上挂到社区编号;跨轮次时,个体编号保持不变,家户编号可能随分家而改变。
| 层级 | 主键 | 位数 | 说明 | 一行代表 |
|---|---|---|---|---|
| 家户 | HHID | 九位 | 由原抽样单元变量拼接而成 | 一个家户在一个轮次 |
| 个体 | IDind | 十二位 | 全部轮次与全部数据集共用 | 一个个体在一个轮次 |
| 社区 | COMMID | 六位 | 由原抽样单元变量拼接而成 | 一个村居在一个轮次 |
| 其他单元 | 视表而定 | — | 职业、牲畜种类、食物条目、卫生机构等 | 一个该类对象 |
除三层主表之外,还有若干以其他对象为分析单元的表。官方文档举的例子是职业表:一个职业代码对应一行,排序键是家户编号、行号与职业号三者组合。牲畜表、食物条目表、卫生机构表都遵循同样的逻辑。这种多层结构决定了合并方式:先把每张表的分析单元认清楚,再决定按哪几个键连接。
2.2 模块与文件字典
下表按模块列出数据内容与对应的文件线索。列出的文件名来自公开的数据集目录与官方派生变量说明,具体变量清单以各表的 PDF 码本为准。
| 模块 | 内容 | 典型文件或线索 | 分析单元 | 使用注意 |
|---|---|---|---|---|
| 家户名册 | 家庭成员、与户主关系、行号 | 名册文件 | 个体 | 行号是后续所有个体表的连接键之一 |
| 家户经济 | 收入分项、支出、耐用消费品、住房条件 | 家户表 | 家户 | 收入另有派生文件,口径与原始项不同 |
| 个体问卷 | 教育、就业、婚姻生育、吸烟饮酒、体力活动 | 成人表、儿童表 | 个体 | 2004 年起拆成成人与儿童两套 |
| 膳食回顾 | 连续三日二十四小时回顾 | 营养表 | 个体 | 折算需相应的食物成分表版本 |
| 家庭记账 | 连续三日食物购入与消耗、库存 | 营养表 | 家户 | 与个体回顾口径不同,不可互相替代 |
| 体格测量 | 身高、体重、腰围、上臂围、头围、皮褶、血压 | 体检表 | 个体 | 测量规程在轮次间有调整 |
| 生化 | 二十六项空腹血指标 | biomarker_09 等 | 个体 | 仅部分轮次公开 |
| 社区问卷 | 基础设施、服务、人口、工资 | 社区表 | 社区 | 需协议后发放 |
| 食品市场 | 代表性商品篮子价格 | 市场表 | 社区 | 1997 年后仅自由市场与大型商店 |
| 卫生与计划生育机构 | 人员、经费、服务、价格、距离 | 机构表 | 机构 | 1997 年后并入社区问卷 |
| 派生收入 | 家户与个体年收入,名义与可比价 | hhinc_10、indinc_10 | 家户/个体 | 2011 年全面修订过构造方法 |
| 派生营养素 | 日均热量、蛋白质、脂肪、脂肪供能比 | c12diet | 个体 | 由膳食回顾折算 |
| 城乡标记 | 城市/农村 | urban_11 | 社区 | 由原抽样单元变量构造 |
| 权重 | 抽样权重说明 | weights-chns.pdf | — | 使用前必读 |
官方在数据集说明里把补充材料单独列成一个文件包,其中一份是权重说明,一份是数据集之间的关系图。这两份文件对正确合并至关重要,比单独几张表更值得先读。§4.3 的案例(家庭用油)就是一个现成的检验:把营养表与家户名册按编号连起来之后,先看能否复现出一户人家三天内的用油总量,再往下走。
2.3 一个个体在某一轮里的完整解剖
以一名 2009 年参与的成年人为例,看数据是怎么挂起来的。个体编号在全部轮次共享,因此跨轮查询只需要这一个键;家户编号会随分家变化,所以要研究家庭结构变化,得同时取两个编号与轮次。
个体层一行(示意,字段名以官方码本为准)
IDind 120701150033 十二位个体编号,全轮次不变
Wave 2009 调查轮次
HHID 110201305 九位家户编号,本轮所属家户
COMMID 110201 六位社区编号
LINE 12 家户名册中的行号
T3 1102 原抽样单元变量,构成家户编号的前段
年龄 48 由主编号文件中的出生日期与本轮访谈日期计算
性别 男
身高三日测 172.5 厘米,体检表
体重 71.3 千克,体检表
收缩压 128 毫米汞柱
舒张压 81 毫米汞柱
膳食回顾行项 三日逐日逐餐记录 营养表,按食物条目展开
家户记账行项 三日购入与消耗 家户层,与个人回顾分开存
把这几张表在同一个轮次内连起来,需要三个键:个体编号连个体表,个体编号加家户编号连家户表,家户编号加社区编号连社区表。跨轮次时只用个体编号连,因为家户与社区都可能变。
读取的典型写法:
import pandas as pd
#-- 三张表先各自读进来,再按轮次与编号逐层左连接
ind = pd.read_sas("IDIND_12.sas7bdat", format="sas7bdat", encoding="utf-8")
hh = pd.read_sas("HHINC_10.sas7bdat", format="sas7bdat", encoding="utf-8")
pe = pd.read_sas("PE_12.sas7bdat", format="sas7bdat", encoding="utf-8")
ind["WAVE"] = ind["WAVE"].astype(int)
pe["WAVE"] = pe["WAVE"].astype(int)
#-- 个体表与体检表按个体编号加轮次连接
merged = ind.merge(pe, on=["IDind", "WAVE"], how="left", suffixes=("", "_pe"))
#-- 家户收入按家户编号加轮次连接,一轮一户只应有一行
hh = hh.drop_duplicates(subset=["HHID", "WAVE"])
merged = merged.merge(hh, on=["HHID", "WAVE"], how="left")
print(merged.shape, merged["WAVE"].value_counts().sort_index().head())
实战中第一次跑通之后,最常见的下一个问题不是代码写法,而是字段名的实际拼写与大小写在不同轮次里不一致。官方对此的态度是:纵向主文件已经把变量名统一到 2000 年问卷口径,横向的年度文件则保留各轮原样。想要省事就用纵向主文件,想要复原某一轮原始问卷就用年度文件。
2.4 各轮规模的官方口径
官方在抽样页给出了逐轮的村居数、家户数与个体数。这张表是全篇最需要完整照录的规模数字,因为它决定了一切跨轮比较的分母。
| 轮次 | 村居数 | 家户数 | 个体数 |
|---|---|---|---|
| 1989 | 180 | 3,795 | 15,907 |
| 1991 | 189 | 3,619 | 14,797 |
| 1993 | 181 | 3,456 | 13,895 |
| 1997 | 191 | 3,875 | 14,441 |
| 2000 | 215 | 4,396 | 15,831 |
| 2004 | 216 | 4,387 | 12,308 |
| 2006 | 218 | 4,467 | 11,860 |
| 2009 | 217 | 4,517 | 12,178 |
| 2011 | 289 | 5,923 | 15,725 |
| 2015 | 360 | 7,319 | 20,914 |
| 累计曾参与 | 388 | 11,130 | 42,829 |
三点值得留意。第一,个体数在 2004 年出现明显下降,与问卷改版、成人儿童分卷、抽样单元补充的时点重合,不能直接读成人口减少。第二,2011 年的村居数跳升与三个直辖市加入有关,2015 年再跳升与三个新省份加入有关,这两段增长是扩充样本而非原有样本的自然扩张。第三,官方在同一页面另有一处描述说全调查约四千四百户、约一万九千人,那是对常规轮次的概括说法,与上表的逐轮数字并存。
2.5 与其他全国性调查的边界差异
| 对比项 | CHNS | 韩国国民健康与营养调查 | 中国健康与养老追踪调查 | 美国国民健康访谈调查 |
|---|---|---|---|---|
| 抽样代表性 | 十五省区,非全国概率样本 | 全国代表性,年度横断面 | 全国代表性,四十五岁以上 | 全国代表性,家庭访谈 |
| 时间形态 | 开放队列,隔数年回访同一批人 | 年度独立样本 | 多轮追踪同一批人 | 年度独立样本,可做纵向 |
| 膳食测量 | 三日回顾加家庭记账 | 二十四小时回顾加食物频率 | 以问卷为主 | 二十四小时回顾 |
| 体格测量 | 入户体检 | 体检中心统一测量 | 入户测量 | 部分年份体检 |
| 社区层数据 | 有,须协议与缴费 | 有,部分公开 | 有,部分公开 | 有限 |
| 生物样本 | 2009 年起隔轮采集 | 有 | 有 | 部分年份 |
| 获取门槛 | 家户个体层免费,社区层收费 | 注册后免费 | 注册后免费 | 免费 |
这张表要说的只有一件事:CHNS 在"膳食测量深度"和"社区环境测量"两项上明显占优,在"抽样代表性"一项上不及三个对照。选它的人通常是看中了前两项,而低估了第三项带来的解释边界。
§3 它是谁的数据:两套机构的三十年合作
3.1 合作结构与分工
调查由美方的卡罗来纳人口中心与中方的中国疾控中心营养与健康所共同执行。官方对合作方式的表述是资金、专业与技能由双方共享,这与许多"外方出钱、中方执行"的模式不同。中方机构提供的是入户网络、地方协调与对问卷语境的把握,美方提供的是抽样设计、问卷构造与数据分析方法。
这种结构解释了数据里同时存在的两种特征:一方面,问卷设计带有明显的社会科学取向,收入不仅问货币收入,还问自产食物、补贴住房、非市场劳动的时间分配;另一方面,执行层面带着中国基层卫生防疫系统的组织能力,二十多个省区的调查队能在同一周内完成入户与体检。
3.2 时间线
| 时间 | 事件 | 意义 |
|---|---|---|
| 1989 | 首轮调查,含家户、社区、卫生与计划生育机构数据 | 基线建立,仅对学龄前儿童与二十至四十五岁成人收集健康营养数据 |
| 1991–1993 | 加强质量控制,调查队赴美培训 | 官方称此前的部分省份程序问题在此后得到纠正 |
| 1997 | 增加一个省份,新增老龄、体力活动与不活动数据 | 主题从营养扩展到行为与老龄化 |
| 2000 | 此前退出的省份回归,新增大众媒体使用数据 | 样本恢复,覆盖主题再扩展 |
| 2004 | 个体问卷拆分为成人与儿童两套 | 问卷结构的重大改版 |
| 2009 | 首次采集生物样本与地理坐标 | 从问卷与体格扩展到生化与空间 |
| 2011 | 北京、重庆、上海三个直辖市加入 | 扩充样本,村居数从两百余增至近三百 |
| 2015 | 陕西、云南、浙江加入,中方全额资助 | 扩充样本,村居数增至三百六十 |
| 2019 | 家户与个体层数据在 UNC Dataverse 建立正式数据集记录 | 获取方式从官网直接下载转向仓储平台 |
时间线的后半段说明了它的一个基本特征:每一次规模扩张都伴随问卷内容调整,而扩张的动因常常是中方补充经费。这既是它持续的条件,也是跨轮比较困难的根源。
3.3 抽样是怎么做的
抽样分三个阶段。第一阶段在省内按收入分层,把县分为低、中、高三组,用加权抽样的方式每省随机抽四个县。第二阶段在城市侧,尽量抽取省会与一个低收入城市,有两个省因故改抽其他大城市。第三阶段在县内随机抽村与镇,在城市内随机抽城区与郊区居委会。
起始时主抽样单元约一百九十个,主要分布在九个省份。此后随省份补充与村居替换逐步增加,到 2015 年达到三百六十个,构成为六十个城区居委会、六十个郊区居委会、三十个镇与一百八十个村。
| 主抽样单元类型 | 2015 年数量 | 对应人群 |
|---|---|---|
| 城区居委会 | 60 | 城市居民 |
| 郊区居委会 | 60 | 城市边缘与城郊结合部 |
| 镇 | 30 | 建制镇居民 |
| 村 | 180 | 农村居民 |
| 合计 | 360 | 城乡四类 |
这个构成说明它并非城乡各半:农村单元占一半,郊区单元又占六分之一,城市中心单元只有六分之一。做城乡比较时,这个配比决定了城市样本的内部异质性主要来自郊区而非中心城区。
3.4 三轮之后的样本维护规则
官方对样本维护有明确规则,这些规则直接影响纵向分析。
| 时间点 | 规则 | 对分析的影响 |
|---|---|---|
| 1991 | 只调查原样本家户中的成员 | 该轮不含新增家庭 |
| 1993 起 | 原样本家户分裂出的新家户,只要仍在样本区,纳入 | 分家形成的青年家庭进入样本 |
| 1997 起 | 样本区内新成立家户纳入,并补充家户替代退出的家户 | 保住每轮规模,但引入了非原队列成员 |
| 1997 起 | 退出社区用新社区替代,并新增一个省份 | 社区层出现序列上的替换 |
| 全期 | 迁出原社区的整户不追踪,社区内移动尽力追踪 | 流动人口系统性缺失 |
第四行与第五行合起来造成一个后果:越到后期,样本越像一个"在原社区持续居住的家庭组合",而非最初那批人的完整追踪。做长期趋势分析时,必须区分"原队列成员"与"补充成员"两类,否则会把新加入者的特征误读成原有群体的变化。
§4 它最独特的东西:同一批人的三日刻度
4.1 为什么"三日"这个长度不多不少
膳食测量的方法学里有两条常见路线。一条是食物频率问卷,问过去一年某种食物多久吃一次、每次吃多少,成本低、能覆盖长周期,代价是依赖记忆与估算,个体层面的误差大。另一条是二十四小时回顾,问过去二十四小时内吃了什么、多少量,回忆负担小,代价是单日不能代表常态。
CHNS 选择的是把后者重复三次:连续三天逐日询问。这个长度不是随手挑的。单日回顾最大的问题是个体内部变异——周末与工作日的饮食不同,请客与平时的饮食不同,一个人隔一周再测一次,数值可能差出一半。重复三日无法消除变异,但能把"个体内部变异"与"个体之间差异"初步区分开,使得群体均值比单日稳定得多。
家庭层的三日记账补上了另一个维度。个体回顾问的是"你吃了多少",家庭记账记的是"家里买了多少、消耗了多少、剩了多少"。两路数据交叉,可以检查回顾是否遗漏了共食的部分,也能捕捉到个体回顾难以问清的项目,比如炒菜用的油、腌制的酱菜、自家菜园里的蔬菜。
| 测量方式 | 覆盖周期 | 记忆负担 | 适合回答的问题 | 主要弱点 |
|---|---|---|---|---|
| 三日二十四小时回顾 | 三天 | 中 | 个体摄入的短期均值 | 不能反映季节与节日 |
| 三日家庭记账 | 三天 | 中 | 家庭总消耗与食物来源 | 无法直接分摊到个人 |
| 食物频率问卷 | 一年 | 高 | 长期习惯性摄入 | 估算误差,份量难定 |
| 食物库存清单 | 时点 | 低 | 家庭储备水平 | 不反映实际摄入 |
官方在 2015 年这一轮另加了食物频率问卷,与三日回顾并行收集。这一改动让同一批人身上出现了两种测量方式,为研究测量误差本身提供了少见的素材。
4.2 食物成分表是另一个会换版的变量
膳食回顾记录的是食物与重量,要变成营养素,必须乘以食物成分表。官方在常见问题里明确说明调查用过三个版本:1981 年版用于 1989、1991、1993 三轮,1991 年版用于 1997 与 2000 两轮,2002 年与 2004 年版合并使用于 2004 至 2011 各轮。
| 成分表版本 | 适用轮次 | 对跨轮比较的含义 |
|---|---|---|
| 1981 年版 | 1989、1991、1993 | 早期三轮回溯折算的基准 |
| 1991 年版 | 1997、2000 | 与前一版存在数值差异 |
| 2002/2004 版 | 2004、2006、2009、2011 | 后期四轮共用 |
| 官方未说明 | 2015 | 公开页面未给出该轮所用版本 |
这张表对使用者非常重要。同一份食物记录,用不同版本的成分表折算,得到的脂肪供能比、钠摄入量会有差异。把 1993 年与 2004 年的营养素摄入直接画在同一条趋势线上,误差里混进了成分表换代这一项。严谨的做法是在方法节里声明:营养素趋势是按轮次各自成分表折算后的结果,跨版本差异未做回溯统一。
食物成分表本身的版权在中方机构,官方明确表示无法随数据一起发布。这意味着使用者拿到的是食物条目与重量,必须自行准备成分表或使用官方给出的派生营养素文件。派生文件 c12diet 提供日均热量、蛋白质、脂肪与脂肪供能比四项,是绕开这一障碍的最简路径。
4.3 案例:一罐食用油在三十年里的两次测量
用一个具体的测量对象把上面两节串起来:家庭食用油的消耗。
在家庭记账里,油属于"难以逐餐计量"的项目。调查队要求家户在三日观察期内记录油的购入量与剩余量,再按家庭人口分摊。如果只是问"你家一个月吃几斤油",得到的答案会受包装规格、赠送、外食等因素干扰;三日记账把这个窗口缩短到能看清的程度。
在个体回顾里,油不单独成项,而是隐含在每一道菜的烹调方式里。调查员询问菜名与做法,再按菜谱折算用油量。这两种路径得到的数值天然不一致:记账法包含外食与浪费,回顾法只计入被访者本人吃下的部分。
§4.3 的案例之所以值得反复引用,是因为它把 CHNS 的三个特征同时暴露出来。第一,它的测量单位是"天"而不是"年",所以能看见季节性,看不见年度总量。第二,它的两条测量路径互相不能替代,家庭总量除以人数不等于个体摄入,因为老人与儿童的摄入量差得很远。第三,油这类项目的折算强依赖当地菜谱习惯,同一份重量在不同省份折算出的脂肪量不同。
这个案例在 §5 的取数流程里会再出现一次:如果你想复现"家庭人均食用油摄入"这个指标,必须同时读营养表与家户名册,再决定分摊规则。§7 讨论偏差时还会回到它:油摄入的测量误差不是随机噪声,而是随烹调方式系统变化的偏差。
4.4 生物样本这一层做了什么
2009 年是数据的第二个转折点。这一年首次采集并公开了空腹血指标,官方说明包含二十六项,覆盖血脂、糖化血红蛋白、血糖、胰岛素、甘油三酯、C 反应蛋白等心血管相关指标,以及转铁蛋白、血红蛋白、铁蛋白等营养相关指标,对象是七岁及以上的人群。同年开始采集地理坐标,并对社区中心、主要餐馆与市场、被访者住家逐一记录。
| 新增能力 | 起始轮次 | 公布节奏 | 使用门槛 |
|---|---|---|---|
| 空腹血生化 | 2009 | 清理完成后满一年发布 | 须签协议并取得伦理批准 |
| 地理坐标 | 2009 | 从不原样提供 | 须付费委托链接 |
| 生物样本本体 | 2009 起隔轮 | 同上 | 须另提辅助研究申请 |
| 食物频率问卷 | 2015 | 随该轮数据发布 | 无需额外申请 |
这把调查从"问出来的数据"推到了"测出来的数据"。它的意义不在于多了几个指标,而在于生化指标可以与同一批人的膳食回顾、体格测量、收入变化挂在同一个编号下。营养流行病学里最难的一步,往往是把实验室指标与自报膳食对上号,这一步在这里由设计本身完成了。
4.5 什么情况下它不再适用
三类情形会让它的价值快速下降。
第一类是要求精确到个人的能量平衡计算。三日回顾加体格测量能给出粗略的能量摄入与体重变化,但要推算个体的能量消耗,需要基础代谢率、体力活动的强度与时长,体力活动数据以自报为主,精度不足以支撑个体级的能量平衡。
第二类是要求追踪跨省流动的家庭。官方明确迁出原社区的家庭不再追踪,凡是以流动人口为主体的研究,用它都会得到偏误样本。
第三类是把社区层当作可直接使用的环境暴露数据。社区层本身受保密约束,且坐标不原样提供,任何需要把社区与外部空间数据(如附近餐馆密度、绿地面积)连接的研究,都必须走付费链接流程,周期以周计。
§5 怎么拿到:从 Dataverse 到可分析表
5.1 两扇门:免费下载与协议申请
获取路径按数据层级分成两扇门。家户层、个体层与部分低层级数据可以直接从 UNC Dataverse 下载,无需签署协议;社区层与县级汇编数据、地理坐标、生物样本属于另一扇门,需要签署数据使用协议并缴费。
官方对免费部分的表述是"免费通过网页发布",对受限部分的表述是"可能被用来推断调查地点,因此使用受限"。这两句话划出了整个获取流程的分界。
| 数据 | 渠道 | 费用 | 前置条件 |
|---|---|---|---|
| 家户层、个体层 | UNC Dataverse | 免费 | 无需申请,下载即用 |
| 社区层、县级汇编 | 项目组 | 处理费 | 协议、本地伦理批准、材料清单 |
| 地理坐标 | 项目组 | 从不原样提供 | 须委托链接服务,按类型收费 |
| 生物样本 | 项目组 | 官方未公布 | 协议、伦理批准、研究说明 |
| 问卷与码本 | 官网 | 免费 | 无 |
5.2 免费部分的数据集结构
UNC Dataverse 上的 CHNS 集合包含六个已发布数据集,每个数据集内是若干 SAS 表配 PDF 码本。下表按标题列出,文件数与合计体积取自数据集元数据。
| 数据集 | 内容 | 文件数 | 合计体积 |
|---|---|---|---|
| Household-Level Data | 家户层各表 | 三十 | 约一百一十兆字节 |
| Individual-Level Data | 个体层各表 | 五十四 | 约九百一十兆字节 |
| Diet Data | 派生营养素 | 二 | 约十二兆字节 |
| Biomarker Data | 二〇〇九年血生化 | 一 | 约四兆字节 |
| Constructed Variables | 派生收入与城乡标记 | 四 | 约三十四兆字节 |
| Supplemental Files | 权重说明与表关系图 | 二 | 不足一兆字节 |
文件命名有明显的规律:主体前缀加两位轮次后缀,例如以 _12 结尾的表对应某一批数据,以 _10 结尾的派生收入表表示跨轮合并后的版本。这个规律便于批量处理,但也容易让人误以为后缀就是年份——它不是年份,而是内部批次编号。
5.3 用 API 列出并下载
Dataverse 提供公开的 REST 接口,不需要登录即可列举集合内容、读取数据集元数据。下面三段代码分别完成列举、查元数据与下载。
#-- 列出 CHNS 集合下的全部数据集及其 DOI
curl -sL "https://dataverse.unc.edu/api/dataverses/chns/contents" \
| python3 -c "import sys,json;[print(x['type'],x.get('persistentUrl')) for x in json.load(sys.stdin)['data']]"
import json
import urllib.request
def dataset_meta(doi):
url = "https://dataverse.unc.edu/api/datasets/:persistentId/?persistentId=" + urllib.parse.quote(doi)
with urllib.request.urlopen(url, timeout=60) as resp:
return json.load(resp)["data"]["latestVersion"]
ver = dataset_meta("doi:10.15139/S3/EIN92W")
print(ver["versionState"], ver.get("releaseTime"))
for f in ver["files"][:3]:
df = f["dataFile"]
print(df["filename"], df.get("filesize"), df.get("id"))
#-- 按文件编号下载单个文件,编号从上一步的文件 id 取
FILE_ID=123456
curl -sL -o asset_12.sas7bdat \
"https://dataverse.unc.edu/api/access/datafile/${FILE_ID}"
ls -lh asset_12.sas7bdat
三条命令的顺序有讲究:先列举确定要哪个数据集,再查元数据拿到文件编号,最后按编号下载。直接拼接文件名拼 URL 是不行的,Dataverse 的下载地址用的是内部文件编号而不是文件名。
5.4 读进分析环境
SAS 表在 Python 里可以直接读,但要处理两件小事。一是缺失码,官方说明负数值与部分大正数都被用来标记缺失,读进来之后必须先替换成真正的空值再算均值。二是字符编码,早期文件里的中文字段在不同工具下可能显示异常。
import pandas as pd
import numpy as np
MISSING = {-9, -99, -999, -8, -88, -888, 99, 999, 88, 888}
def load(path, cols=None):
df = pd.read_sas(path, format="sas7bdat", encoding="utf-8")
df = df.replace(list(MISSING), np.nan)
return df[cols] if cols else df
pe = load("pe_12.sas7bdat")
#-- 身高体重的合理范围过滤,超出范围视为录入或单位错误
pe = pe[(pe["HEIGHT"].between(100, 210)) & (pe["WEIGHT"].between(25, 200))]
print(pe.groupby("WAVE")[["HEIGHT", "WEIGHT"]].mean())
缺失码这一步不能省。官方文档明确说"许多缺失值并未在问卷中标注",意味着单看码本无法穷举全部缺失标记。稳妥做法是把所有负值先按缺失处理,再逐个变量核对其取值域是否合理。
5.5 社区层与空间链接
社区层的获取流程是行政流程而不是技术流程。官方给出的步骤是:完成数据使用协议、取得本地伦理委员会批准、提交协议要求的材料(研究说明、团队成员名单与所在机构、数据访问控制措施、伦理批准函与编号)、缴纳处理费,然后由项目组在约三周内答复是否批准,批准后再约三周发出数据。
空间链接另有三类服务,各自定价不同:按行政区划代码的表连接、由研究者提供数据的空间连接、以及委托项目组采集空间数据。前两类都要付费,且项目组保留对数据做模糊化处理以减少推断性披露的权利。
| 服务类型 | 处理费 | 说明 |
|---|---|---|
| 按行政区划代码表连接 | 有固定处理费,另有推断披露附加费 | 需提交带区划代码的数据 |
| 研究者提供数据的空间连接 | 费用高于前者,另加报价 | 连接结果可能被模糊化 |
| 委托采集空间数据 | 费用另议 | 项目组代为采集 |
协议里有一条专门的统计发布规则值得留意:任何交叉表的单元格频数不得少于三条记录,任何行的合计与列的合计不得少于三条记录,任何数量指标不得基于少于三条记录。这条规则直接影响你能发表什么粒度的结果,尤其在农村小样本子组上。
5.6 五个最容易出错的地方
| 出错点 | 表现 | 处理 |
|---|---|---|
| 把缺失码当真实值 | 均值被负数拉低 | 先按码表替换再统计 |
| 家户总量均摊到个人 | 老人儿童摄入量被平均成同一水平 | 按人份或按年龄性别系数分摊 |
| 跨轮直接拼接 | 问卷改版与成分表换代被忽略 | 按轮次分层报告中转变量 |
| 忽略补充样本 | 2011 与 2015 的增长被读成原有群体变化 | 区分原队列成员与补充成员 |
| 把社区层当公开数据 | 下载不到,误以为数据缺失 | 走协议流程,预算处理费与审批周期 |
§6 与库内相关数据集的关系
6.1 关系图谱
CHNS 在库内的位置,可以用"测量频率 × 追踪长度"两个轴摆出来。横轴是同一批人被测量的次数,纵轴是跨度。CHNS 在横轴上占优——一个人可以被测十次以上;在纵轴上不占优势——跨度三十余年,短于纯登记型数据。
| 库内记录 | 追踪形态 | 膳食测量 | 体格测量 | 与 CHNS 的关系 |
|---|---|---|---|---|
| 韩国国民健康与营养调查 | 年度横断面,不同人 | 二十四小时回顾 | 体检中心测量 | 最直接的对照:同为营养调查,一个追人,一个换人 |
| 中国健康与养老追踪调查 | 多轮追踪四十五岁以上 | 以问卷为主 | 入户测量 | 人群互补:它偏老龄,CHNS 含全年龄 |
| 美国国民健康访谈调查 | 年度独立样本 | 二十四小时回顾 | 部分年份 | 方法参考,不代表中国 |
| 台湾健保理赔档案 | 全人群行政记录 | 无 | 无 | 互补:它有就诊与用药,CHNS 有膳食与环境 |
| 英格兰医院活动统计 | 全量住院事件 | 无 | 无 | 互补:一个看结局,一个看暴露 |
与韩国那一份的对照最有信息量。两者都叫"健康与营养调查",都用二十四小时回顾,都有体格测量,但一个每年换一批人、一个隔数年回访同一批人。前者适合估年度患病率与政策截面效果,后者适合看同一批人的变化轨迹。选错方向会把队列的追踪优势浪费掉,也会把横断面的代表性优势误当成长处。
6.2 检索路径
| 你要找的东西 | 检索词 | 会落到哪里 |
|---|---|---|
| 同为膳食调查的其他国家版本 | 国民健康与营养调查、nutrition survey | §6.1 表第一行 |
| 中国老龄人群的对照队列 | 中国健康与养老追踪调查 | §6.1 表第二行 |
| 行政记录型的对照 | 理赔档案、登记数据 | §6.1 表后两行 |
| 社区环境与食品可得性 | 食品市场、社区问卷、空间链接 | §5.5 |
| 膳食测量方法学 | 二十四小时回顾、称重记账、食物频率问卷 | §4.1 与 §4.2 |
| 生物标志物合并 | 空腹血、糖化血红蛋白、生物样本 | §4.4 |
6.3 与其他队列的分工判据
| 任务 | 该用哪一份 | CHNS 的位置 | 原因 |
|---|---|---|---|
| 估全国患病率 | 全国代表性命中调查 | 不适用 | 十五省区非全国概率样本 |
| 看同一批人的膳食轨迹 | CHNS、老龄追踪队列 | 主力 | 十轮个体级膳食回顾 |
| 看家庭食物来源变化 | CHNS | 主力 | 家庭记账含自产与外购 |
| 看社区环境与个体行为的关联 | CHNS 加社区层 | 主力之一 | 社区问卷加食品市场 |
| 看就诊与用药 | 行政理赔档案 | 不适用 | 无病历级记录 |
| 看急性传染病负担 | 登记与监测体系 | 不适用 | 以慢性病风险因素为重心 |
| 校准膳食测量误差 | CHNS 加食物频率问卷 | 有条件可用 | 2015 年起双路测量 |
前两行是绝大多数人的真实选择:做全国估计时用代表性调查,做变化分析时用 CHNS。把这两件事搞反的人不少,最常见的错法是用 CHNS 算出"中国成人超重率"这样的全国指标,再用它去和别的国家比较。
§7 质量评估与局限性
7.0 阅读本节前的一个前置校正
先纠正一个常见的误判:把"非全国代表性"读成"质量差"。这两件事不是一回事。代表性决定的是推断范围,质量决定的是测量可靠程度。一份只覆盖十五个省区的调查,如果抽样与测量都严谨,它在自己的范围内依然可以给出可靠估计;一份覆盖全国的调查,如果膳食只问一天,它在个体层面上依然不可靠。
CHNS 的问题主要在第一类,不在第二类。官方为了这个范围付出了明确代价:县域按收入分层固定抽四个,而不是按人口加权;西部若干人口大省的居民没有纳入初始抽样;2011 年与 2015 年的扩充样本是中方补充经费后新增的,与原有九省不是同一套抽样逻辑。这些是设计选择,不是执行失误。
做错的判断是把这两层混在一起:因为样本不覆盖全国,就断定数值不可信;或者因为执行严谨,就默认数值可以外推到全国。两种读法都会导致结论越界。
7.1 五维评分
按 DAIMS 的常用维度打分,每项 1 至 5 分,分数针对"作为营养与慢性病流行病学研究数据"这个用途。
| 维度 | 分数 | 理由 |
|---|---|---|
| 数据规模 | 4 | 单轮约两万人,累计逾四万,纵向深度罕见 |
| 测量质量 | 4 | 三日回顾加称重记账,但依赖自报与折算 |
| 时间覆盖 | 5 | 十轮跨度三十余年,个体编号全程不变 |
| 文档完整 | 4 | 码本、问卷、缺失码说明齐备,个别项未说明 |
| 可获取性 | 3 | 家户个体层免费,社区层与空间数据门槛高 |
合计二十分。这个结构的含义是:它不是靠单轮规模取胜的数据,而是靠时间跨度取胜的数据;短板集中在受限数据的获取门槛上,而这部分恰恰是它区别于其他调查的地方。
7.2 测量质量的两层
第一层是问卷层面。问卷在三十多年里改过多次,2004 年把个体问卷拆成成人与儿童两套,变量名统一到 2000 年口径,部分 1989 年题目从未录入文件。这些断点在官方文档里有据可查,处理方式是按轮次分层,跨轮比较时只使用在各轮都有对应题的变量。
第二层是折算层面。膳食回顾到营养素要过食物成分表,成分表换过三版;家庭记账到人均摄入要过分摊规则,分摊规则依赖人份与烹调方式。这两步引入的误差不是随机的,而是随年代与地域系统变化的。
| 环节 | 误差类型 | 对跨轮比较的影响 |
|---|---|---|
| 问卷改版 | 结构性断点 | 部分变量在某几轮缺失或定义变化 |
| 成分表换代 | 系统性偏移 | 同一食物的营养素值随版本变化 |
| 分摊规则 | 依赖人份估算 | 家庭人均值在大家庭里偏差更大 |
| 自报摄入 | 社会期望偏差 | 高热量食物倾向于少报 |
| 体格测量规程 | 设备与操作差异 | 轮次间测量值存在小幅台阶 |
7.3 已知的、可枚举的偏差
| 偏差 | 表现 | 影响 |
|---|---|---|
| 覆盖偏差 | 十五省区,西部若干人口大省缺席 | 全国推断需重新加权 |
| 抽样偏差 | 每省固定抽四个县,非按人口比例 | 小省被相对放大 |
| 扩充样本偏差 | 2011 与 2015 新增样本单独加入 | 时间序列出现结构性跳变 |
| 迁移脱落 | 跨社区迁移家庭不追踪 | 流动人口系统性缺失 |
| 分家引入 | 1993 起新增分家户 | 后期样本偏年轻家庭 |
| 自报偏误 | 膳食与慢病均为自报 | 高估健康行为,低估敏感行为 |
| 地理模糊 | 坐标不原样提供,社区可识别性受限 | 空间分析只能做粗粒度 |
| 生化覆盖 | 仅部分轮次采集 | 不能构造完整生化时间序列 |
§4.3 的案例在这里再出现一次,用来说明偏差不是单一方向。油的摄入在三日记账里会被外食低估,在个体回顾里会被烹调方式放大或缩小,两个方向相反,合并之后的方向取决于当地的饮食结构与调查队的折算规范。
7.4 外部验证矩阵
| 验证角色 | 做法 | 讲得通的地方 | 风险 |
|---|---|---|---|
| 与其他全国调查比对 | 同一年龄段的营养摄入与代表性调查比较 | 量级可比,趋势方向一致 | 抽样与测量方法不同,差值无法归因 |
| 与行政统计比对 | 收入与消费与统计年鉴对比 | 分项收入构造有官方文档 | 口径不同,自产食物与非货币补贴难对齐 |
| 与本队列后续轮比对 | 用 2018 年及其后数据检验趋势外推 | 同一编号体系延续 | 官方未发布这些轮次的完整说明 |
| 与实验室测定比对 | 用生化指标校验膳食回顾的钠钾估计 | 独立测量,可做误差校正 | 生化仅部分轮次 |
第二行值得多说一句。官方在派生收入文件的说明里把收入构造方法完整写出,包括名义值与按 2015 年可比价两套口径,分项包含经营、工资等。这让收入变量与外部统计的对齐有了基础,但也正因为两套口径并存,随手取一个用而不说明,会造成同行复现困难。
7.5 它为何能持续:因为每次扩张都不需要重新起灶
它持续三十多年,靠的不是不断加大样本,而是把已有的样本维护成本压到很低。新增省市时,中方补充经费即可把新样本接进原有流程;问卷改版时,纵向主文件把变量名统一到旧口径;分家产生新家庭时,家户名册的编号规则让新户自然挂进样本区。这些机制让边际扩张变得便宜。
反过来,这也解释了它为什么始终不是全国概率样本:做成全国代表性调查需要按人口比例重新设计抽样,成本结构与现有的固定县域模式不同,而它的资助结构恰好支持前一种做法。它的生存方式决定了它的边界,两者是同一件事的两面。
§8 生态位与历史
8.1 历史沿革
八十年代末,中国的营养与卫生研究面临一个方法学缺口:有全国性的营养调查,但那是横断面的,每十年做一次,无法回答"同一批人怎么变"的问题。卡罗来纳人口中心与中方机构合作设计了这个队列,最初的动机写在官方项目描述里:考察国家和地方实施的健康、营养与计划生育政策与项目产生了什么效果,以及社会经济转型如何影响人群的健康与营养状况。
这个动机决定了问卷的形态。它不只问吃了什么,还问收入从哪里来、家务劳动怎么分配、住什么样的房子、能不能看上病。营养只是它的一半,另一半是社会经济学。
8.2 与全国营养调查的分工
| 对比项 | CHNS | 全国营养监测类调查 |
|---|---|---|
| 抽样 | 固定省区、固定县数 | 按全国代表性设计 |
| 时间形态 | 同一批人反复测 | 每轮新样本 |
| 主要用途 | 变化轨迹与机制 | 水平估计与政策基线 |
| 膳食方法 | 三日回顾加家庭记账 | 以回顾为主 |
| 社区层 | 有,须协议 | 视具体调查而定 |
两者的关系不是替代而是互补:全国调查回答"现在是多少",CHNS 回答"这些年怎么变的、为什么变"。把两者的数字直接并列比较,是文献里常见但方法上不严谨的做法。
8.3 生态位:暴露侧的深井
| 角色 | 结局侧的数据 | 暴露侧的数据 |
|---|---|---|
| 典型来源 | 行政理赔、住院登记、死亡登记 | CHNS 这类入户调查 |
| 强项 | 全人群覆盖、事件完整 | 行为与环境的细颗粒度 |
| 弱项 | 缺行为与环境细节 | 覆盖有限、依赖自报 |
| 组合方式 | 以社区或地区为键连接 | 以社区或地区为键连接 |
CHNS 坐在右边这一列,而且是这一列里少有的既含膳食又含社区环境的调查。它的价值往往不在单独使用,而在与结局侧数据拼接之后:有了同一地区的住院率或死亡登记,再加上社区层的食品环境与个体膳食,才能回答"环境如何经由行为影响结局"。
8.4 谁在用它,用来做什么
从公开文献的摘要看,使用者集中在三类。第一类是营养流行病学组,用它的膳食数据做慢性病风险因素分析,常见的是把某一轮或某几轮的数据与生化指标放在一起看关联。第二类是卫生经济学与社会科学组,用它的收入、就业、保险数据做政策评估,膳食反而是协变量。第三类是方法学研究组,用它的双路膳食测量做误差校正与测量模型。
第三类最少,但它最能体现这份数据的不可替代性:同时拥有家庭记账、个体回顾、食物频率问卷三种测量方式,并且测的是同一批人同一段时间的调查,在公开数据里非常罕见。
§9 使用指引
9.1 三种角色的路径
| 角色 | 第一天 | 第一周 | 注意事项 |
|---|---|---|---|
| 营养流行病学研究者 | 读抽样页与变量文档,确认目标轮次的问卷版本 | 建立个体编号与人年表,先复现 §4.3 的案例 | 先决定是否跨轮合并,再动手 |
| 卫生经济与政策研究者 | 读派生收入文件的构造说明 | 用官方派生变量而非原始问卷项 | 名义值与可比价两套口径要说明取哪套 |
| 数据工程与建模人员 | 拉取数据集元数据,画出表与主键关系图 | 写缺失码替换与合并脚本 | 别假定表之间可直接按行号拼接 |
9.2 一条最短的可用流程
#-- 1. 建目录,确认网络可达
mkdir -p chns_raw chns_clean
curl -sI "https://dataverse.unc.edu/api/dataverses/chns/contents" | head -1
#-- 2. 取六个数据集的元数据,存成一份清单
curl -sL "https://dataverse.unc.edu/api/dataverses/chns/contents" -o chns_raw/contents.json
python3 - <<'PY'
import json
d = json.load(open("chns_raw/contents.json"))["data"]
with open("chns_raw/doi_list.txt", "w") as f:
for x in d:
f.write(x["persistentUrl"] + "\n")
print(len(d), "datasets")
PY
#-- 3. 按清单逐个取文件编号
while read -r doi; do
curl -sL "https://dataverse.unc.edu/api/datasets/:persistentId/?persistentId=${doi}" \
-o "chns_raw/$(basename "${doi}").json"
done < chns_raw/doi_list.txt
ls chns_raw/*.json
import json
import glob
import pandas as pd
rows = []
for p in glob.glob("chns_raw/*.json"):
ver = json.load(open(p, encoding="utf-8"))["data"]["latestVersion"]
for f in ver["files"]:
df = f["dataFile"]
rows.append({"file": df["filename"], "id": df["id"],
"bytes": df.get("filesize", 0)})
manifest = pd.DataFrame(rows).sort_values("bytes", ascending=False)
manifest.to_csv("chns_raw/manifest.csv", index=False)
print(len(manifest), manifest["bytes"].sum())
跑完之后,工作区里有一份清单,记录每个文件的编号与体积。下载时按清单逐条取,好处是断点续传与校验都有了依据,坏处是要多写几行——但比手工点选可靠得多。
9.3 引用方式
官方给出了固定的致谢文本,要求在所有使用该数据的出版物中原样使用。文本里逐一列出资助来源:美国国立卫生研究院及其下属机构的多项资助、福格蒂国际中心的长期资助,以及中方与中日友好医院等机构对 2009 年那一轮的支持。
| 引用对象 | 内容 |
|---|---|
| 数据 | China Health and Nutrition Survey(CHNS),卡罗来纳人口中心与营养与健康所 |
| 队列简介 | Popkin BM, Du S, Zhai F, Zhang B. Cohort Profile: The China Health and Nutrition Survey. Int J Epidemiol. 2010;39(6). doi:10.1093/ije/dyp322 |
| 致谢 | 按官方致谢页原文照录,不改写 |
| 轮次说明 | 写清用了哪几次调查、是否含扩充样本 |
| 生化数据 | 另注明 2009 年那批的采集与检测由谁支持 |
写作时另有一条来自协议的要求:标注数据来自 CHNS,并致谢资助方。这句话不写在正文里,写在致谢节或方法节,是很多初次使用者会漏掉的一步。
§10 AI 使用声明
| 项目 | 声明 |
|---|---|
| 文本生成 | 本文由 AI 辅助撰写,结构与事实由编辑核对 |
| 数字来源 | 规模数字取自官方抽样页的逐轮表,结构与许可取自数据说明页 |
| 页面核验 | 抽样页、人群页、问卷页、数据说明页、协议页经直接访问确认 |
| 目录核验 | UNC Dataverse 集合的六个数据集经公开接口列举,文件数与体积取自元数据 |
| 论文信息 | 仅参考 Europe PMC 的题录与摘要,未读全文 |
| 未核验内容 | 2018 年及此后轮次的官方样本表;2015 轮所用食物成分表版本 |
| 图像 | 无配图;封面为生成式提示词,不含真实数据 |
| 免责 | 本文不构成研究设计建议;使用须遵守官方协议与致谢要求 |
常见误读(避坑清单)
| 说法 | 实际 | 证据 |
|---|---|---|
| 它是全国代表性营养调查 | 十五省区,按收入分层固定抽县,非全国概率样本 | 官方抽样页与人群页 |
| 它只有九省 | 起始九省,2011 年与 2015 年扩充后为十五省区 | 官方人群页列出十五个名称 |
| 它至今只有十轮 | 官方协议说至 2015 年十轮,后续轮次在论文中出现但官方未发布样本表 | 协议页原文与近年论文方法节 |
| 膳食数据是食物频率问卷 | 主体是三日回顾加家庭三日记账,食物频率问卷 2015 年才加 | 问卷页与项目描述页 |
| 社区层可以从官网下载 | 须签协议、取得伦理批准、缴处理费 | 协议页与数据说明页 |
| 能拿到每个村的名字 | 只给社区编号,县市名与位置不发布 | 常见问题页 |
| 生物样本随数据一起给 | 清理满一年后发布,须另签协议与提交研究说明 | 协议页 |
| 家庭总量除以人数就是个体摄入 | 两条测量路径口径不同,须按分摊规则处理 | 项目描述页关于营养测量的说明 |
| 跨轮可以直接拼成时间序列 | 问卷多次改版,成分表换过三版 | 常见问题页与变量文档 |
| 收入只有一个口径 | 名义值与按 2015 年可比价两套 | 派生变量说明 |
FAQ
Q1:CHNS 能代表全中国吗?
不能按严格抽样意义代表全国。样本取自十五个省区,县域按收入分层固定抽取,西部若干人口大省的居民不在初始抽样内。把它当作城乡营养转型的观察窗口合适,当作全国患病率的分母需要在论文里说明加权与推断边界。
Q2:为什么有人说十轮,有人说十二轮?
官方数据使用协议的原话是自 1989 年起至 2015 年共采集十轮。近年公开论文的方法节里出现以 2018 年为数据的波次,也有用到 2022 至 2024 年数据的表述,说明调查在继续,但官方页面尚未给出这些轮次的完整样本表。两个口径并存,差额构成官方未说明。
Q3:2004 年个体数为什么掉得那么多?
这一年问卷拆成成人与儿童两套,抽样单元也在补充替换,统计口径随之中断。把这一年读成人口流失是错的。看趋势时应以家户数为参照,或按年龄组分别画。
Q4:社区层为什么不给下载?
社区层与县级汇编可以定位被访者所在地,属于保密数据。使用者须签署协议、取得本地伦理批准、提交材料、缴纳处理费,由项目主任审批后发放。官方说明审批答复约三周,数据发放再约三周。
Q5:膳食数据是回顾还是称重?
两者都有。家庭层收集连续三日的详细食物消耗,个体层对每名成员收集连续三日的膳食摄入,采用二十四小时回顾。两条口径不同,家庭总量不能直接平均到个人。
Q6:生物样本数据什么时候能拿到?
官方说明在完整清理后满一年发布,使用者须签协议、取得伦理批准并提交研究说明。2009 年那批的二十六项空腹血指标已经公开,后续轮次要按同样流程申请。
Q7:能不能拿到村名或县名?
不能。只提供社区编号,县市名称与位置不发布,这是伦理审查委员会的要求。需要与外部数据联接时,提交带行政区划代码的申请,由项目组代为匹配并收费。
Q8:为什么同一份食物记录算出的营养素两次不同?
食物成分表换过版本。1981 年版用于前三轮,1991 年版用于 1997 与 2000,2002 与 2004 年版合并用于 2004 至 2011。跨版本直接比数值,差值里混进了成分表换代。
Q9:做纵向分析要用年度文件还是纵向主文件?
想省事用纵向主文件,变量名已统一到 2000 年口径,个体编号已修正。想复原某一轮原始问卷的题目顺序与原始变量名,用年度文件。两者的变量名可能不同,混用会出错。
Q10:家庭收入用哪一版?
用官方派生收入文件,里面给名义值与按 2015 年可比价两套。原始问卷项只适合做校验,不适合直接做跨年比较,因为分项定义改过。
术语表
| 术语 | 含义 |
|---|---|
| 开放队列 | 既有原成员持续追踪,也允许新成员加入的队列 |
| 多阶段随机整群抽样 | 先抽县、再抽村居、最后抽家户的分层抽样 |
| 主抽样单元 | 抽样链条中最末一级的地理单元,这里是村或居委会 |
| 家户编号 HHID | 九位编号,标识一个家户在某一轮 |
| 个体编号 IDind | 十二位编号,个体在全轮次共享 |
| 社区编号 COMMID | 六位编号,标识一个村居 |
| 轮次 Wave | 一次调查的时间标记,跨表合并的关键变量 |
| 二十四小时回顾 | 逐项询问过去一天所吃食物与份量的方法 |
| 称重记账 | 家户在观察期内称量并记录食物购入与消耗 |
| 食物频率问卷 | 询问过去一段时间各类食物进食频率与份量 |
| 食物成分表 | 把食物重量换算成营养素含量的参考表 |
| 派生变量 | 由原始变量计算得到的新变量,如人均摄入、可比价收入 |
| 纵向主文件 | 把多轮数据合并并统一变量名的文件 |
| 数据使用协议 | 使用保密数据前须签署的约束性文件 |
| 推断性披露 | 通过多张表交叉推断出个体身份的风险 |
| 生物样本 | 血液、指甲等生物材料,可做后续实验室检测 |
| 地理链接 | 把调查社区与外部空间数据连接的服务 |
附录 A:核心数字核对表
| 项 | 值 | 来源 | 来源层级 |
|---|---|---|---|
| 启动年份 | 1989 | 官网首页与协议页 | 官方页面 |
| 累计轮次 | 十轮(至 2015) | 协议页原文 | 官方页面 |
| 覆盖省区 | 十五个 | 人群页 | 官方页面 |
| 主抽样单元 | 三百六十 | 抽样页 | 官方页面 |
| 单轮最大规模 | 两万零九百一十四人 | 抽样页逐轮表 | 官方页面 |
| 累计参与者 | 四万二千八百二十九人 | 抽样页逐轮表 | 官方页面 |
| 生化指标数 | 二十六项(2009 年) | 生化数据页 | 官方页面 |
| 免费数据集 | 六个 | Dataverse 接口 | 平台元数据 |
| 社区层处理费 | 三百三十美元 | 协议页 | 官方页面 |
| 空间表连接费 | 三百三十美元起 | 协议页 | 官方页面 |
| 空间连接服务费 | 四百五十美元起 | 协议页 | 官方页面 |
| 审批周期 | 约三周答复,再约三周发放 | 协议页 | 官方页面 |
| 食物成分表版本数 | 三个 | 常见问题页 | 官方页面 |
| 2018 轮样本 | 官方未公布 | — | 未核实 |
附录 B:数字的来源分层
| 层级 | 含义 | 本篇涉及 |
|---|---|---|
| 官方页面 | 官网文字明示,可直接引用 | 轮次、省区、抽样单元、规模表、费用、审批周期 |
| 平台元数据 | Dataverse 接口返回的结构化信息 | 数据集数量、文件数、体积 |
| 论文摘要 | 期刊摘要中的方法描述 | 2018 年与 2022 至 2024 年数据的用途 |
| 未核实 | 官方未公布或未找到明确出处 | 2018 轮样本量、2015 轮成分表版本、量表计分细则 |
附录 C:完整参考文献
| 序号 | 文献 | 用途 |
|---|---|---|
| 1 | 中国健康与营养调查官网首页 | 项目定位与两家机构 |
| 2 | 官网抽样页(Sample) | 逐轮村居、家户、个体数 |
| 3 | 官网人群页(The Study Population) | 十五省区名单 |
| 4 | 官网调查设计页(Survey Design) | 抽样阶段与主抽样单元构成 |
| 5 | 官网项目描述页(Survey Design 长文) | 各模块内容与样本维护规则 |
| 6 | 官网质量控制页 | 1991 与 1993 年的程序加强 |
| 7 | 官网问卷页 | 各轮问卷清单与新增模块 |
| 8 | 官网数据说明页(Data Sets) | 免费与受限的分界 |
| 9 | 官网社区层数据协议页 | 费用、材料清单、发布规则 |
| 10 | 官网常见问题页 | 坐标、成分表版本、食物编码版权 |
| 11 | 官网变量与缺失码文档 | 编号体系、缺失码、分析单元 |
| 12 | 官网历史新闻页 | 2015 年清理说明与未处理项 |
| 13 | 官网派生变量页 | 收入与营养素派生文件 |
| 14 | UNC Dataverse CHNS 集合 | 六个数据集的标题、文件数与体积 |
| 15 | Popkin BM 等,Int J Epidemiol 2010;39(6) | 队列简介题录 |
| 16 | Europe PMC 检索结果(2026 年多篇) | 2018 与 2022 至 2024 年数据的使用表述 |
附录 D:任务代码
import numpy as np
import pandas as pd
MISSING = [-9, -99, -999, -8, -88, -888, 88, 888, 99, 999]
def clean(df):
return df.replace(MISSING, np.nan)
def build_person_year(ind_path, pe_path, wave):
#-- 个体表与体检表按编号与轮次连接,输出人年表
ind = clean(pd.read_sas(ind_path, format="sas7bdat", encoding="utf-8"))
pe = clean(pd.read_sas(pe_path, format="sas7bdat", encoding="utf-8"))
ind["WAVE"] = wave
pe["WAVE"] = wave
merged = ind.merge(pe, on=["IDind", "WAVE"], how="inner")
merged["BMI"] = merged["WEIGHT"] / (merged["HEIGHT"] / 100) ** 2
merged = merged[merged["BMI"].between(10, 60)]
return merged
def cohort_vs_supplement(df, first_wave):
#-- 区分原队列成员与后期补充成员
first_seen = df.groupby("IDind")["WAVE"].min()
df = df.merge(first_seen.rename("FIRST_WAVE"), on="IDind")
df["GROUP"] = np.where(df["FIRST_WAVE"] <= first_wave, "original", "supplement")
return df
if __name__ == "__main__":
py = build_person_year("idind_12.sas7bdat", "pe_12.sas7bdat", 2015)
py = cohort_vs_supplement(py, 2006)
print(py.groupby(["GROUP", "WAVE"])["BMI"].agg(["count", "mean"]))
这段代码做三件事:替换缺失码、连接个体与体检表算出体质指数、按首次出现轮次区分原队列与补充样本。第三步是很多分析会漏掉的,它决定了你报出的"变化"是同一批人的变化,还是样本构成变化。
附录 E:如果只记五件事
- 它是 1989 年起的开放队列,不是横断面调查,十轮追踪是它最大的资产。
- 十五省区、三百六十个村居、单轮约两万人,不是全国概率样本,全国推断要加权并说明边界。
- 膳食测量是三日二十四小时回顾加家庭称重记账,两条路径口径不同,不能互相替代。
- 家户与个体层在 UNC Dataverse 免费下载,社区层与地理链接要签协议、缴费、走伦理审批。
- 跨轮合并前先确认问卷版本与食物成分表版本,2011 与 2015 的扩充样本要单独标记。
编辑说明
本篇的核验时间为 2026 年 10 月 28 日。核对方式是直接访问官方站点的页面与 UNC Dataverse 的公开接口,逐页抄录数字,未做任何分布统计。官方页面存在两处口径并存:抽样页给出逐轮规模表,项目描述页另用约四千四百户、约一万九千人的概括说法;协议页说至 2015 年十轮,而近年论文中已出现 2018 年及更晚的数据。两处都按原文并列,未替官方选定其中一个。
未覆盖的内容:2018 年及此后轮次的官方样本表、2015 轮所用食物成分表版本、社区卫生机构子表的具体字段。这些在公开页面上没有明确出处,本篇标注为未核实,未以推测填补。
本篇的事实基础限于公开页面与题录摘要,不含任何未公开数据的推断。数值若与官方后续更新不一致,以官方页面为准。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- elsa — 共享标签:公共卫生与流行病学 / 调查数据 / 队列研究
- hunt-study — 共享标签:公共卫生与流行病学 / 调查数据 / 队列研究
- nurses-health-study — 共享标签:公共卫生与流行病学 / 调查数据 / 队列研究
- cfps — 共享标签:公共卫生与流行病学 / 调查数据 / 队列研究
- lifelines — 共享标签:公共卫生与流行病学 / 调查数据 / 队列研究
- sex-differences-hearing-loss — 共享标签:公共卫生与流行病学 / 调查数据 / 队列研究
- our-future-health — 共享标签:公共卫生与流行病学 / 调查数据 / 队列研究
- flatten-covid-survey — 共享标签:公共卫生与流行病学 / 调查数据 / 队列研究
- addhealth — 共享标签:公共卫生与流行病学 / 调查数据 / 队列研究
- share — 共享标签:公共卫生与流行病学 / 调查数据 / 队列研究
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

