简介:RClimDex用户手册是一份面向气候科研工作者、气象业务人员及高校相关专业学生的权威参考资料,系统讲解由加拿大环境部气候研究分支开发的极端气候指数计算软件。资源为单份doc格式文档,压缩包仅约600KB,虽然以文字为主,但结构完整、条理清晰,正文覆盖R环境安装与运行、RClimDex加载与数据质量控制、缺失值与异常值处理、指数计算主流程、已知问题与bug报告等核心章节;附录还包含气候指数清单、输入数据格式、指数定义、阈值和基准期温度指数计算以及Windows常见问题解答,方便用户按需查阅。借助该手册,读者能够掌握高温日数、低温日数、极端降雨量等27个核心极端气候指数的计算方法,并学会自定义阈值与基准期,以适配不同区域和时段的分析需求。目前已有3836人学习该资源,适合具备一定R语言基础、希望系统开展极端气候指数监测与气候变化研究的科研人员与高年级学生。
1. 极端气候指数计算软件:从一份日值数据到 27 个监测指标
一份站点日值数据——日期、降水量、最高温、最低温——能浓缩出多少气候变化信号?答案是 27 个被国际气象学界普遍采用的极端气候指数:霜冻日数、夏季日数、热带夜、极端降水日数。RClimDex 这个基于 R 的图形界面软件包,就是为了把这些指数从繁琐的逐站手工统计中解放出来。它由某国家级气候研究机构的气象学者开发维护,早期版本在 2004 年的国际气候指数研讨会上被反复测试改进,之后成为很多气象台站处理历史日值数据的常用工具。这篇文章从环境安装讲起,把数据格式、质量控制、指数计算和几个知名规避方式完整过一遍,适合正要接触极端气候指数计算的一线业务人员和气候研究者。
2. 为什么用 R 重写:百分位指数的同质性缺陷与选型逻辑
2.1 Excel 方案为什么被淘汰
第一代极端气候指数计算工具是用 Excel 宏实现的。它在处理基于固定阈值的指数时没有问题,比如霜冻日数、夏季日数这类直接把阈值套到日值上的指标,但在计算基于百分位的温度指数时,暴露了一个统计硬伤。所谓百分位指数,是把基准期内每一天的日最高温或日最低温放到该日的气候分布里去比较,取第 10 百分位或第 90 百分位作为冷、暖事件的判定线。最早的实现方式直接对基准期的逐日序列求经验百分位,得到的指数序列在统计上不均匀——不同年份之间的可比性变差,直接干扰气候变化趋势的检测。
2003 年研究者发现这个问题后,修复方案需要在每个日期的窗口内做 bootstrap 重抽样,才能得到稳定的百分位估计。这个方法计算量大、逻辑复杂,在 Excel 的宏环境里几乎无法实现。把整个工具移植到 R,就成了当时最合理的选择:R 免费、跨平台、底层统计函数完备,还能挂 Tcl/Tk 做图形界面,把复杂度藏在菜单后面。从使用者的角度看,RClimDex 用起来仍然像一个小型桌面软件,而不是一堆需要手动敲的脚本。RClimDex 不仅覆盖了 Excel 版 ClimDex 1.3 的几乎全部指数,还扩展了用户自定义阈值的温度与降水指数,算是同一套思路下功能更完整的版本。
| 能力维度 | Excel 版 ClimDex | R 版 RClimDex |
|---|---|---|
| 百分位指数计算 | 直接经验百分位,序列不均匀 | bootstrap 重抽样修正 |
| 运行平台 | 依赖 Windows 与 Excel | Windows / Linux / Unix |
| 阈值指数 | 固定阈值 | 用户自定义阈值 + 27 个核心指数 |
| 结果可视化 | 基础图表 | 趋势线 + 局部加权回归图 |
2.2 R 与 Tcl/Tk 的版本边界
R 的安装不复杂,但版本边界要注意。RClimDex(1.0)的开发基准是 R 1.84,文档明确要求 R 1.84 或更高版本。Tcl/Tk 图形库从 R 1.9.0 开始被包含在默认安装里,如果机器上装的是更早的 R,需要单独补装 Tcl/Tk,否则 RClimDex 加载时会因为找不到图形组件而直接失败。我的建议是直接装当前主流的稳定版 R,省得在这些底层依赖上浪费一个下午。
Windows 下安装包是标准的向导式安装,装完桌面上会出现 R 的快捷方式;Linux 下通常下载预编译的二进制包,用包管理器安装;其他 Unix 系统可能要自己编译源码。装完第一件事,打开 R 控制台,输入q()退出,确认基本运行没问题。这也是给后面所有步骤做的第一次自检——R 本身跑不起来,后面的一切都是空谈。另外,部分 Windows 机器上需要先设置一个名为 HOME 的环境变量,否则 R 的日志和配置文件写不进去,表现为启动后提示找不到目录。遇到这种问题,直接在系统环境变量里把 HOME 指向一个纯英文路径的目录就行。
2.3 加载 RClimDex:两条路都值得知道
RClimDex 本身不是一个需要 install.packages 的标准 R 包,而是一个单独的 rclimdex.r 源码文件。加载方式有两种,第一种是在 R 控制台提示符下执行 source():
# 把路径换成 rclimdex.r 实际存放的位置 # Windows 路径建议用正斜杠,避免转义符问题 source("D:/tools/rclimdex/rclimdex.r")第二种适合不习惯命令行的用户:在 Windows 的 RGui 菜单里选 File → Source R code,然后在弹出的文件选择窗口里定位到 rclimdex.r。两种方式的本质一样,都是把源码读进当前 R 环境执行,只是入口不同。source() 的参数只有一个文件路径,注意整个路径要用英文引号包住,如果文件放在当前工作目录下,直接写文件名就行。
加载成功后,屏幕上会出现 RClimDex 主菜单。这个菜单用 Tcl/Tk 渲染,有"加载数据并运行 QC""指数计算""退出"三个入口。看到这个菜单,说明源码加载成功、Tcl/Tk 依赖没问题。如果加载过程中报错,最常见的原因是路径里有中文或空格,老版本 R 对这些处理得不好;先把文件放到纯英文路径下再试。主菜单之外没有单独的参数设置页,所有参数都分散在后续步骤的小窗口里,这也是新手容易找不到设置入口的原因。
3. 输入数据与质量控制:格式约定、QC 逻辑与四份日志文件
3.1 输入文件格式:站名.txt 与六列数据
RClimDex 对输入文件有明确的格式约定,数据文件命名为"站名.txt",比如 DEMO01.txt。文件内容是纯文本,每行对应一天,共六列:年、月、日、降水量、日最高温、日最低温。缺失值统一编码为 -99.9,不写 NaN,也不用空着。这个格式是硬性要求,我见过不少人第一次加载失败,回头一看是把缺失值写成了 -9999 或者直接留空,程序读不进去。R 控制台会抛错误信息,但信息本身并不会告诉你"哪一列错了",只能自己回去对照格式查。
1960 12 31 -99.9 -99.9 -99.9 1961 01 01 0.0 8.5 2.1 1961 01 02 2.5 9.2 1.8 1961 01 03 -99.9 -99.9 -99.9注意上面第一行,这是规避一个已知启动问题的"补丁行",具体原因在第 5 章会讲。正常业务数据里不会出现这一行,但你最好知道它存在的意义。列与列之间用空格或逗号分隔都可以,但同一文件内要保持一致,不要一会儿空格一会儿逗号。
3.2 QC 的三步处理:缺失值、不合理值、离群值
数据质量控制是计算指数之前的必经步骤,RClimDex 的 QC 按顺序做三件事。第一步,把所有 -99.9 替换成 R 内部的缺失值 NA,这纯粹是格式转换,为了后续统计函数能正确处理。第二步,把不合理的物理值替换成 NA,包括降水量小于零的值,以及日最高温小于日最低温的值。第三步,识别日最高温和日最低温中的离群值——注意这第三步只是识别和标记,不做替换,后面会展开说这一步的关键区别。
前两步是自动完成的,不需要你输入任何参数。第三步需要你提供一个判定标准:某一天的温度值,如果落在该日多年平均状态加减 n 倍标准差的区间之外,就被标记为离群值。这个 n 就是你加载数据时在 QC 参数窗口里填的那个数。降水量没有离群值判定,因为降水的分布太偏,均值加减标准差的方法不适用。
3.3 离群值判定参数 n 怎么设
QC 参数窗口里有一个默认值 n = 3,即均值加减 3 倍标准差作为离群值判定边界。但实际操作中,3 倍标准差会标记出非常多的点,尤其在高海拔或高纬度站点,日较差本来就大,被误标的正常值不少。手册里的建议是开始用 4,先跑一遍,看看到底标记了多少点,再根据你的业务判断决定是否收紧。我一般会先用 4 跑通全流程,然后单独打开离群值清单文件逐条判断,而不是一上来就用 3 把自己淹没在标记列表里。
n 的值只影响温度离群值的标记范围,不影响前面两步的自动替换,也不影响降水数据。所以这个参数可以放心来回试,改一次重跑一次 QC 即可,原始输入文件不会被改动,试错的成本很低。
3.4 QC 输出:四份 CSV 与四份 PDF 的用途
QC 跑完后,RClimDex 会在当前目录下创建一个 log 子目录,里面放四份 CSV 文件和四份 PDF 文件。四份 CSV 分别是温度不合理值记录、降水不合理值记录、温度离群值标记清单、QC 后数据。第三份文件最重要,它逐条列出被判定为离群值的日期和对应温度,供人工复核;第四份文件则直接用于后续的指数计算。需要再次强调,第四份文件里只有缺失值和不合理值被替换成了 NA,离群值原样保留。
四份 PDF 是时间序列图:日降水量、日最高温、日最低温、日较差,缺失值在图上用红点标出。我一般先把这四张图扫一眼,如果看到某个年份全是红点,说明数据缺测很严重,这种站点的指数结果要非常谨慎地解读。离群值清单里的点,确认真的是错误值的,直接改原始数据文件,或者直接编辑 QC 后数据文件,改完再继续。
4. 核心指数计算:基准期、自定义阈值与 27 个指数输出
4.1 基准期与纬度参数
进入指数计算前,RClimDex 会弹出一个参数设置窗口,里面有几个关键输入。第一个是基准期的起止年份,比如 1961–1990,这个基准期用来计算百分位阈值。百分位指数的逻辑是:把基准期内每一天的温度读数放到该日期的气候分布里,找出第 10 和第 90 百分位,然后用整个序列的每一天去和这两个阈值比较。基准期的选择直接影响阈值稳定性,一般建议至少 30 年,与气候态的定义习惯一致。如果站点记录太短,基准期年份跨度缩到 20 年也能跑,但结果的不确定性会明显上升。
第二个是站点纬度,南半球填负数。纬度参数只影响一个指数的计算逻辑:生长季节长度。北半球从 1 月 1 日到 12 月 31 日计算,南半球则从 7 月 1 日到次年 6 月 30 日计算。这个参数填错了不会报错,但生长季结果会完全不对,所以填的时候最好拿台站表核对一下。
4.2 用户自定义阈值:Rnn、SUmm、FDmm、TRmm、IDmm
参数窗口里还有一组用户自定义阈值。第一个是降水阈值 P,单位毫米,用来计算 Rnn 指数——日降水量超过 P 毫米的天数。比如设 P = 10,输出的就是每年日降水超过 10 毫米的天数序列。P 设多少完全取决于你的业务需求,研究暴雨事件可以设 50,研究一般性强降水设 10 或 20 都行。
另外四个是温度阈值,分成两组。组一针对日最高温:自定义上限和自定义下限,分别计算日最高温超过上限的天数与日最高温低于下限的天数;组二针对日最低温:同样有上限和下限,分别计算日最低温超过上限的天数与日最低温低于下限的天数。这四个指数在输出里命名为 SUmm、FDmm、TRmm、IDmm,其中的 mm 就是你填的阈值。这里容易绕晕,我的记忆方法是:前两个管白天的温度,后两个管夜间的温度;SU 是 summer 的缩写,算热天;FD 是 frost days,算冷天;TR 是 tropical nights,算暖夜;ID 是 ice days,算冰日。
4.3 指数选择与计算流程
参数设完后,RClimDex 会进入指数选择窗口,27 个核心指数默认全部勾选。这些指数既有基于固定阈值的,比如霜冻日数 FD0(日最低温低于 0 摄氏度的天数)、夏季日数 SU25(日最高温高于 25 摄氏度的天数)、冰日 ID0(日最高温低于 0 摄氏度)、热带夜 TR20(日最低温高于 20 摄氏度);也有基于百分位的,比如冷夜百分比 TN10p(日最低温低于第 10 百分位的天数占比)、暖夜百分比 TN90p(日最低温高于第 90 百分位的天数占比),还有代表极端强度的指标,比如月最大日最高温 TXx、月最小日最低温 TNn。只研究温度就只勾温度相关的指数,只研究降水就只勾降水相关的,取消不必要的勾选能明显缩短计算时间。
计算过程需要遍历每一天做百分位比较和统计汇总,几十年的日值数据在当时的 PC 上要跑一阵子,现在的新机器基本是几秒到十几秒的事。计算期间不要关闭窗口,等它弹出完成提示。
4.4 输出文件与趋势可视化
计算完成后,RClimDex 会在当前目录下创建 indices 子目录,里面每个指数一个 CSV 文件,文件名形如 DEMO01_TN10p.csv,内容按年份排列,逗号分隔。同时还会创建 plots 子目录,存放每个指数的年度序列图,JPEG 格式,文件名规则一样只是扩展名不同。每张图上画了两条趋势线:实线是普通最小二乘线性回归趋势,虚线是局部加权回归平滑线。线性趋势的拟合统计量直接标在图上,包括斜率、显著性等信息,方便直接引用。
这里我要提醒一个文件格式细节:输出 CSV 的扩展名在早期版本里写的是 .cvs,拼写和标准 .csv 不一样,但内容就是逗号分隔的文本。用 Excel 或 read.csv() 打开时如果发现文件关联不对,手动改成 .csv 或用文本编辑器打开即可,不影响数据内容。plots 里的图可以直接用于报告初稿,但如果要投稿,我一般会用原始 CSV 数据在 R 里重新画一遍,因为默认图的分辨率和字体样式在正式出版物里不太够用。
5. RClimDex 避坑记录:启动崩溃、基准期边界与数据格式
5.1 数据第一年等于基准期第一年,程序直接停
现象:数据文件从 1961 年开始,基准期也填 1961–1990,程序运行到某个百分位温度指数时直接停止,有的环境里报数组越界,有的环境里什么错都不报就是不动了。
原因:部分百分位指数的计算需要基准期边界之外的数据来构建平滑窗口。当数据起点恰好等于基准期起点时,窗口的左侧没有数据可用,计算就断了。
解决:在输入文件开头添加基准期开始前一天的一条缺失记录。比如基准期 1961 年、数据也从 1961 年开始,就在文件第一行写1960 12 31 -99.9 -99.9 -99.9。这条记录不会被算进任何指数统计,只负责给窗口计算垫底。
5.2 离群值标记不等于自动剔除
现象:QC 跑完后打开离群值清单,里面标了十几个点,但计算出的指数序列里那些极端值还在,看起来 QC 没起作用。
原因:QC 的三步处理里,只有缺失值和不合理值会被替换成 NA,离群值只是被标记,QC 后的数据文件里原样保留。这是设计如此,因为自动判定离群值可能有误,不该直接改数据。
解决:人工核对离群值清单,确认是错误值的,去改原始数据文件,然后重新跑 QC;或者直接编辑 QC 后数据文件,把确认错误的值改成 -99.9 再进入指数计算。
5.3 改了原始数据却不重跑 QC,结果纹丝不动
现象:花力气把原始数据文件里的错误值修好了,然后直接点指数计算,出来的结果和修改前一模一样。
原因:指数计算读取的是 QC 生成的数据文件,不是原始输入文件。原始文件在 QC 之后不会再被读取,你的修改根本没进入计算链路。
解决:每次修改原始数据后,必须重新走一遍加载数据与 QC 流程,让 QC 后数据文件刷新,再算指数。这是最容易忽略的一步,我在这上面翻过车,白白浪费了一晚上排查为什么改完没反应。
5.4 慢速机器上 QC 看似卡死
现象:点下 OK 后,界面长时间无响应,进度条也没有,看起来像程序挂了。
原因:离群值判定要遍历每一个日期,对每个日期计算气候均值和标准差,数据量大的站点在配置低的 PC 上跑几分钟很正常。
解决:看 R 控制台是不是还在持续滚动输出信息,如果是,就耐心等;不要在 QC 期间反复点菜单或关闭窗口。当年的手册明确提到这个预期,放到今天的新机器上,这个环节通常几秒就结束,但旧设备上仍然可能遇到。
5.5 加载失败且报错:先查输入格式
现象:选择数据文件后,R 控制台弹出一段错误信息,基本上是加载失败,程序停在原地。
原因:最常见的两个原因,一是文件列数不对,比如日期写成年月日加时分秒的组合,把六列变成了七列;二是缺失值编码不统一,有的写 -99.9,有的写 -9999,有的直接空白。
解决:对照示例数据逐列检查,确保每行六列、分隔符统一、缺失值全部用 -99.9。第一次跑业务数据之前,最好先用一个已经验证过的样例文件跑通全流程,再换成自己的数据,这样能快速区分是程序问题还是数据问题。
6. 用一份模拟数据走通全流程:验证方法与一个常用技巧
准备一份测试文件 DEMO01.txt,按标准格式放好,首行补齐 1960 年 12 月 31 日的缺失行。在 R 控制台里依次执行加载和数据读取验证。
# 加载 RClimDex 源码,路径按实际位置调整 source("D:/tools/rclimdex/rclimdex.r") # QC 完成后,读取 QC 后数据,检查缺失值转换是否生效 qcd <- read.csv("log/DEMO01indcal.csv", header = TRUE) # 查看数据结构 str(qcd) # 统计降水和温度的缺失值数量 sum(is.na(qcd$prcp)) sum(is.na(qcd$tmax))读入 QC 后数据后,重点确认三件事:日期列是否被正确解析、每列类型是否符合预期、缺失值数量是否和原始文件里的 -99.9 数量一致。如果缺失值数量对不上,说明 QC 阶段有人工替换或格式问题,先回去查数据。接下来计算指数,然后读取输出。
# 读取某个指数的输出 fd <- read.csv("indices/DEMO01_FD.csv", header = TRUE) # 行数应等于数据覆盖的总年数 nrow(fd) # 画快速序列图,检查形态是否正常 plot(fd[, 2], type = "l", main = "FD0 快速检查")这里有一个我常用的验证技巧:手动抽一年,用 R 直接统计该年日最低温低于 0 摄氏度的天数,和 FD 输出文件里对应年份的值比对。如果两者一致,说明整条链路的数据传递没有出错,后面用结果做趋势分析也更有底气。那次对比让我在一个数据拼接错误被掩盖的情况下抓住了问题,从那以后我每次拿到新站数据,不管多急,都强制先跑一遍 QC、看一眼 log 目录里的 PDF 再算指数。这个习惯帮我挡掉过好几次数据错误引发的后续分析翻车,希望帮到你。
本文还有配套的精品资源,点击获取