如何在R语言中计算格点尺度的3个月SPI与SPEI?
格点尺度3个月SPI/SPEI计算修正方案
原代码存在的问题
- 变量名不匹配:读入数据存为
spigrid,但循环里用了未定义的data,直接会报错 - 未初始化结果存储容器:直接用
spi[[i]]赋值,但spi没被定义为列表 - 计算对象错误:循环中每次传入整个数据集,而非当前要处理的格点列
- 条件判断未生效:判断列名含"X"后,仍用整个数据集计算,逻辑不对应
修正后的可运行代码
library(SPEI) # 读入格点数据,替换为你的实际文件路径/名称 spigrid <- read.csv("Data.csv") # 初始化空列表存储每个格点的SPI结果 spi_results <- list() # 遍历所有列,只处理列名含"X"的格点列 for (i in 1:ncol(spigrid)) { current_col <- colnames(spigrid)[i] if (grepl("X", current_col)) { # 提取当前格点的时间序列 grid_ts <- spigrid[, i] # 计算3个月尺度SPI spi_results[[current_col]] <- spi(grid_ts, scale = 3, kernel = list(type = 'rectangular', shift = 0), distribution = 'Gamma') } } # 若需计算SPEI,参考以下代码(需确保输入为P-PET序列) # spei_results <- list() # for (i in 1:ncol(spigrid)) { # current_col <- colnames(spigrid)[i] # if (grepl("X", current_col)) { # # 若原始数据只有降水,需先调用pet()函数计算潜在蒸散,再得到P-PET # ppets_ts <- spigrid[, i] # 替换为你的P-PET序列 # spei_results[[current_col]] <- spei(ppets_ts, scale = 3, # kernel = list(type = 'rectangular', shift = 0), # distribution = 'log-logistic') # } # }
重要提示
- 数据格式要求:每一列对应一个格点的月时间序列(行按时间顺序排列)
- SPEI计算前提:必须输入**降水减潜在蒸散(P-PET)**的序列,若只有降水数据,可使用
SPEI包的pet()函数(需温度、纬度等参数)先计算潜在蒸散 - 结果使用:
spi_results是列表,通过列名(如spi_results$X01)可获取对应格点的SPI结果,包含拟合参数、SPI值等完整输出
内容的提问来源于stack exchange,提问作者Abew
相关产品推荐
相关产品推荐

