简介:RClimDex(极端气候指数计算软件)用户手册,面向气候科学研究者、气象数据分析人员及高校相关专业师生,用于在 R 环境中完成极端气候指数的计算与变化检测。手册系统说明软件安装与运行、数据质量控制、指数计算流程及已知问题反馈,并附有可用气候指数清单、输入数据格式、各指数定义与算法说明,以及 Windows 下 R 常见问题解答,便于读者按附录逐项对照上手。压缩包内共 1 个 doc 文档,约 600KB,即该手册的完整英文原版,适合边操作边查阅。目前已有 3839 人学习下载,是入门 RClimDex 与规范处理气象序列数据的实用参考。
1. 极端气候指数计算软件不是点一下出图:RClimDex 1.0 先解决数据入口问题
极端气候指数计算软件 RClimDex 1.0 的入门门槛不在公式,而在数据入口:一份逐日气象文本如果列顺序、缺测编码或基准期没对齐,后面的 27 个指数全都会歪。它适合手里已经有逐日降水、最高温、最低温序列,需要按统一口径算 FD0、SU25、TX90p、R95p 这类指标的人;不适合拿月值或年值来硬套。
我见过最容易翻车的一步,是把它当成独立安装的图形软件,双击就想出结果。实际拿到的是一套 R 脚本加图形菜单,先有 R 环境,再 source 脚本,再走 QC 和指数计算两条流程,顺序错了后面全是无用功。
这一章先把边界说清:它做质量控制、核心指数计算和出图,不做数据均一化,也不替你判断异常值该不该改。适合做单站复现、课程实验和批量站点前的模板验证。
2. 把 R 环境和 rclimdex.r 跑通:从 source 命令到主菜单出现的四步
RClimDex 1.0 的运行方式很朴素:R 控制台加载rclimdex.r,脚本把图形菜单挂出来。手册对应 R 1.84 及以后版本,较新的 R 默认带 TclTk,早期版本可能要单独装。很多人卡在“脚本加载了但菜单没出来”,多半不是脚本坏,而是工作目录、路径空格或图形组件没就位。下面按我平时复现的顺序走,先保证 R 能启动,再保证脚本能被找到,最后才谈数据。
2.1 R 版本与 TclTk 依赖:为什么老手册总强调图形界面
RClimDex 的交互入口是 TclTk 图形窗口,不是纯命令行参数。R 环境装好之后,先确认两件事:R 能正常启动,图形界面组件能弹窗。较新的 R 安装包通常默认包含 TclTk;如果用的是很早的版本,或者安装时裁掉了图形组件,执行加载后可能只在控制台报错,菜单不出现。
我的做法是先开一个干净的 R 会话,不加载任何额外包,执行一条最简单的弹窗测试。能弹窗,说明图形组件可用;不能弹窗,先修 R 安装,不要急着改rclimdex.r。这一步看似笨,但能省掉后面“到底是脚本问题还是环境问题”的拉扯。
# 先确认当前 R 会话能正常启动 R.version.string # 测试 TclTk 图形组件是否能弹窗 # 能弹出窗口说明图形环境可用;报错则先修 R 安装或图形组件 library(tcltk) tk_messageBox(type = "ok", message = "TclTk OK")这段代码只做环境体检。R.version.string用来看当前 R 版本,后面排查“老脚本在新 R 上行为不一致”时有对照价值。library(tcltk)是加载图形组件,tk_messageBox是弹窗测试;如果这里就失败,说明问题在 R 安装层,不在 RClimDex 脚本层。参数上没有需要调的,重点看报错信息里是找不到包,还是图形显示不可用。
2.2 本地 source 与菜单加载:两条路径与工作目录设置
加载脚本有两条常见路径:控制台执行source("rclimdex.r"),或者从图形菜单里选“Source R code”再挑文件。两条路径本质一样,差别在路径解析。控制台路径相对当前工作目录,菜单路径一般按你选中的文件走。我一般先把工作目录切到脚本所在目录,再用相对路径加载,避免脚本内部再去找别的文件时跑偏。
工作目录里不要有中文、空格和特殊符号。不是脚本一定不支持,而是老脚本在不同平台上的路径处理很容易出玄学问题。一个稳妥习惯是:建一个纯英文目录,把rclimdex.r和待处理数据分开放,脚本目录放脚本,数据目录放stationA.txt这类输入文件,日志和结果让脚本自己建子目录。
# 把工作目录切到脚本所在目录,路径按自己的目录替换 setwd("D:/climate_work/rclimdex_demo") # 确认当前目录和文件是否存在 getwd() file.exists("rclimdex.r") # 加载脚本,成功后应出现 RClimDex 主菜单 source("rclimdex.r")setwd()的参数是脚本所在目录,建议用正斜杠或双反斜杠。getwd()用来确认没有切错盘符。file.exists("rclimdex.r")返回TRUE再执行source,比直接 source 后看一屏报错更清楚。source()的参数是脚本文件名;如果脚本不在当前目录,就写完整路径,但完整路径里尽量别带空格。加载成功后主菜单会出现,没出现就回到控制台看第一条报错,不要从最后一行倒着猜。
2.3 加载失败的排查顺序:路径、编码、包冲突
加载失败我按固定顺序查:先看工作目录,再看文件名大小写,再看脚本编码,最后看是否有同名函数或旧会话残留。R 对文件名大小写敏感,Rclimdex.r和rclimdex.r在两个平台上可能一个找一个不找。脚本编码如果是本地编码保存的,在某些 R 会话里读进去会出乱码,菜单文字可能变成问号,甚至解析中断。
旧会话残留也常见。上一次加载到一半报错,变量还留在环境里,第二次再 source 就可能出现函数覆盖或重复定义。我的习惯是每次重来先清空对象,再重新 source。不要一边改脚本一边在同一个会话里反复 source,出了问题很难判断是新代码还是旧对象。
# 清空当前会话对象,避免旧脚本残留干扰 rm(list = ls()) # 重新确认目录和脚本 getwd() file.exists("rclimdex.r") # 重新加载 source("rclimdex.r", encoding = "UTF-8")rm(list = ls())清空当前环境对象,不影响磁盘文件。encoding = "UTF-8"是给脚本读取指定编码;如果脚本本身不是 UTF-8,改成实际编码,或者用编辑器另存为 UTF-8 再试。这个参数不是万能药,路径错误时它救不了,所以前面两步必须先过。加载成功后不要急着点数据,先看主菜单是否完整,菜单项缺失往往还是图形组件或脚本版本不匹配。
注意:RClimDex 1.0 是脚本加载式工具,不是双击安装的独立程序;先跑通 R 和 TclTk,再谈数据格式。
3. 数据质量控制:-99.9、负降水与 TX<TN 在计算前怎么被拦下
RClimDex 的 QC 不是可选项,手册明确要求先做质量控制再算指数。它处理三类问题:缺测值-99.9转成 R 认识的NA;不合理值转成NA,包括负降水和日最高温小于日最低温;温度异常值按“当日气候平均加减 n 倍标准差”标记。这里最容易误解的是“标记”和“修改”不是一回事:异常值只被标出来,不会被自动改掉,QC 后的数据文件里仍然保留原值。下面把输入格式、n 值、日志文件和重跑规则拆开。
3.1 输入格式与缺测编码:stationname.txt 的列结构与日期边界
输入文件名一般用stationname.txt,内容按手册附录 B 的列顺序组织。常见逐日格式是年、月、日、降水、日最高温、日最低温,文件里不放表头,缺测统一写-99.9。不同版本的示例数据可能在列数上有差异,但核心是让脚本按固定位置读列,而不是按列名猜。你拿到的数据如果来自表格软件,先另存为纯文本,再检查有没有逗号、制表符混用。
日期边界要特别注意。QC 和指数计算都依赖连续日序,缺一天不会自动补,月末日期写错会直接把后面列值错位。我的做法是先用 R 读一遍前几行和尾几行,确认列数、缺测编码和日期范围,再进图形菜单。不要小看这一步,列错位导致的“异常值”弹窗,十有八九不是气候异常,而是数据入口歪了。
# 读取输入文件前几行,确认列数、缺测编码和日期范围 # 这里假设无表头,列顺序为 YEAR MONTH DAY PRCP TMAX TMIN raw <- read.table("stationA.txt", header = FALSE, fill = TRUE) head(raw, 5) tail(raw, 5) dim(raw)read.table()的header = FALSE对应无表头输入,fill = TRUE只是防止列数不齐时直接中断,方便先看问题。head()和tail()看首尾日期,dim()看总行数和列数。参数上,如果你的文件是逗号分隔,要改用sep = ",";如果是制表符,用sep = "\t"。这一步不替代正式 QC,只是提前发现列错位、空行和编码问题,减少后面弹窗的误判。
3.2 异常值窗口里的 n 值:默认 3 为什么要先试 4
温度异常值判定用“当日气候平均 ± n 倍标准差”,n 默认是 3。手册里给了一个很实用的提醒:3 可能标出大量值,用户可以先用 4 起步。原因不复杂,逐日温度序列在样本少、季节波动大或缺口多的时候,3 倍标准差会显得很紧,边缘年份和极端天气容易被大量标记。标出来的值不是让你全改,而是让你抽查。
我一般先填 4 跑一遍 QC,看日志里异常值清单的长度和分布。如果清单集中在某些年份或某些月份,先查数据源和录入问题;如果清单很分散且数值本身合理,再考虑是否收紧到 3。n 不是越小越严格越好,它只是筛查尺度。真正要改数据,还是回到原始文件改,再重新跑 QC,不要在 QC 输出文件上随手改完就算完。
注意:n 值影响的是“标记范围”,不是自动清洗强度;异常值是否修改由你根据原始记录判断。
3.3 log 目录四类输出:QC 后数据、异常清单与四张 PDF
QC 跑完后,log子目录里会留下几类文件:温度不合理值清单、降水不合理值清单、温度异常值标记清单,以及供指数计算用的 QC 后数据。手册里对应的是tempQC.csv、prcpQC.csv、tepstdQC.csv、indcal.csv这一类命名,实际文件名会带站点前缀。前两个清单帮你定位负降水、TX<TN 这类硬错误,第三个清单列出被标记的异常值及日期,最后一个才是后续指数计算的输入。
同时还会出四张 PDF 时间序列图,缺测值用红点标出,分别看降水、最高温、最低温、日温差。PDF 图不是装饰,它最适合看缺口和断裂:某些年份整段空白,或者某个季节突然密集红点,往往比表格更直观。我的习惯是先翻四张图,再打开异常值清单,最后才决定要不要动原始数据。不要一上来就改indcal.csv,因为原始输入文件没有被改动,你改输出文件只会让下一次重跑对不上。
| 输出类型 | 主要看什么 | 处理方式 |
|---|---|---|
| 温度不合理值清单 | 最高温小于最低温、缺测编码错位 | 回原始文件改,再重跑 QC |
| 降水不合理值清单 | 负降水、非数值字符 | 回原始文件改,再重跑 QC |
| 温度异常值标记清单 | 被 n 倍标准差标出的日期和值 | 抽查原始记录,决定是否修改 |
| QC 后数据文件 | 缺失值和不合理值已转NA,异常值仍保留 | 作为指数计算输入,不随手改 |
| 四张 PDF 图 | 缺测红点、序列断裂、季节缺口 | 先看整体,再看局部年份 |
这张表里最容易被忽略的是最后一行“异常值仍保留”。很多人看到异常值清单里有记录,就以为 QC 后数据已经被修正;实际不是。QC 只把缺失值和不合理值转成NA,被标记的异常值原样留在indcal.csv里。要不要改,得回到原始文件,改完再跑一次 QC,新的结果才会进入指数计算。
# 读取 QC 日志,先看异常值标记清单的规模和日期分布 tepstd <- read.csv("log/stationAtepstdQC.csv") head(tepstd) nrow(tepstd) # 按年份统计被标记的异常值数量,快速看是否集中在某段 tepstd$year <- substr(tepstd[[1]], 1, 4) table(tepstd$year)这段代码里,read.csv()读的是log目录下的异常值清单,文件名按你实际站点前缀替换。head()看列结构,nrow()看标记总量,最后用第一列截取年份做频数统计。参数上要注意第一列是不是日期列;不同输出文件的列名可能不一样,先head()看清再改。这个统计不替代人工判断,只是让你快速知道异常值是全年分散,还是集中在某几年,后者更像数据源或录入问题。
3.4 原始数据回改后的重跑规则
QC 有一个很重要的边界:指数计算用的是 QC 后数据,原始输入文件不会被改动。你如果在原始文件里修正了某些值,必须重新执行“Load Data and Run QC”,让新的 QC 后数据覆盖旧的indcal.csv,否则指数计算还在读旧结果。这个规则听起来简单,实际很容易踩坑:改完原始文件,直接点“Indices Calculation”,结果和没改一样。
我的固定动作是:改原始文件后,先看文件修改时间,再重跑 QC,再看log里的清单有没有减少,最后才进指数计算。批量站点时更要注意,每个站点的log和indices输出都可能混在一起,目录一定要按站点分开。不要在一个目录里反复覆盖,不然出了问题连是哪一版数据都说不清。
4. 27 个核心指数怎么算:基准期、纬度符号与五个自定义阈值
QC 过了之后才进入指数计算。RClimDex 1.0 能算手册附录 A 里的 27 个核心指数,也可以只选需要的。计算前会弹参数窗口,要求填基准期首末年份、站点纬度、日降水阈值 P,以及四个自定义温度阈值。这里的参数不是随便填:基准期决定百分位指数的 in-base 口径,纬度符号决定南北半球的 GSL 计算,P 和四个温度阈值直接决定 Rnn、SUmm、FDmm、TRmm、IDmm 的数值。下面按参数顺序拆。
4.1 基准期与 in-base 百分位:为什么不能拿整段序列直接算
百分位类指数,比如冷夜、暖夜、冷日、暖日,依赖基准期内的日值分布。手册在附录 D 专门讲阈值和 in-base 期温度指数计算,核心意思是百分位阈值要在基准期内算,再应用到整段序列。你不能拿整段序列的分布去定阈值,否则基准期外的极端年份会反过来影响阈值,指数序列的可比性就没了。
基准期首末年份要填完整,不是只填一个起点。常见的坑是数据从基准期首年开始,程序在计算百分位时需要基准期边界外的信息,已知 bug 会让程序停下。手册给的绕行办法是在基准期开始前补一条缺测记录,让数据首年早于基准期首年。这个补记录不是改真实数据,只是给脚本一个边界缓冲,后面 QC 会把它当缺测处理。
注意:基准期不是越长越好,也不是随便截一段;它要和你的研究口径一致,填进去之后不要中途换。
4.2 纬度符号与 GSL 的南北半球口径
纬度参数用来判断站点在哪个半球,南半球填负值。这个符号影响 GSL 生长季长度的计算窗口:北半球按 1 月到 12 月找跨越 6 天的窗口,南半球按 7 月到次年 6 月的口径走。符号填反了,GSL 不会报错,但结果会偏到另一个季节窗口,这种错误最隐蔽。我的习惯是填完纬度先看一眼绝对值是否在合理范围,再看正负号是否符合站点位置。
有些用户会把纬度写成度分秒或者带方向字母,脚本只认十进制度数值。南半球用负数,不要写S。如果你的站点在赤道附近,纬度接近 0,符号影响很小,但也不要省掉,保持参数完整,后面批量复现时不容易乱。
4.3 P、SUmm、FDmm、TRmm、IDmm 五个自定义阈值怎么填
参数窗口里有一个日降水阈值 P,用来算日降水量超过 P 的天数,也就是 Rnn 这一类指标。单位是毫米,填你研究口径需要的阈值,不要填成厘米。四个自定义温度阈值分别对应日最高温和日最低温的上限、下限,手册把它们映射到 SUmm、FDmm、TRmm、IDmm,其中mm是你填的阈值。填的时候不要只看标签,要先确认它用的是 TX 还是 TN。
| 参数位置 | 作用对象 | 常见映射 | 填写要点 |
|---|---|---|---|
| 日降水阈值 P | 日降水 | Rnn | 单位毫米,按研究口径填 |
| 日最高温上限 | TX | SUmm | 日最高温超过该值的天数 |
| 日最高温下限 | TX | FDmm | 日最高温低于该值的天数 |
| 日最低温上限 | TN | TRmm | 日最低温超过该值的天数 |
| 日最低温下限 | TN | IDmm | 日最低温低于该值的天数 |
这张表是填参数时最该放在手边的对照。实际窗口文字可能因版本略有差异,但判断逻辑不变:先看它问的是日最高温还是日最低温,再看是上限还是下限。填错一个,后面指数名对得上,数值含义却变了。批量站点时我一般把五个阈值写在同一个配置表里,逐站核对,避免手填串行。
4.4 指数选择与输出目录:indices 与 plots 的文件命名
参数填完,窗口会列出可计算的指数,默认全选。只算需要的就取消不需要的,选项越多跑得越久。计算完成后,指数序列放在indices子目录,文件格式是逗号分隔的表格,文件名一般是站点前缀加指数名;图放在plots子目录,JPEG 格式,文件名规则相同。图里会画年序列、线性最小二乘趋势线和局部加权回归线,并在图上给出线性趋势拟合统计量。
这里要提醒一句:图上的趋势线是可视化辅助,不是自动结论。序列有缺口、异常值没处理、基准期口径变了,趋势线都可能跟着变。我的做法是先看indices里的数值序列,再对照plots里的图,不要只看图就下判断。
# 检查指数输出目录和文件是否生成 list.files("indices", pattern = "\\.csv$", full.names = FALSE) list.files("plots", pattern = "\\.jpg$", full.names = FALSE) # 读一个指数序列,确认列名和年份范围 tx90p <- read.csv("indices/stationA_TX90p.csv") head(tx90p) tail(tx90p)list.files()用正则筛选 CSV 和 JPG,full.names = FALSE只看文件名,方便核对命名规则。读指数序列时,文件名按实际站点和指数名替换;head()和tail()看年份范围是否覆盖你要求的起止年。如果目录为空,先回控制台看有没有报错,再确认指数选择窗口里是不是全取消了。参数上,pattern只是过滤,不会改变文件本身;文件名对不上时,先看站点前缀是否和输入文件一致。
5. 常见问题排查:基准期首年撞车、异常值误报和慢机等待
RClimDex 的报错不算多,但几个典型问题会反复出现。下面按“现象、原因、解决”记录我踩过的坑,尽量把排查顺序写清楚。遇到问题时不要先改脚本,先看控制台第一条报错和输出目录,大多数问题都能从数据和路径上找到线索。
5.1 基准期首年与数据首年相同:已知 bug 的绕行办法
现象:参数填完一点计算,程序停住或直接退出,控制台没有特别清楚的业务报错。原因:手册明确记录了一个已知 bug,当可用数据的第一年与基准期第一年相同时,百分位类指数计算需要基准期边界外的数据,程序会停止。解决:在输入文件最前面补一条基准期首年减一的缺测记录,让数据首年早于基准期首年。补的记录用-99.9标记缺测,QC 会把它转成NA,不会进入真实统计。
# 在输入文件首行补一条缺测记录,年份取基准期首年减一 # 列顺序按 stationA.txt:YEAR MONTH DAY PRCP TMAX TMIN # 下面只演示写入逻辑,实际文件名和年份按你的数据替换 line <- "1980 12 31 -99.9 -99.9 -99.9" writeLines(c(line, readLines("stationA.txt")), "stationA_fixed.txt")这段代码把一条缺测记录拼到原文件前面,生成新文件,不动原始文件。line里的年份要按你的基准期首年减一填,月日填基准期开始前最后一天;后面三个-99.9对应降水、最高温、最低温。writeLines()会覆盖输出文件,所以输出文件名不要和输入同名。补完之后用新文件重新走 QC,不要直接拿旧 QC 结果算指数。
5.2 弹出“不合理值”但数据看着正常:先查编码与日序
现象:QC 弹窗提示存在不合理值,打开原始文件看,降水没有负数,最高温也不小于最低温。原因:常见是列错位、缺测编码不统一、日期格式错位,或者小数点分隔符不对。比如把-99.9写成了-999,脚本不会把它当缺测,可能当成一个极端低值;再比如某行少了一列,后面的温度列整体前移,TX<TN 就出现了。解决:先用 R 读前几行和尾几行,检查列数和每列取值范围,再查是否有空行、制表符和逗号混用。
排查时不要只看弹窗汇总,要打开log里的不合理值清单,看它标的是哪一天、哪个值。如果错误集中在某一段连续日期,优先怀疑录入或拼接;如果分散在全序列,优先怀疑缺测编码和列顺序。改完原始文件后重新 QC,确认清单减少或消失,再继续。
5.3 计算跑很久或没有输出:看控制台、看目录、看选择项
现象:点了指数计算,界面像卡住,几分钟没有结果;或者等很久后indices目录还是空的。原因:指数选得太多、机器较慢、输出目录没有写权限,或者控制台其实已经报了错但被窗口挡住。手册也提醒过,某些较慢的机器上 QC 可能要几分钟,指数计算根据选择项也可能跑一阵。解决:先把 R 控制台窗口调到前面看最后几行,再确认indices和plots目录是否生成,最后检查是不是全选了不需要的指数。
我的习惯是第一次只选三到五个指数做冒烟测试,确认输出正常,再全选或按需批量。目录权限问题在受控电脑上很常见,工作目录不要放在只读盘或同步盘里。计算过程中不要反复点按钮,重复触发会让输出文件互相覆盖,后面很难判断哪一版是有效结果。
5.4 异常值被标了但没改:QC 输出文件的边界要认清
现象:异常值清单里有记录,打开 QC 后数据发现原值还在,以为 QC 没生效。原因:QC 只把缺测和不合理值转成NA,被标记的异常值不会自动修改,这是手册写明的行为。解决:把异常值清单当抽查列表,回原始文件判断是否修正;修正后重新跑 QC,让新的indcal.csv覆盖旧文件。不要直接在 QC 后数据上改完就算指数,因为下一次重跑 QC 会把你的手改覆盖掉。
这个边界也影响结果解释:如果异常值没处理,指数序列里会保留这些极端值,趋势线可能被拉偏。我的做法是先在日志里标出异常值集中的年份,再决定是回改原始数据,还是在结果说明里注明未修正。无论哪种,都要保持口径一致,不能这个站改、那个站不改。
6. 把 QC 日志当黑匣子读:单站复现的五个验收点与结果抽样
QC 日志不是跑完就丢的中间文件,它更像黑匣子:数据入口有没有歪、异常值集中在哪、缺测红点是不是成片,都能从日志和四张 PDF 里倒推出来。单站复现时,我一般不看“跑完了没有”,而看五个验收点:输入列数、缺测编码、异常值清单长度、QC 后数据年份范围、指数输出文件是否齐全。
| 验收点 | 看什么 | 不通过时的动作 |
|---|---|---|
| 输入列数 | 年、月、日、降水、TX、TN 是否对齐 | 回原始文件查空行和分隔符 |
| 缺测编码 | -99.9是否统一 | 统一编码后重跑 QC |
| 异常值清单 | 标记是否集中在某几年 | 抽查原始记录,决定是否回改 |
| QC 后数据 | 年份范围是否覆盖基准期和计算期 | 补记录或修日期边界 |
| 指数输出 | indices与plots是否成对生成 | 看控制台报错和选择项 |
抽样对照我一般做两步:先挑一个指数,比如 TX90p,看首尾年份数值是否在合理范围;再回原始日值里抽几天,手工核对“超过阈值的天数”能不能对上。这个动作不复杂,但能抓住大部分列错位和阈值填错。批量站点之前,单站必须走完这一遍;不然一个站点的参数错误会被复制到几十个站。
从那以后我每次加载rclimdex.r都先跑环境体检,再按“输入列数、缺测编码、QC 日志、基准期首年、指数抽样”的顺序强制走一遍,不再凭感觉点窗口。需要原始手册附录表时,按资源包内目录找附录 A 到 E,先对列顺序和参数口径,再谈结果。希望帮到你。
本文还有配套的精品资源,点击获取