CMIP6 耦合模式比较计划 — 三十多个中心各跑一遍同一实验

132 个模式、1,476 万条数据集、6,216 万个文件,散在 16 个节点上

来源 Earth System Grid Federation(ESGF)— CMIP6 联邦索引 url: https://esgf-node.ornl.gov/search发布时间: 2026-10-29最后更新: 2026-10-29 阅读 5
CMIP6 耦合模式比较计划 — 三十多个中心各跑一遍同一实验

信息速览

数据集名称CMIP6 耦合模式比较计划 — 三十多个中心各跑一遍同一实验
数据类型1,476 万条数据集,132 个模式,260 个实验,16 个数据节点,1850–2100,许可逐模式自定
规模不适用(全球气候模式输出格点场,无个体记录;实体单位为模式×实验×成员×表×变量×网格的组合)
接入方式Earth System Grid Federation(ESGF)— CMIP6 联邦索引 url: https://esgf-node.ornl.gov/search
AI 就绪度

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 的使用负担,几乎全在「先做决定、再做计算」这一段。

  1. 定实验。 取 ssp126、ssp245、ssp370 三条,放弃 ssp585(作为上界单独报告)。理由:政策讨论集中在三条中间路径上,ssp585 已不在主流假设范围内。
  2. 定模式。 取 26 个模式,逐个查它在所选中实验下的 tasmax(日最高气温)与 tas(月均)是否有 Amon 与 day 表。有 7 个模式因缺 day 表被剔除。
  3. 定成员。 每个模式只取 r1i1p1f1。理由:他们要的是模式间分布,不是内部变率;成员数为 1 时不会放大任何模式。
  4. 定网格。 优先取 gr;对只提供 gn 的模式,用各自的 areacella 做面积加权后重网格到 1° 规则网格。
  5. 定基线。 用同一批模式的 historical 1995–2014 段做基线,不用观测做基线。理由:这样偏差是模式内部的偏差,前后一致。
  6. 算分布。 对每个模式算出 2041–2060 年夏季日最高气温的 95 分位,得到 26 个值;再对这 26 个值取中位数与四分位距,作为「模式间分布」的报告方式。
  7. 报不确定性。 报告里给三个数:中位数、模式间四分位距、以及恰好落在某一温度阈值以上的模式个数。

第 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 做的结论,报告里至少要写清五件:

  1. 用了哪些 source_id,以及它们的成员数;
  2. 每个模式取的是哪种 grid_label;
  3. 基线用什么(观测,还是同批模式的 historical);
  4. 模式之间的加权方式,以及为什么这么加权;
  5. 每个模式的许可,以及查询日期。

第 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 — 共享标签:公共卫生与流行病学 / 时序数据 / 全球健康

导航说明:本章节由全站统一标签体系自动计算生成(标签重合度算法),双向可达;点击链接可跳转至对应数据集词条。

返回 AI-Ready 数据集