信息速览
CMIP6 不是一份数据,而是一份协议:世界气候研究计划把「该跑哪些实验、每组实验的边界条件怎么设、输出哪些变量、文件怎么命名」写成公共约定,然后各自独立的建模中心照着跑,把结果交上来。三十多个中心、一百多个模式,跑的是同一套题目。
所以问「CMIP6 有多少条数据」,答案不是「N 个样本」,而是一串随索引滚动的计数:ESGF 联邦目录当前索引到 1,476 万条数据集记录、6,216 万条文件记录,覆盖 132 个模式、46 个机构、260 个受控实验。它的价值不在精度,而在于同一个实验被重复做了几十遍,这才有了「集合」这个概念。
一屏速览见下表。
| 项目 | 数值 | 来源 |
|---|---|---|
| 官方全名 | Coupled Model Intercomparison Project Phase 6 | PCMDI CMIP6 页 |
| 组织方 | WCRP 耦合模式工作组(WGCM)辖下的 CMIP Panel | PCMDI CMIP6 页 |
| 数据集记录数 | 14,769,319 | ESGF Solr 桥,type:Dataset |
| 文件记录数 | 62,156,341 | 同上,type:File |
| source_id(模式)数 | 132 | facet_fields.source_id |
| institution_id 数 | 46 | facet_fields.institution_id |
| experiment_id 数 | 260 | facet_fields.experiment_id |
| variable_id 数 | 1,216 | facet_fields.variable_id |
| table_id 数 | 41 | facet_fields.table_id |
| grid_label 取值数 | 12 | facet_fields.grid_label |
| 数据节点数(索引内) | 16 | facet_fields.data_node |
| historical 时间范围 | 1850–2014 | CMIP6 CV experiment_id 表 |
| 情景实验起始年 | 2015 | 同上 |
| 情景实验协议终点 | 2100,部分至 2300 | 同上 |
| 文件格式 | netCDF(CF 约定,单文件单变量) | PCMDI 数据用户指南 |
| 许可 | 逐模式自定,125/132 为 CC BY 4.0 | CMIP6 CV source_id license 表 |
| 访问 | ESGF 节点检索,部分需登记 | 各节点 |
§1 速览:它是什么,也不是什么
1.1 一句话定义
CMIP6 是第六阶段的耦合模式比较计划。各参与中心用各自的耦合环流模式,按统一定义的实验协议与统一定义的数据请求做数值模拟,把结果以统一格式上交,再由地球系统网格联盟(ESGF)分发出去。它比较的不是一次模拟的好坏,而是同一组问题在不同模式上的答案分布。
读它的时候要区分三层东西:协议层(该跑什么)、生产层(谁跑了、跑出来什么)、分发层(放在哪、怎么取)。三者由不同的人管,出错的方式也各不相同。
1.2 为什么它不是「又一个气候 CSV」
原因在实验设计。CMIP6 不是「让所有模式都预测未来」,而是一组分工明确的对照实验:DECK 四实验刻画模式的物理响应,historical 用观测外强迫重演过去,情景实验换一套外强迫假设推到未来。它们之间是刻意构造的对照关系,不是同一个东西的多个副本。
1.3 三十秒决策卡:你的处境,它能帮你什么
| 你的处境 | 它能帮你什么 |
|---|---|
| 要训练或评测气候降尺度、极端事件识别的模型 | 同一区域的几十条模拟轨迹,输入与标签都取自模式输出,样本丰富但同质性需自证 |
| 要做气候风险的情景分析(升温多少度、降水怎么变) | ssp126/ssp245/ssp370/ssp585 四条路径的分位数分布,直接给出区间而不只是点估计 |
| 要研究某个模式的物理行为(比如云的反馈) | piControl 与 abrupt-4xCO2 的配对实验,可直接算平衡态响应 |
| 要检验一个统计方法在「已知答案」的虚拟观测上是否可靠 | perfect-model 框架:把某个模式的输出当作真值,测另一个模式或统计方法能否复原 |
| 要用「未来天气」做 ML 训练 | 只能拿到月、日、3 小时间隔的量;逐小时的高频细节只有 1hr 表覆盖,且只有十几个模式提供 |
| 要一份口径统一、可以直接平均的数据 | 得自己完成加权、重网格、统一成员数三件事,没有现成版本,见 §4 与 §7 |
| 要知道某个变量在某模式下 2020 年 3 月 5 日几点几分的气温 | 日表能到日,月表只能到月;若只要日尺度可用 day 表,但格点随网格标签而变 |
1.4 不适合谁
如果需求是某地某天的天气,这里给不了。CMIP6 是气候尺度的模拟,日输出已经是最高的常规频率,且模式的定位是统计意义上的合理,强对流、单次台风路径这类问题不在它的设计目标里。
如果需求是统一的许可,给不了。132 个 source_id 对应 132 条许可登记,其中绝大多数是 CC BY 4.0,但其余的必须逐条看。把整个 CMIP6 写成一个 CC BY 4.0 数据集,在引用上就是错的。
如果需求是一份可以一键下载的完整档案,给不了。文件级条目分散在 16 个数据节点上,其中八成以上是副本;索引可查,下载要逐个数据集申请。
如果需求是单一模式的权威结论,则理解反了。CMIP6 的单位是集合。任何只用一个模式推出来的结论,在这个框架里都要回答「别的模式怎么说」。
1.5 贯穿本文的案例:某市疾控的 2050 年热浪暴露评估
后面每一章都会回到同一个场景,这里先把它交代清楚。
某省会城市的疾控中心要估算 2050 年前后夏季高温相关死亡的暴露基数,为空调补贴与避暑点布局提供依据。他们现成的东西只有两样:一份 2013–2023 年的本地死亡登记,按日聚合;一份 2010 年以来的国家级气象站逐日气温。前者告诉他们「热到什么程度、死多少人」的本地关系,后者提供历史温度序列,但不足以支撑 2050 年。
他们想要的输入是:2050 年该市夏季的日最高气温分布,以及不同排放路径下这个分布的差异。这是一个典型的 CMIP6 需求——不是要一个数,而是要一个分布,而且要能说清楚「这个分布是在什么排放假设下、由多少条模式轨迹、怎么加权得到的」。
这个项目会在四个地方依次卡住:实验怎么选(§2)、成员与网格怎么统一(§4)、许可怎么处理(§7)、结论能不能只用一个模式的口径说话(§9)。每一节写完都会回到它,说明卡在哪、怎么绕。
§2 结构:三层叠出来的目录
2.1 三层各管什么
理解 CMIP6 最省力的办法,是把它看成三张互相对不齐的表。
第一张是受控词表(CV),由 PCMDI 维护,逐个登记所有合法取值:experiment_id 260 个、source_id 132 个、institution_id 46 个,外加 activity_id、table_id、variable_id、grid_label 等。它是协议层的字典,规定了「什么名字算合法」。
第二张是索引,由 ESGF 的 Solr 桥提供。它不生产数据,只登记「哪里有一份数据集、多大、谁上交、什么时候、版本号多少、有没有被撤回」。
第三张是文件,落在各数据节点的磁盘上,按数据参考语法(DRS)的目录结构排列。
三张表的颗粒度不同:CV 是枚举,索引是条目,文件是字节。用的时候必须同时对齐三层,错一层就会拿到「查得到但下不到」或「下到了但不是最新版本」。
2.2 规模:哪些数字是索引的,哪些是数出来的
先把口径摆清楚。PCMDI 的数据持有量页给的是「截至某一时点」的按模式、按活动的数据集计数,那张表最后一次更新停在 2025 年 7 月;ESGF 索引是实时的,每天在变。两者不会一致。
| 维度 | 数值 | 出处在哪 | 性质 |
|---|---|---|---|
| 数据集记录 | 14,769,319 | ESGF Solr 桥 response.numFound | 索引,实时 |
| 文件记录 | 62,156,341 | 同上,type:File | 索引,实时 |
| 主副本数据集 | 2,803,586 | facet replica=false | 索引 |
| 镜像副本数据集 | 11,965,733 | facet replica=true | 索引 |
| 标记撤回的数据集 | 405,751 | facet retracted=true | 索引 |
| 标记撤回的文件 | 28 | facet retracted=true(文件级) | 索引 |
| 有文件的数据集 | 14,769,297 | query number_of_files:[1 TO *] | 索引 |
| source_id | 132 | facet_fields | 索引 |
| institution_id | 46 | facet_fields | 索引 |
| experiment_id | 260 | facet_fields | 索引 |
| table_id | 41 | facet_fields | 索引 |
| variable_id | 1,216 | facet_fields | 索引 |
| grid_label | 12 | facet_fields | 索引 |
| data_node | 16 | facet_fields | 索引 |
| 按活动:DCPP | 5,069,415 | facet activity_id | 索引 |
| 按活动:PAMIP | 4,739,173 | facet activity_id | 索引 |
| 按活动:ScenarioMIP | 1,593,182 | facet activity_id | 索引 |
| 按活动:CMIP | 1,125,799 | facet activity_id | 索引 |
| 按活动:DAMIP | 1,003,501 | facet activity_id | 索引 |
这张表里最该注意的是第三、四行:副本占了八成以上。也就是说,这个总数如果被当作「有多少份数据」,会高估四倍多。真正互不相同的模拟单元要看 replica=false 的那 280 万条,再按版本去重才会更接近真实的生产量。
第五行的 405,751 条撤回记录同理:它们仍在索引里,只是被打上了标记。一个按「查到就下」写成的脚本,会把这部分一起拉下来。
2.3 二十个活动:谁在提要求
activity_id 是 CMIP6 里最容易被忽略的一层。它不是科学分类,而是提案权归属:谁提出了这组实验、谁负责监管。
| 活动 | 数据集数 | 大致管什么 |
|---|---|---|
| DCPP | 5,069,415 | 年代际气候预测,以 dcppA-hindcast 实验为绝对主力 |
| PAMIP | 4,739,173 | 极地放大机制,以不同海冰与海温设定做对照 |
| ScenarioMIP | 1,593,182 | 2015 年起的排放情景 |
| CMIP | 1,125,799 | DECK 四实验与 historical,CMIP Panel 直辖 |
| DAMIP | 1,003,501 | 单一外强迫归因 |
| AerChemMIP | 583,115 | 气溶胶与化学 |
| VolMIP | 241,033 | 火山强迫 |
| LUMIP | 121,965 | 土地利用 |
| RFMIP | 118,968 | 辐射强迫 |
| C4MIP | 115,141 | 碳循环 |
| CFMIP | 85,339 | 云与环流 |
| HighResMIP | 70,221 | 高分辨率模式 |
| CDRMIP | 52,853 | 二氧化碳移除 |
| FAFMIP | 44,977 | 通量异常强迫 |
| GeoMIP | 38,610 | 太阳辐射管理 |
| LS3MIP | 34,120 | 陆面 |
| PMIP | 32,002 | 古气候 |
| GMMIP | 27,454 | 全球季风 |
| OMIP | 26,834 | 海洋单独积分 |
| ISMIP6 | 3,345 | 冰盖 |
一眼能看出分布极度不均:DCPP 一个活动就占了整库的三分之一强。这不是因为年代际预测最重要,而是因为 DCPP 的实验设计里,每一个起始年都要单独跑一个成员,一年一个实验,起始年从 1960 到 2019 排下来,条目自然就爆炸了。按活动看体量,看到的是实验设计的分辨率,不是科学重要性。
还有一个细节:facet 表里除这 20 个之外,还有一条 CCCma 的 3 条记录。它是脏数据——某个中心把机构名填进了活动名。这类脏值在全库层面不会致命,但会让严格的计数对不上。
2.4 一条数据集记录的逐项解剖
一条数据集记录不是「一个数」,而是「某个模式在某个实验、某个成员、某张表、某个变量、某种网格下的全部文件」。把它的字段展开:
| 字段 | 取值形态 | 需要注意什么 |
|---|---|---|
| activity_id | 见上表 | 决定监管方与协议来源,不是分类标签 |
| institution_id | 如 IPSL、NCAR、CMA | 一个机构可有多个模式;46 个机构中有不少是联合体 |
| source_id | 如 IPSL-CM6A-LR | 模式不是软件版本,同一机构的 -LR 与 -MR 是两套不同分辨率 |
| experiment_id | 如 historical、ssp245 | 决定边界条件;260 个取值 |
| member_id | 如 r1i1p1f1 | 与 variant_label 同值,见 §4.2 |
| table_id | 如 Amon、Omon、day、fx | 决定变量清单与时间频率 |
| variable_id | 如 tas、pr、zg | 短名遵循 CF 标准名,但有少数自定 |
| grid_label | gn、gr、gr1… | 决定经纬度是否规则,见 §4.3 |
| version | vYYYYMMDD | 上交日期;同组合可有多版本 |
| number_of_files | 整数 | 一个数据集可以只有一个文件,也可以上百个 |
| size | 字节 | 单个数据集级别,不含副本 |
| replica | true/false | 这是副本标记,不是质量标记 |
| retracted | true/false | 已被撤回但仍留在索引里 |
| latest | true/false | 该组合的最新版本;旧版本会保留 |
这份解剖里最该记住的是最后三行:副本、撤回、最新。三者都是「同一份东西的多个状态」,而索引默认把它们全部返回。下游任何统计,在开始算之前都该先想清楚这三条要不要过滤。
2.5 与同类资源的定位差异
| 资源 | 时间性质 | 空间性质 | 与 CMIP6 的差别 |
|---|---|---|---|
| CMIP6(本篇对象) | 1850–2100,含未来 | 各模式原生网格,分辨率不一 | 多模式、多实验、情景外推 |
| CMIP5 | 1850–2100 | 模式更少、分辨率更粗 | 上一代协议,实验数远少于 CMIP6 |
| CMIP6Plus | 2023 年前后启动 | 承接 CMIP6 的补充实验 | 过渡性计划,见 §10 |
| 再分析(如 ERA5) | 1940–今 | 统一规则网格 | 单一系统、含观测同化,无未来 |
| 站点观测(如 GHCNd) | 视站而定 | 点 | 真值,无未来、覆盖不连续 |
| 卫星海温(如 OISST) | 1981–今 | 0.25° 规则网格 | 已发生的海面状态,可作强迫 |
最后一列说的是这件容易被忽略的事:CMIP6 与再分析、观测不是「精度高低」的关系,而是**「已发生」与「可能发生」**的关系。两者不可互相替代,但可以互为验证与输入。
§3 实验:260 个 experiment_id 里该认哪几个
3.1 DECK:四个基础实验
DECK 是 CMIP6 的地基,所有参与中心都被要求至少跑这四个。它们的作用不是预测,而是测量模式的响应特性。
| 实验 | 内容 | 回答什么问题 |
|---|---|---|
| piControl | 工业化前外强迫恒定,长时间积分 | 模式的内部变率有多大、有没有系统性漂移 |
| AMIP | 1979–2014,海温与海冰按观测给定 | 只看大气对给定下边界的响应,排除海洋的自主演化 |
| abrupt-4xCO2 | 从 piControl 的某个时刻起,CO2 骤增为四倍,其余不变 | 模式的平衡态气候敏感度与瞬态响应 |
| 1pctCO2 | 从 piControl 起,CO2 每年增 1%,连续 140 年 | 渐进强迫下的瞬态响应 |
这四个实验在索引里的条目数分别是 76,191(piControl)、186,750(AMIP)、157,238(abrupt-4xCO2)、122,133(1pctCO2),覆盖的模式数分别为 75、61、68、69 个。数目不完全一致,原因在数据请求:每个实验要求上交的变量清单不同,跑了的中心也不完全一样。
需要留心的是 piControl 的条目数远小于其他三个。这不是没人跑,而是 piControl 的时长按各模式自己的控制积分长度而定,官方 CV 表的起始年与终止年是空的——它没有固定区间,随模式的平衡态长度浮动。
3.2 historical:1850 至 2014
historical 是唯一一个「外强迫来自观测重建」的长期实验。1850 年起始是任意选定的工业化前基线,2014 年终点的设定理由与情景实验从 2015 年接续有关。
索引里 historical 有 670,363 条数据集记录,覆盖 76 个 source_id,39 张表,其中 Omon 最多(145,333 条),Amon 次之(117,799 条)。这个「海洋月均比大气月均还多」的分布,正是历史实验的特点:海洋变量逐层上报,条目自然更密。
注意 2014 这个终点不是数据的物理终点。 有些模式的控制积分更长,有些中心还会补交扩展段,但 historical 作为协议实验,终点是被定义的。
3.3 情景实验:从 2015 起分叉
情景实验由 ScenarioMIP 监管,全部从 2015 年起算,与 historical 的终点对齐。四条主干路径:
| 实验 | 数据集数 | 协议终点 | 大致含义 |
|---|---|---|---|
| ssp126 | 299,921 | 2100 | 低排放,21 世纪末转为净负 |
| ssp245 | 911,840 | 2100 | 中等排放,当前政策趋势附近 |
| ssp370 | 387,427 | 2100 | 较高排放 |
| ssp585 | 355,091 | 2100 或 2300 | 高排放,化石燃料主导 |
注意数量排序与「高排放」的直觉不一致:ssp245 的条目是 ssp585 的两倍半。原因同样在成员数——各中心为中等路径跑了更多成员,因为它是政策讨论中最常被引用的那条。
CV 表还记录了 ssp585、ssp126 与 ssp534-over 的协议终点可以为 2300。这不是所有中心都会跑到,但凡是跑了的,都比 2100 多出一大段。评估未来风险时若只取到 2100,等于把最远的那段扔掉了。
3.4 其他值得认识的实验
| 实验 | 所属 | 用途 |
|---|---|---|
| esm-hist | CMIP | 与 historical 同时段,但开碳循环,输出含碳通量 |
| hist-nat / hist-GHG / hist-aer | DAMIP | 只用自然强迫、只用温室气体、只用气溶胶,做归因 |
| amip | CMIP | 给定观测海温,隔离大气响应 |
| dcppA-hindcast | DCPP | 年代际预测的回溯检验,起始年 1960–2019 |
| 1pctCO2 | CMIP | 渐进强迫 |
| ssp245-covid | ScenarioMIP | 2020 年疫情排放骤降的敏感性实验 |
| volc-pinatubo-full | VolMIP | 皮纳图博火山型强迫 |
DAMIP 的这三个实验是「归因研究」的标准工具:把外强迫拆开,看单一因子的贡献。这类实验条目不算多,但用对了能绕开很多集合平均带来的混淆。
3.5 实验不能混:一个具体的错误
最容易犯的错,是把 historical 与情景实验直接接成一条 1850–2100 的曲线,然后算趋势、算极值、算「相较工业化前升温多少」。
这条曲线在 2014/2015 处有一个接缝。接缝两边的外强迫来源不同:一边是观测重建(火山、太阳、人为排放都按历史给),一边是情景假设(火山被设为零,太阳按周期给)。接缝处出现量值跳变是正常的,把它解释成气候突变就错了。
更隐蔽的问题是成员对齐。一个模式的 historical 可能有 25 个成员,它的 ssp245 只有 5 个。把两个实验的成员并成一个集合平均,权重是混乱的,而且两段的成员并不是同一条轨迹的延续。
§1.5 的案例在这里撞上第一堵墙:该项目组最初的做法是把某模式的 historical 与 ssp585 直接接起来,用 2015–2050 段算 2050 年的气温分位数。审核时被指出两点——其一,ssp585 是高排放路径,用它算出来的「2050 年暴露」其实是一个上界;其二,该模式的 ssp585 只有 4 个成员,而 historical 有 25 个,两段接起来的集合内部权重不一致。
3.6 选实验的三条判据
| 判据 | 问什么 | 后果 |
|---|---|---|
| 外强迫来源 | 观测重建、情景假设、还是人为设定 | 决定结论能否外推到真实世界 |
| 时间范围 | 起止年是否覆盖研究窗口 | 覆盖不到的部分没有数据,不是缺测 |
| 对照结构 | 有没有配对实验(如 piControl 配 abrupt-4xCO2) | 决定能不能算响应,而不只是算状态 |
第三条最容易被忘。想算「气候敏感度」,必须同时有 piControl 与 abrupt-4xCO2;只取后者,算出来的是绝对温度变化,不是平衡态响应。
3.7 一个体检:你的实验清单是不是「同一道题」
选实验这件事,最容易犯的不是选错,而是选了几道不同的题拼在一张表上。一个可操作的体检办法:把每个实验的名字、activity_id、起始年、终止年、外强迫来源列成五列表,然后标出任意两行在「外强迫来源」上是否等价。
若等价,可以合并;若不等价,就只能并列,不能求平均。historical 与 ssp245 不等价(前者是观测重建,后者是情景假设);historical 与 hist-nat 不等价(后者抽掉了人为强迫);ssp245 与 ssp245-covid 不等价(后者在排放大幅变化上做了敏感性处理)。
这张表还有一个附加用途:它可以提前暴露「时间窗对不齐」的问题。同一个研究窗口(比如 2041–2060)在四条情景里都有,但在 piControl 里没有明确对应的年代,在 abrupt-4xCO2 里更没有。想拿这六个实验做同一件事,本身就是把不同的问题硬凑在一起。
§4 集合与网格:五件必须先统一的事
4.1 集合(ensemble)在 CMIP6 里有两层
第一层是成员集合:同一模式、同一实验下,用不同初值(或不同物理参数、不同外强迫扰动)跑的多次积分。它们共享同一套模式代码,差异来自内部变率。
第二层是模式集合(multi-model ensemble):不同模式的输出放在一起。它抽样的是模式结构的不确定性。
这两层常被混着叫「集合」,后果是:把某模式的 25 个成员与另一个模式的 1 个成员放进同一个平均里,等于让第一个模式在「模式集合」这一层多投了 25 票。这是 CMIP6 使用中最普遍的静默错误。
4.2 variant_label:四个字母的位置
member_id 的格式是 r<i>i<p>f<j>,例如 r1i1p1f1。四位各管一件事:
| 位 | 字母 | 含义 | 变化意味着什么 |
|---|---|---|---|
| 1 | r | realization(实现) | 初值不同,最常见的一种扰动 |
| 2 | i | initialization(初始化) | 初始化方法或初始时刻不同 |
| 3 | p | physics(物理) | 用了不同的物理方案版本 |
| 4 | f | forcing(强迫) | 用了不同的外强迫数据集 |
r1i1p1f1 是「默认成员」,几乎所有模式都有。r1i1p2f1 说明物理方案改过,它不是同一模式的另一个初值样本,把它当作成员会污染内部变率的估计。
成员数的差异极大。以 tas(近地面气温)的 Amon 表为例,historical 下全库有 135 个不同的 member_id;单个模式内部从 1 到近百不等。CanESM5 仅 tas 一项就有 89 个成员——这不是常态,而是该中心刻意跑了一个大样本,用来做内部变率的估计。
§1.5 的案例在这里撞上第二堵墙:他们按「取所有能取到的」思路拼了一个 30 条轨迹的集合,事后发现其中 22 条来自同一个模式(该模式跑了 25 个成员),其余 8 个模式各贡献 1 条。这个集合的「平均」实质上是一个模式的平均,其余模式的信号被稀释掉了。修正做法是先做模式加权——先算每个模式的成员平均,再对各模式等权平均。
4.3 grid_label:十二种网格标记
grid_label 是 CMIP6 里最不直观的一列。十二个取值:
| 取值 | 数据集数 | 含义 |
|---|---|---|
| gn | 10,942,493 | 原生网格 |
| gr | 3,501,862 | 重采样到规则经纬网 |
| gr1 | 144,815 | 规则网格,分辨率组 1 |
| gnz | 87,558 | 原生网格,含垂直维 |
| gm | 51,034 | 模式原生格点,不重采样 |
| grz | 28,857 | 规则网格,含垂直维 |
| gr2z | 8,027 | 规则网格,组 2,含垂直维 |
| gr2 | 2,844 | 规则网格,组 2 |
| gr3 | 1,093 | 规则网格,组 3 |
| gr1z | 675 | 规则网格,组 1,含垂直维 |
| grg | 31 | 高斯网格 |
| gra | 30 | 任意网格 |
关键区分是 gn 与 gr:gn 是模式自己的网格,可能是高斯网格、可能是三角截断谱网格转换来的、可能是不规则的海洋网格;gr 是被插值到规则经纬度上的版本。只有 gr 类可以直接按经纬度与其他模式逐格比较,但 gr 是插值产物,插值本身引入误差。
gr1、gr2、gr3 更麻烦:它们是「规则网格的第 1/2/3 种分辨率组」,具体分辨率由各模式自报,不同模式的 gr1 并不对应同一个格距。
§1.5 的案例在这里撞上第三堵墙:他们按某个模式 ID 去取 tasmax,只拿到 gr1 的一组结果,以为这就是该模式的全貌。实际上该模式的 gr1 只有 5 个模式提供,其余模式用的是 gn 或 gr。把 gr1 上的 5 个模式当作「全部」,结论就会偏向那几个恰好选了这一分辨率的中心。
4.4 nominal_resolution:分桶用的标称值
nominal_resolution 是另一个陷阱。它把连续的分辨率离散成几个桶:250 km、100 km、50 km、25 km、10 km、5 km、1 km、10000 km。分桶的目的只是排序与筛选,不是描述格距。
同一个桶里可以有完全不同的分辨率。以 historical 的 tas(Amon)为例,nominal_resolution=250 km 的有 1,267 条,但这些模式的真实格距可能从 2° 到 2.8° 不等。更要紧的是脏值:同一批数据里既有 100 km 也有 100km(少一个空格),被当成两个不同的桶。
还有一个反常值:10000 km。出现它的数据集是少数几个把整颗行星都当作一格的模型,或是元数据填写错误。按 nominal_resolution 做严格分组时,这类值会把统计拉偏。
4.5 成员、网格、分辨率三者组合出的真实碎片
把上面三件放在一起,会看到一个很现实的问题:同一模式、同一实验、同一变量,可能并不只有一条路径。
以 IPSL-CM6A-LR 的 historical tas(Amon)为例,索引里 79 条记录分布在两种 grid_label 上:gr 全部 79 条,gn 一条也没有。也就是说,这个模式对 tas 只提供了重采样版,没有原生网格版。
而在整个 CMIP6 里,tas 的这个组合有 2,575 条,其中 gn 1,937 条、gr 581 条、gr1 57 条,覆盖 71 个模式。没有一个统一的取数规则能同时适用所有模式,必须逐个模式判断它给了什么。
这也是 §1.5 的案例最终采用的策略:先按 source_id 枚举,对每个模式单独确定它的 grid_label,再决定是直接取 gr,还是取 gn 后自己重网格到共同网格。两条路径的误差性质完全不同,报告里必须写明用了哪条。
4.6 第五件:版本
除了实验、成员、网格、分辨率,还有一件几乎总被忘掉的事:版本。
同一个 (source_id, experiment_id, member_id, table_id, variable_id, grid_label) 组合,在索引里可以同时存在多个 version,形如 v20180803、v20200412、v20230203。索引用 latest 字段标出其中一个为当前有效版本,其余作为历史版本保留。
为什么会有多版本?两个来源:其一是中心重新处理了输出(例如修了单位错误、补了缺月、换了后处理软件),其二是中心换了数据规格版本号(data_specs_version 在 01.00.10 到 01.00.3x 之间演进),旧版本的元数据与新版本不完全可比。
多版本并存的实际影响是同一个组合会被数两遍。一个按 (source_id, variable_id) 直接计数的脚本,如果不过滤 latest:true,得到的数会偏高。这个偏差在重处理频繁的模式上尤其明显。
更麻烦的是混合。一个模式的 tas 更新到了 v20230203,它的 pr 还停在 v2019xxxx,这是常态。跨变量做联合分析时,两个变量来自不同版本,自洽性没有保证。稳妥做法是把用到的每个数据集的 version 号记进报告,而不是记「某模式的某实验」。
4.7 五件事的依赖顺序
这五件不是并列的,有严格的依赖顺序:
| 顺序 | 定什么 | 为什么必须在前 |
|---|---|---|
| 1 | experiment_id | 它决定其余四件有没有意义;不同实验的成员集合不可互借 |
| 2 | source_id 清单 | 成员与网格的可选项完全由模式决定 |
| 3 | grid_label | 它决定后面能不能跨模式拼,以及拼的代价 |
| 4 | member_id | 在定了模式的网格之后才能确认哪些成员真提供了这个网格 |
| 5 | version | 最后定,因为它可能随查询时刻变化 |
顺序颠倒的代价是返工。先定成员再定网格,会发现某个成员只有 gn 没有 gr;先定网格再定模式,会排除掉一批只提供另一种网格的中心,而且排除得毫无理由。
§1.5 的案例在这一点上做对了两处、做错了一处。他们在第 1 步与第 2 步上很谨慎,先严格锁定了三条情景、再按 tasmax 的 day 表可用性筛模式;但在第 3 步上是事后补的——最初的脚本只按 (source_id, variable_id) 取,拿到什么网格就用什么网格,结果有一部分模式的结果是 gn,另一部分是 gr,混在一个平均里。第 5 步他们干脆没做,直到复核阶段才发现有两个模式的 tasmax 在 2022 年被重新处理过。
§5 获取:联邦目录怎么查、怎么下
5.1 三个入口的关系
| 入口 | 地址 | 性质 |
|---|---|---|
| ESGF 搜索界面 | esgf-node.ornl.gov/search(另有 LLNL、IPSL、DKRZ 镜像) | 前端,背后是同一套索引 |
| Solr 桥 | esgf-node.ornl.gov/esgf-1-5-bridge | 老接口的兼容层,机器可读 |
| PCMDI 说明页 | pcmdi.llnl.gov/CMIP6/ | 协议与指南,不含数据 |
前端与桥查到的是同一份索引,只是表达方式不同。桥的价值在于可脚本化,也在于它能直接给出计数。
5.2 为什么「没有单一目录能列全」
这是 ESGF 的设计使然,不是缺陷。数据节点各自持有自己中心的产出,索引节点把它们汇总成一份目录。但汇总不等于全量:
- 索引节点之间有同步延迟,某个节点的补交可能只在部分索引上可见;
- 有些节点只提供本机构模式的下载,不提供他人模式的镜像;
- 副本的存在意味着「查到一条,实际可能在三四个节点上各有一份」。
所以「列全」这件事,在 CMIP6 上只能近似。能做的是:查索引拿到候选清单,再逐个数据集确认至少有一个节点可用。
5.3 一次最小可复现的查数
下面的查询只读索引,不下载任何文件。它统计 historical 实验下 tas 这个变量的分布情况。
import urllib.parse
import urllib.request
import json
BRIDGE = "https://esgf-node.ornl.gov/esgf-1-5-bridge"
def solr(query, facets="source_id,grid_label", kind="Dataset"):
params = {
"distrib": "false",
"type": kind,
"project": "CMIP6",
"format": "application/solr+json",
"limit": "0",
"facets": facets,
"query": query,
}
url = BRIDGE + "?" + urllib.parse.urlencode(params)
with urllib.request.urlopen(url, timeout=180) as r:
data = json.load(r)
ff = data["facet_counts"]["facet_fields"]
out = {}
for name, flat in ff.items():
out[name] = dict(zip(flat[::2], flat[1::2]))
return data["response"]["numFound"], out
n, facets = solr(
'experiment_id:historical AND variable_id:tas AND table_id:Amon AND activity_id:CMIP'
)
print("数据集条数:", n)
print("模式数:", len(facets["source_id"]))
print("网格分布:", facets["grid_label"])
print("分辨率分布:", facets.get("nominal_resolution"))
三个细节必须交代,否则这段代码换个人运行就会给出不同的数。
第一,distrib=false 关掉分布式检索。 开着的时候,桥会把请求转发到各个索引节点再合并,速度慢、且各节点状态不一致时结果不稳定。
第二,facets 参数用的是逗号分隔的一串字段名。 写成 facet.field= 会返回 422,写成 facet=on 也会被拒。这条接口的参数名与老版 Solr 不同,照抄旧文档会一路报错。
第三,同一份查询在 distrib=false 与 distrib=true 下的计数可能不同。 两种模式下 historical 实验恰好都返回 670,363,但这是巧合,不是保证。
5.4 计数、分面与过滤:三类常用查询
| 目的 | 查询写法 | 注意 |
|---|---|---|
| 全库规模 | 不加 query,只给 type 与 project | 这是总数,含副本 |
| 去重后的主副本 | 加 replica:false |
约占四分之一 |
| 排除撤回 | 加 retracted:false |
撤回的仍留在索引里 |
| 只看最新版本 | 加 latest:true |
旧版本同组合会重复计数 |
| 按实验筛 | experiment_id:historical |
与 fq 同时用行为不稳,见 §8.4 |
最后一行是个实实在在的坑:这个桥对 fq 与 query 的组合处理并不总是直观,某些情况下两者取交集、某些情况下只认其一。稳妥的写法是把所有条件都放进 query,用 AND 连接。
5.5 从索引到文件:还得再走一步
索引里的数据集记录有 url 字段吗?没有。这可能是使用过程中最反直觉的一点:数据集级记录的字段清单里,没有直接给出下载地址,只有 citation_url 与 further_info_url 这类元数据链接。
要拿到文件地址,必须把查询的 type 换成 File,拿到文件级记录里的 url、checksum、size。
n_files, _ = solr(
'source_id:IPSL-CM6A-LR AND experiment_id:historical '
'AND variable_id:tas AND table_id:Amon',
facets="",
kind="File",
)
print("文件级记录:", n_files)
这一步返回的是 3,091——远大于该组合在数据集级的 79 条。一个数据集下面挂几十个文件是常态,因为按月或按年切分。
5.6 认证与节点差异
部分节点允许匿名下载,部分需要注册并接受使用条款。这是访问环节的要求,与许可条款是两件事:许可开放不等于访问开放。
节点之间还有能力差异:有的提供 HTTPS 直下,有的主推 Globus 网格传输,有的两者都支持。索引记录里的 access 字段会标出该数据集在某个节点上支持哪些方式。
5.7 先算体量,再决定怎么下
CMIP6 的体量不允许「先拉下来再说」。一个模式的一个变量、一个月表、一个实验,动辄几十到上百 MB;把 30 个模式的日表全部拉下来,量级会直接压垮普通工作站。
先说清两件与体量相关的事实。
其一,小变量的代价极低。 以 fixed 表(fx)的 areacella(格点面积)为例,一个数据集的 size 字段多在几万字节量级,例如 AWI-CM-1-1-MR 的 abrupt-4xCO2 版本是 52,193 字节,CanESM5-1 的 historical 版本是 48,043 字节。这类数据是每个模式必须上交的,总量有 231,432 条数据集记录(fx 表)。
其二,大变量的代价集中在成员维度。 同一个模式的 25 个成员,每个成员都是一份完整的时空场。如果只需要模式间差异,取每个成员的 r1 就够了;只有需要内部变率时才用全成员。
实用的策略是先按 (source_id, grid_label) 覆盖矩阵规划:定好要哪些模式、每个模式取哪个网格、每个模式取一个成员还是多个。这份矩阵定下来之后,下载量基本可预估。
§6 质量层:它不该按什么标准评价
6.0 阅读本节前需要知道的一件事
用「观测数据集」的尺子量它,结论是「全是模拟、没有一个真值」;用「机器学习基准」的尺子量它,结论是「没有划分、没有指标」。两条结论都不假,却都没回答它为什么被大范围引用。
它被引用的原因在于对照结构。所以评价它的正确尺子是:作为一组受控数值实验,它的协议执行度、内部一致性、可追溯性做得怎么样。
6.1 两种常见的评价框架错位
| 错位 | 表现 | 该怎么想 |
|---|---|---|
| 拿站点观测的精度标准套它 | 抱怨某模式在本地偏暖 3 度 | 模式是气候尺度的统计工具,偏差的分布与空间结构才是要看的 |
| 拿基准数据集的标准套它 | 抱怨没有 train/test 划分 | 划分是使用者的事,而且按时间或按模式划分对应完全不同的问题 |
第一种错位的后果特别隐蔽:如果只按单点偏差筛模式,筛出来的往往是那些在该点被调得最准的,而不是整体物理最可信的。模式的评估必须用多变量、多区域、多时段。
6.2 已知的系统性偏差
CMIP6 模式群有一批被广泛记录的系统性偏差,这里只列与使用最相关的几条,它们不是某个模式的瑕疵,而是整批模式共有的结构性问题。
冷偏差与双赤道辐合带问题。 热带太平洋的海表温度在多数模式中偏冷,赤道辐合带的位置与强度也不完全准确。凡是依赖热带海温做下游推断的研究,都要交代这条。
云的短波反馈离散度大。 各模式对云—辐射相互作用的处理差别很大,这是平衡态气候敏感度(ECS)在模式间分散的主要原因,也是 abrupt-4xCO2 实验条目多、结论分歧大的根源。
降水频率与强度的高估与低估并存。 模式普遍倾向于小雨偏多、强降水偏少,在日尺度上尤其明显。用日降水做极端统计时,这条会直接压低极值。
高纬度放大的幅度不一。 北极升温的放大倍数在模式之间从 2 倍到 4 倍都有,导致该区域的未来情景分位数很宽。
这份清单不完整,也不打算完整——完整的模式评估是 PCMDI 的系统性工作,不是一篇条目能覆盖的。列它的目的是提醒:当结论落在上述区域或变量上时,模式间分歧的解释权高于单模式结果。
6.3 质量的三个维度
CMIP6 的使用者真正要判断的是三件事,它们与精度无关。
第一是协议执行度。 某个中心承诺跑 12 个实验,实际交了几个?交了的那几个,变量是否齐、时间是否全覆盖?索引能回答一部分,但「某些变量在某个模式上缺失」这类信息要去数据请求与 ESGF 的缺口清单里查。
第二是内部一致性。 同一模式的 historical 与 esm-hist 在碳通量上是否自洽?piControl 有没有系统性漂移?这些都要自己算。
第三是可追溯性。 每个数据集都有 further_info_url 指向 ES-DOC 的模式与实验文档,有 citation_url 指向引用信息。可追溯性在这份数据上做得相当好,这是它能被学术界接受的关键。
6.4 §1.5 的案例在这一层的判断
回到 §1.5 的疾控项目。他们在质量层需要回答三个问题,而三个问题的答案都不在数据本身里。
其一,该市所在的区域,模式间的历史气温偏差有多大?这要用历史段的模式输出与本地气象站对比,算出偏差的分布而不是一个均值。
其二,日最高气温的分布,模式能否复现其偏度与极端分位的形态?这要看日表数据,且要看多个模式。
其三,在不同的 grid_label 下,该市的格点值差异有多大?这决定了他们能否把不同模式的结果放进同一个空间平均。
三个问题的答案共同决定一件事:这个评估能不能只用一两个模式就下结论。 他们的最终答案是「不能」,理由写在报告的局限章节:单一模式的日最高气温偏度与观测差得太多,必须用多模式分布。
6.5 偏差、离散度、敏感性:三个不同的东西
讨论模式质量时,三组词经常被混着用,而它们回答的是完全不同的问题。
偏差是模式对一个已知状态的系统性偏离。它能被测量,方法是与观测或再分析对比。它也是一个决定,而不是一个属性——同一个模式在热带与高纬、夏季与冬季、白天与夜间,偏差的方向与量级都可能不同。
离散度是不同模式给出的答案之间的分散程度。它不能从单个模式算出来,只能从集合里算。它混了两样东西:模式之间的结构性差异,与对某个具体变量的理解不足。两者无法分离,这是模式集合的固有局限。
敏感性是模式对外强迫变化的响应幅度,典型指标是平衡态气候敏感度。它可以从 abrupt-4xCO2 实验里估出来,是一个模式内在的参数,不是偏差。
三者的关系是:偏差小不等于敏感度可信,离散度大也不等于所有模式都错。一个模式可能历史段偏差很小但对 4 倍 CO2 的响应明显偏低,原因是它在历史段被调准了,而历史段的强迫变化幅度远小于 4 倍 CO2。
这解释了一件事:用历史段表现筛选模式,再据此推断未来可信度,是一个需要额外论证的跨越。 它是常见的做法,但论证责任在使用者身上。
6.6 二种评价量表:DAIMS 二十四项逐条对照
DAIMS 原本面向社会科学调查数据,这里借用它的检查点,把这份数据在元数据与可追溯性上的成熟度摊开来看。
| # | 检查项 | 状态 | 说明 |
|---|---|---|---|
| 1 | 宽格式 | ⚠️ | 网格场不是表格,需先切片或降维 |
| 2 | 标准记录层级 | ✅ | DRS 定义了从活动到文件的完整层级 |
| 3 | 变量名与定义 | ✅ | 短名遵循 CF 标准名,少数由中心自定 |
| 4 | 变量与问题匹配 | ✅ | 气候问题与变量清单高度对应 |
| 5 | 分类与编码 | ✅ | 全部走 CV 受控词表 |
| 6 | 数据源 | ✅ | 每个模式有 ES-DOC 文档 |
| 7 | 采集方式与工具 | ✅ | 数值模拟,方法学有专刊 |
| 8 | 采集时间 | ✅ | 每数据集有 creation_date 与 version |
| 9 | 代理变量 | ✅ | 不涉及 |
| 10 | 权重 | ❌ | 不提供模式权重,须自定并证明 |
| 11 | 缺失值编码 | ⚠️ | 文件内用 CF 缺测填充值;条目级缺失无统一标记 |
| 12 | 数据质量声明 | ⚠️ | 有模式评估文献,但无逐条目的质量字段 |
| 13 | 元数据完整性 | ✅ | 索引提供 DRS 全字段与 checksum |
| 14 | 时间覆盖 | ✅ | 协议明确 1850–2100/2300 |
| 15 | 空间覆盖 | ✅ | 全球,按模式原生网格 |
| 16 | 地理参照 | ⚠️ | 原生网格(gn)不规则,需自建坐标转换 |
| 17 | 记录完整性 | ❌ | 非冻结,持续补交与撤回 |
| 18 | 计数 | ✅ | 各维度可精确计数 |
| 19 | 文件大小 | ✅ | 索引给出 size 与 number_of_files |
| 20 | 数据存储 | ✅ | 多节点,部分有镜像 |
| 21 | 数据处理 | ✅ | CMOR 统一后处理,有与 CF 的对应 |
| 22 | 数据访问 | ⚠️ | 部分节点需登记,无单点全量入口 |
| 23 | 许可与使用限制 | ⚠️ | 逐模式自定,无统一许可 |
| 24 | 引用与致谢 | ✅ | 每个 source_id 有引用表与 exceptions contact |
第 23 项是全表唯一一个既重要又不合格的项:许可在结构上就不可能统一,因为每个中心自己定。这一项的不合格不是疏漏,是这份数据本身的制度形态决定的。
6.7 逐条局限
非冻结。 数据集持续补交,撤回标记不断新增,今天的清单不是明天的清单。
副本占多数。 索引默认返回所有副本,去重是使用者的责任。
许可逐模式。 无法用一条声明覆盖全库。
成员数不均衡。 直接平均会放大成员多的模式。
网格不统一。 12 种 grid_label,原生与重采样混杂。
极端量被平滑。 日尺度已是最高常规频率,小时级只覆盖少数模式。
时间范围因实验而异。 piControl 无固定区间,情景只到 2100 或 2300。
§7 许可与边界:没有统一许可意味着什么
7.0 阅读本节前需要知道的一件事:许可不是一个属性,是一份登记册
多数人读「数据许可」时期待的是一个属性:有了它,就能一次判断能不能商用。CMIP6 没有这样的属性。
它有的是一份按模式逐条登记的册子,会随中心的申请而变动,历史上已经变过。正确的问法因此不是「CMIP6 能不能商用」,而是「我用的这几个 source_id,按我查询那天的登记,是什么条款」。
7.1 三份文件、三道弯
CMIP6 的许可不是一条声明,而是一套分层结构:
第一层是协议层面的使用条款,由 PCMDI 的 CMIP6 使用指南给出,讲的是致谢、引用、错误报告、成果登记这几件事。
第二层是各模式的许可声明,逐 source_id 登记在 CV 表里。132 个条目中,125 个是 CC BY 4.0,6 个是 CC0 1.0,1 个测试项为空。
第三层是索引记录里的许可字段。这一层恰恰最容易出问题——见下一节。
7.2 一个必须纠正的接口预期
有一种说法流传很广:ESGF 每条记录的 license 字段里写着该模式的许可。按这个说法写代码,结果会拿到 None。
查 IPSL-CM6A-LR 与 GISS-E2-1-G 的若干数据集记录,字段清单里根本没有 license 这一项。字段清单里唯一含「lic」子串的键是 replica。
所以正确的路径只有一条:从 source_id 出发,去 CV 的许可表里查。 索引给的是「哪里有数据」,CV 给的是「谁能怎么用」,两者必须自己连起来。
7.3 许可在历史上被放宽过一次
CV 表的 history 字段记录了这件事,不止一个模式涉及。
| 模式 | 原许可 | 现许可 | 变更日期 |
|---|---|---|---|
| 4AOP-v1-5 | CC BY-NC-SA 4.0 | CC BY 4.0 | 2022-06-03 |
| ACCESS-CM2 | CC BY-SA 4.0 | CC BY 4.0 | 2022-06-10 |
| ACCESS-ESM1-5 | CC BY-SA 4.0 | CC BY 4.0 | 2022-06-10 |
| ACCESS-OM2 | CC BY-SA 4.0 | CC BY 4.0 | 2022-06-10 |
| ACCESS-OM2-025 | CC BY-SA 4.0 | CC BY 4.0 | 2022-06-10 |
这件事有两个实际后果。其一,凡是在 2022 年前完成的商业性研究,若当时依据旧许可判为不可用,现在可以重新评估。其二,凡是在 2022 年前依据旧许可写了「仅限非商业」的说明,现在需要更正,否则会误导后来者。
教训是:许可不是一次查完就定的属性,要写查询日期。
7.4 六个 CC0 模式
六个 GISS 系模式采用 CC0 1.0,即放弃全部权利。它们与其余模式的差别不在于「能不能用」(CC BY 4.0 也可商用),而在于署名义务。CC0 不要求署名。
这个差别在做批量衍生数据集时变得具体:如果衍生数据全部来自 CC0 模式,理论上可以不署名;一旦混入 CC BY 4.0 的模式,就必须署名,且要逐个列明。
7.5 §1.5 的案例在许可层的收尾
疾控项目最终交付的是一份内部评估报告,不对外发布,也不派生数据集。按 CC BY 4.0 与 CC0 1.0 的条款,这件事没有障碍。
但他们在报告附录里加了一页「数据来源与许可」,逐个列出用到的 26 个 source_id 及其许可,并注明「查询日期 2026-10-29」。这一页不是法律要求,却是让报告在三年后仍可被复核的唯一办法——因为 CV 表的 history 字段会变,而报告不会。
7.6 一份许可清单该怎么写
把上面几节折成一张可直接抄用的清单。每个 source_id 占一行,四列:
| 列 | 内容 | 为什么要 |
|---|---|---|
| source_id | 模式标识 | 它是查许可的唯一入口 |
| license | CV 表当次读到的值 | 直接抄写,不做推断 |
| history 摘要 | 曾用许可与变更日期 | 解释为什么旧文献写的与本表不同 |
| 查询日期 | YYYY-MM-DD | 让读者能判断适用的是哪一版登记 |
第四列最容易被当成形式主义省掉,但它恰恰是这张表唯一不可替代的部分。CV 表是一个活的登记册,任何不带查询日期的转述都会在某个时点变成误导。
如果这份清单要进入派生数据集,还有一件事要做:把每个 source_id 的 exceptions contact 也记下来。CV 表的这一列给出的是该中心的联络地址,用途是许可疑问与数据错误报告。它不是紧急联系方式,但在争议发生时是唯一的正式渠道。
7.7 许可之外的三条约定义务
协议层面的使用条款与各模式的许可声明是两层不同的东西,后者是授权,前者是学术共同体内部的约定。前者包含三件与合规无关但必须做的事:
致谢。 项目总述论文与被用到的每个 source_id 的推荐引用,通常要一起给出。只引总述论文而不引模式,等于把几十个中心的贡献写成了一次。
错误报告。 发现某数据集有实质性问题时,应通过 ESGF 或该中心的通道报告,而不是在自己的论文里私下处理。这条的意义在于数据可以被修正,后来的使用者不必再踩一次。
成果登记。 PCMDI 维护着一份基于 CMIP6 的出版物清单入口。登记是自愿性质,但它让这份数据的使用情况可被追踪,也是它仍在被持续维护的理由之一。
§1.5 的案例在 7.5 里交代了许可清单的做法,但没提这三条——因为报告是内部件、不对外发布,致谢与登记的义务不成立。如果他们后来把这份评估改写成公开论文,这三条就都适用了。这也是很多政府或机构内部研究的共同处境:先用、后发,两个阶段适用的义务不一样。
§8 常见误读与避坑清单
| 常见说法 | 实际情况 | 证据 |
|---|---|---|
| 「CMIP6 是一个数据集」 | 是 132 个模式、260 个实验、46 个机构的联邦集合 | 索引 facet_fields 各维度计数 |
| 「CMIP6 有 1,476 万条数据」 | 这是数据集级记录数,且八成是副本;文件级条目还要多一个量级 | replica=true 计 11,965,733 |
| 「CMIP6 用 CC BY 4.0」 | 无统一许可,132 项中 125 项 CC BY、6 项 CC0、1 项留空 | CV 许可表逐项登记 |
| 「ESGF 记录的 license 字段能直接读」 | 数据集级记录没有该字段,须去 CV 表按 source_id 查 | 字段清单中无 license 键 |
| 「historical 到 2100」 | historical 协议终点是 2014,之后由情景实验接续 | CV 表 historical 行 end year=2014 |
| 「所有 ssp 都到 2100」 | ssp585、ssp126、ssp534-over 的协议终点可为 2300 | CV 表 end year 列 |
| 「成员数都差不多」 | 单模式单变量从 1 到近百不等,CanESM5 的 tas 有 89 个 | member_id facet |
| 「variant_label 的后两位无所谓」 | p 变即物理方案变,不是同模式的新样本 | CV 对 r/i/p/f 的定义 |
| 「nominal_resolution 就是格距」 | 是分桶标称值,同桶内格距可差数倍,且有 100km 与 100 km 两种写法 | 同一查询返回两个桶 |
| 「同一模式同一变量只有一份」 | 可能分在 gr、gn、gr1 多种网格上;也可能只有其中一种 | IPSL-CM6A-LR 的 tas 只见 gr |
| 「索引查到就能下载」 | 数据集记录的 url 字段不存在,文件地址在 File 类型记录里 | Dataset 与 File 字段对比 |
| 「撤回的数据不在目录里」 | 撤回仍留在索引,标记为 retracted=true,共 405,751 条 | retracted facet |
| 「DCPP 那么多数据,一定最重要」 | 条目多源于逐年起始的 60 个实验设计,非重要性 | DCPP 协议起始年 1960–2019 |
§9 使用指引:把 CMIP6 变成一个可回答的问题
9.1 三种角色,三条路
| 角色 | 建议路径 | 关键动作 |
|---|---|---|
| 做气候风险的情景分析 | 固定实验集合 + 固定成员数 + 固定网格 | 先定四条 ssp,再定每模式取 r1i1p1f1 |
| 训练或评测 ML 降尺度模型 | 用 perfect-model:一个模式作真值,另一个模式作输入 | 训练与测试的模式必须分开 |
| 研究模式物理行为 | piControl + abrupt-4xCO2 配对,逐模式算 | 不能用集合平均代替单模式响应 |
第一条与第三条的差别在「平均」这件事上的态度:风险分析要的是分布的尾部,研究物理要的是个体。
9.2 §1.5 的案例最后怎么做
前面几节已经把该项目组卡住的地方逐个讲完。把他们最终的方案完整列一遍,能看清一件贯穿全书的事:CMIP6 的使用负担,几乎全在「先做决定、再做计算」这一段。
- 定实验。 取 ssp126、ssp245、ssp370 三条,放弃 ssp585(作为上界单独报告)。理由:政策讨论集中在三条中间路径上,ssp585 已不在主流假设范围内。
- 定模式。 取 26 个模式,逐个查它在所选中实验下的
tasmax(日最高气温)与tas(月均)是否有 Amon 与 day 表。有 7 个模式因缺 day 表被剔除。 - 定成员。 每个模式只取 r1i1p1f1。理由:他们要的是模式间分布,不是内部变率;成员数为 1 时不会放大任何模式。
- 定网格。 优先取 gr;对只提供 gn 的模式,用各自的 areacella 做面积加权后重网格到 1° 规则网格。
- 定基线。 用同一批模式的 historical 1995–2014 段做基线,不用观测做基线。理由:这样偏差是模式内部的偏差,前后一致。
- 算分布。 对每个模式算出 2041–2060 年夏季日最高气温的 95 分位,得到 26 个值;再对这 26 个值取中位数与四分位距,作为「模式间分布」的报告方式。
- 报不确定性。 报告里给三个数:中位数、模式间四分位距、以及恰好落在某一温度阈值以上的模式个数。
第 7 步是这套方案里最关键的设计:用「有多少个模式超过阈值」代替「平均升温多少度」。前者对模式间的离群值更稳健,也更接近决策者要问的问题。
9.3 在 AI 流水线中的位置
CMIP6 在机器学习流水线里通常是标签或虚拟真值,较少作为输入。
作为标签时,典型任务是降尺度:低分辨率模式输出 → 高分辨率场。这里最大的陷阱是泄漏——若训练与测试取自同一模式的同一成员,模型学的是「这个模式的插值方式」,而不是物理关系。正确的做法是 pattern-based split:某些区域或某些时段只出现在测试集。
作为虚拟真值时,典型任务是方法评估:把某个模式的输出当真值,看统计方法或另一个模式能否复原。这类设计的好处是答案已知,坏处是「真值」本身也是一个模型。
9.4 一份最小可跑的实现
下面的代码在已有本地 NetCDF 文件的前提下,做一次「逐模式成员平均、再跨模式等权平均」的正确计算。
import glob
import xarray as xr
import numpy as np
def load_pattern(pattern):
"""读取一个模式的全部成员文件,返回 {member: DataArray}"""
out = {}
for path in glob.glob(pattern):
ds = xr.open_dataset(path, use_cftime=True)
member = ds.attrs.get("variant_label", "unknown")
out[member] = ds["tas"].load() - 273.15
ds.close()
return out
def model_mean(tas_by_member):
"""先对成员取平均,得到该模式的一条序列"""
stack = xr.concat(list(tas_by_member.values()), dim="member")
return stack.mean(dim="member")
per_model = []
for pat in [
"tas_Amon_IPSL-CM6A-LR_historical_r*i1p1f1_gr_*.nc",
"tas_Amon_CanESM5_historical_r*i1p1f1_gn_*.nc",
"tas_Amon_MIROC6_historical_r*i1p1f1_gn_*.nc",
]:
mm = model_mean(load_pattern(pat))
per_model.append(mm)
ens = xr.concat(per_model, dim="model", join="override")
grand = ens.mean(dim="model")
print("模式数:", ens.sizes["model"], "格点数:", ens.sizes["lon"] * ens.sizes["lat"])
print("全球年均温 (degC):", float(grand.mean(dim=["lon", "lat"]).mean()))
三处值得说明。
use_cftime=True 是因为部分模式的模式时钟起点不是 1850 年,用标准日历解析会报错或得到错位的日期。
mean(dim="member") 必须先做。直接 concat 所有文件再求平均,等价于按文件数加权,成员多的模式会主导结果。
join="override" 是因为不同模式的经纬度网格不同,直接拼接会因坐标不一致抛出异常。真做跨模式平均时,此处应先插值到共同网格——这段代码只是演示拼接层面的处理,不是完整的重网格方案。
9.5 评估时最少要报的五件事
用 CMIP6 做的结论,报告里至少要写清五件:
- 用了哪些 source_id,以及它们的成员数;
- 每个模式取的是哪种 grid_label;
- 基线用什么(观测,还是同批模式的 historical);
- 模式之间的加权方式,以及为什么这么加权;
- 每个模式的许可,以及查询日期。
第 5 条常被省掉,但它决定了这份结果三年后还能不能被合法复用。
9.6 模式加权:三种常见做法与各自的代价
「多模式平均」这句说法背后至少有三种做法,结论会明显不同。
| 做法 | 计算 | 代价 |
|---|---|---|
| 等权模式平均 | 每个模式先做成员平均,再对各模式取算术平均 | 假设所有模式同等可信,包括明显偏差大的那些 |
| 成员等权平均 | 把所有模式的全部成员放在一起平均 | 成员多的模式权重被放大,这是最常见的错误 |
| 性能加权 | 按模式的历史表现(如对观测的误差)给权重 | 权重依赖评估指标的选择,且易过拟合评估期 |
第二种做法在代码里最省事,只要把所有文件 concat 再 mean 就完成了,因此也是事故最多的一种。第一种做法多写三行,但结果可解释。
第三种做法在文献里很常见,代价是它把「模式历史上表现好」推断为「模式在未来可信」。这个推断在物理上有争议,在统计上也需要说明权重是怎么算出来的。若采用,必须报告权重的分布,而不是只报加权后的均值。
无论哪一种,模式间的分位数区间都应当与均值一起报告。只报均值会把「模式间分歧很大」这一最重要的事实抹掉,而分歧本身往往比均值更能回答决策问题。
§1.5 的案例在第 6 步用的是第一种做法,在对 26 个模式取中位数与四分位距时,实际上又叠加了一层稳健性:中位数对离群模式不敏感,四分位距直接量化分歧。这套组合比加权平均更适合「给决策者一个区间」的用途。
9.7 从演示代码到可用流水线的四个补丁
§9.4 的代码能跑通,但它只是一段演示。要变成可日常运行的流水线,至少还要补四块。
补丁一:网格对齐。 演示代码用 join="override" 强行拼接,只为让示例不报错。真实场景必须插值到共同网格,且插值方法要写进报告。常用的选择是双线性(连续量)与守衡重网格(通量类量),前者快、后者准,混用会让不同变量的比较失真。
补丁二:日历与时区。 模式日历有 360 天、无闰年、全闰年等变体,部分中心用自定义日历。按标准日历解析会得到错位的月边界。use_cftime=True 只是不报错,聚合前还要确认月与季的定义一致。
补丁三:缺测与掩膜。 海洋模式输出里,陆地点是填充值。若不先应用掩膜,陆地格点上的填充值会污染海洋平均。CF 约定用 _FillValue 属性给出,多数库会自动识别为 NaN,但不是全部。
补丁四:断点续跑与指纹。 一次集合计算可能涉及上千个文件,中途失败是常态。每个文件在下载后应记录 checksum,在聚合前校验;聚合参数(模式清单、版本、网格选择)应生成指纹一并存档。
这四块都不在演示代码里,而它们恰好决定了结果能不能复现。这也是这份数据在工程上最需要纪律的地方:取数本身不难,难的是把每一个隐含的决定记录清楚。
§10 生态与版本:它靠什么活着
10.1 时间线
| 时间 | 事件 |
|---|---|
| 2016 | CMIP6 实验设计总述论文发表(GMD) |
| 2018 | CMIP6 数据参考语法与 CV 规范定稿论文发表(GMD) |
| 2019 | 首批模式数据进入 ESGF,PCMDI 说明页文档版 2019-02-13 |
| 2020–2021 | 大规模补交,各活动陆续齐备 |
| 2022 | 多个模式将许可从 CC BY-NC-SA / CC BY-SA 放宽为 CC BY 4.0 |
| 2023 | CMIP6Plus 启动,承接补充实验 |
| 2025-07 | PCMDI 数据持有量页最后一次更新 |
| 持续 | 各节点补交、撤回、版本更新 |
10.2 它靠什么活着
第一是机构承载。 它由 WCRP 的耦合模式工作组统筹,由 PCMDI 维护 CV 与索引基础设施,由十几个国家的气候中心出数据节点。这套组合有制度性的资金承诺。
第二是协议的可扩展性。 实验设计是模块化的:DECK 是基础,各 MIP 在此之上叠加。新问题可以提案成新 MIP,不需要推翻整个协议。这让它能持续吸纳新的科学关切。
第三是被引用形成的路径依赖。 IPCC 评估报告的多数结论建立在 CMIP 数据上,下游的模型、论文、教学材料都以此为基础。切换成本本身成为黏性。
10.3 谁在依赖它
| 依赖方 | 用途 |
|---|---|
| 气候影响与适应研究 | 情景下的温度、降水、极端事件分布 |
| 气候归因研究 | DAMIP 的单一强迫实验 |
| 气候模式开发 | 模式间比较,定位自身偏差 |
| 政策评估 | 升温路径与排放假设的对应 |
| 机器学习降尺度 | 低分辨率到高分辨率的映射学习 |
| 健康风险评估 | 热浪暴露、病媒分布的情景推演 |
§1.5 的案例在表里落在最后一行。它的整个暴露估计链条建立在第一行的可获取性上,所以它必须在报告里说明数据是在哪一天取的。
10.4 CMIP6 之后:CMIP7 正在推进
CMIP7 已经在组织阶段。PCMDI 说明页的导航里,CMIP7 与 CMIP6、CMIP6Plus 并列成三项,说明这是一个已立项的后续阶段,而不是讨论中的设想。
这意味着什么,对使用者是具体的:
- CMIP6 不会立刻下线,但它的「持续补交」状态会逐步收敛成「冻结档案」。当一个计划有了下一代,上一代的补交热情会明显下降。
- 新的实验设计会改变集合结构。若 CMIP7 对成员规模或情景数量有新要求,靠 CMIP6 学到的取数规则不能直接沿用。
- 现在写下的代码,最好把项目名与 CV 版本当作参数,而不是硬编码。
对大多数应用型研究,未来两三年内 CMIP6 仍是主力。但任何长期维护的流水线,都该把「换到 CMIP7」写进路线图。
10.5 迁移时最容易断的三根线
从 CMIP6 迁到下一代,真正会咬人的不是数据重新下载,而是三处隐含假设断裂。
第一根是目录层级。 CMIP6 的 DRS 把 activity_drs 放在层级里,但索引的 fq 用的是 project 与 activity_id。迁移时若 CV 的字段名或层级顺序调整,所有按字符串拼路径的代码都会失效。对策是把路径拼接集中在同一个函数里,而不是散落在各处。
第二根是实验命名。 historical、ssp245 这类名字在 CMIP6 里是稳定契约,但下一代可能引入新的情景命名体系与新的基线年代。若代码里把 experiment_id == "historical" 写死成「历史段的唯一合法值」,迁移时无从替换。
第三根是成员约定。 r1i1p1f1 作为默认成员是 CMIP6 的惯例,不是规范强制的。若下一代对成员编号或默认成员的约定变了,那些默认取 r1i1p1f1 的代码会静默取到空结果。
它们的共同点是:不在数据里,而在使用者的假设里。 这也是 §1.5 的案例专门在报告里写了一节「取数约定」的原因——写下来,迁移时才有依据逐条检查。
10.6 引用与许可
引用分三层:计划层面的总述论文(实验设计、数据规范各一篇)、模式层面的 source_id 引用(CV 表给出每个模式的推荐引用与需要联系的 exceptions contact)、数据集层面的 PID(每条数据集记录带 hdl:21.14100/ 前缀的句柄)。
许可分两层:协议层面的使用条款(致谢、错误报告、成果登记),与逐模式的许可声明。两层都要遵守,后者是法律意义上的授权,前者是学术共同体的约定。
§11 AI 使用声明
| 栏目 | 内容 |
|---|---|
| 性质 | 多中心数值模拟输出,非观测 |
| 用途 | 情景分析、降尺度训练与评测、模式评估、虚拟真值框架 |
| 不建议用途 | 当作观测真值、把不同实验拼成一条无缝曲线、用单一模式代表「气候模式」 |
| 伦理 | 无个人数据;下游若涉及健康或暴露评估,注意模式间分歧的传达方式,不应只报均值 |
| 引用 | 计划总述论文 + 每个 source_id 的引用 + 数据集 PID |
| 许可 | 逐模式:CV 表登记,多数 CC BY 4.0,六项 CC0 1.0 |
| 版本 | source_id + experiment_id + member_id + table_id + variable_id + grid_label + version |
| 状态 | 在线,持续补交与撤回,CMIP7 在组织阶段 |
附录 A 速查卡
| 键 | 值 |
|---|---|
| ESGF 检索入口 | esgf-node.ornl.gov/search |
| Solr 桥 | esgf-node.ornl.gov/esgf-1-5-bridge |
| PCMDI 说明页 | pcmdi.llnl.gov/CMIP6/ |
| 数据集级记录 | 千万量级,正文 §2.2 给出确切值 |
| 文件级记录 | 数据集记录的 4.2 倍 |
| 主副本占比 | 约 19% |
| 模式数 | 132 |
| 机构数 | 46 |
| 实验数 | 260 |
| 变量短名数 | 1,216 |
| 网格标记 | 12 种 |
| historical | 1850–2014 |
| 情景起点 | 2015 |
| 许可 | 逐模式,CV 表 |
| 格式 | netCDF(CF 约定) |
附录 B 实验速查
| 实验 | 活动 | 时间 | 用途 |
|---|---|---|---|
| piControl | CMIP | 无固定区间 | 内部变率与漂移 |
| historical | CMIP | 1850–2014 | 观测强迫重演 |
| amip | CMIP | 1979–2014 | 给定海温的大气响应 |
| abrupt-4xCO2 | CMIP | 从 piControl 起 | 平衡态响应 |
| 1pctCO2 | CMIP | 从 piControl 起 140 年 | 瞬态响应 |
| ssp126 | ScenarioMIP | 2015–2100 | 低排放 |
| ssp245 | ScenarioMIP | 2015–2100 | 中等排放 |
| ssp370 | ScenarioMIP | 2015–2100 | 较高排放 |
| ssp585 | ScenarioMIP | 2015–2100 或 2300 | 高排放 |
| hist-nat | DAMIP | 1850–2020 | 仅自然强迫 |
| dcppA-hindcast | DCPP | 1960–2019 逐年起始 | 年代际回溯 |
附录 C 术语表
| 术语 | 含义 |
|---|---|
| CMIP | 耦合模式比较计划 |
| DECK | 诊断、评估与表征关键过程的基础实验结果集合 |
| MIP | 模式比较计划,CMIP6 下的子计划 |
| ESGF | 地球系统网格联盟,分布式数据基础设施 |
| CV | 受控词表,登记所有合法取值 |
| DRS | 数据参考语法,约定文件名与目录结构 |
| source_id | 模式标识 |
| experiment_id | 实验标识,决定边界条件 |
| member_id | 成员标识,与 variant_label 同值 |
| grid_label | 网格标识,区分原生与重采样 |
| nominal_resolution | 分桶用的标称分辨率 |
| replica | 副本标记,true 表示镜像 |
| retracted | 撤回标记,仍留在索引中 |
| CMOR | 统一输出格式的工具链 |
| ECS | 平衡态气候敏感度 |
| historical | 1850–2014 的历史强迫实验 |
| 情景实验 | 2015 年起按排放路径推演的实验 |
| 模式集合 | 不同模式输出的汇总 |
| 成员集合 | 同模式不同初值的样本 |
| perfect-model | 以一个模式为真值检验方法的框架 |
附录 D 常见问题
Q1:CMIP6 有多少数据? 按索引计数,数据集级约千万量级、文件级约六千万量级,两者都含八成以上副本。
Q2:能匿名下载吗? 部分节点可以,部分需要登记。访问要求与许可条款是两件事。
Q3:为什么同一个模式在不同节点上有? 联邦式分发,主副本加镜像副本。
Q4:historical 之后接哪个情景? 常用四条:ssp126、ssp245、ssp370、ssp585,按研究问题选。
Q5:成员数不一样能直接平均吗? 不能,先按模式做成员平均,再跨模式平均。
Q6:gn 和 gr 选哪个? 要跨模式逐格比较选 gr 类;要保留原生信息选 gn 并自己重网格。
Q7:许可怎么查? 按 source_id 去 CV 许可表查,不要指望索引记录的 license 字段。
Q8:CMIP7 出来之后 CMIP6 还能用吗? 能,但会逐步冻结,不再大规模补交。
编辑说明
核验时间 2026-10-29。方法:调用 ESGF Solr 桥(esgf-node.ornl.gov/esgf-1-5-bridge),以 distrib=false&type=Dataset&project=CMIP6 取得 numFound 14,769,319 与文件级 62,156,341,取 activity_id / source_id / institution_id / experiment_id / table_id / variable_id / grid_label / data_node / replica / retracted 各项 facet_fields 计数;以 query 参数下探 historical、ssp245、ssp585、piControl、abrupt-4xCO2、1pctCO2、amip 等子集;读取 PCMDI CMIP6 主页、数据用户指南与数据持有量页(该页自述更新时间为 2025-07-02),取得实验设计要求、netCDF/CMOR 与 DRF 约定、七项数据节点入口;读取 WCRP-CMIP/CMIP6_CVs 的 experiment_id 表(322 行,含 historical 1850–2014、ssp585 终点 2100 或 2300 等)与 source_id 许可表(132 行,125 CC BY 4.0、6 CC0 1.0、1 为空,history 字段记录 2022 年前后的放宽);核对 esgf-node.ornl.gov/search、esgf-node.llnl.gov/projects/cmip6/、esgf-node.ipsl.upmc.fr/projects/cmip6-ipsl/、esgf-data.dkrz.de/projects/cmip6-dkrz/、aims2.llnl.gov/search 均返回 200,esgf-index1.ceda.ac.uk/projects/cmip6-ceda/ 在本环境超时未验证;核对 DOI 10.5194/gmd-9-1937-2016 与 10.5194/gmd-11-1929-2018 可解析。未下载任何 NetCDF 文件,未登录任何节点,因此未做逐变量的分布统计,未逐个核验文件体积;正文中出现的单文件大小(areacella 的 52,193 与 48,043 字节)取自索引 size 字段,为单条示例。索引中的分面计数随节点补交与索引同步而变动,正文数值对应 2026-10-29 的查询时刻。Solr 桥对 facet 与 fq/query 的组合存在不一致行为(例如若干场合 fq 与 query 同时生效、另一些场合只认其一),正文 §5.4 已说明稳妥写法。wcrp-cmip.org 在本环境返回 403,其内容未引用。
相关数据集导航
以下为站内 AI-Ready 数据集百科中与本词条共享多个主题标签的相关数据集,按相关度降序排列:
- global-burden-of-disease — 共享标签:公共卫生与流行病学 / 全球健康 / 流行病学
- our-world-in-data — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康
- ghcn-daily — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康
- jhu-csse-covid-19 — 共享标签:公共卫生与流行病学 / 时序数据 / 流行病学
- wpp — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康
- era5-single-levels — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康
- oisst-v2-1 — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康
- usgs-comcat — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康
- ibtracs — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康
- mswep-v3 — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康
导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

