在使用SPEI包计算某地区多年SPEI空间分布的值时,我对某一年的数据(数据类型为数组)进行了求和,发现结果为INF(无穷大,一共33年,只有部分年如此,因此我怀疑并不是代码出错)。
##计算SPEI
library(SPEI)
lat = seq(38.5, 53.75, 0.25)
pet = array(NA,c(66,62,408)) ##栅格水平上的PET,mondata
for(i in 1:66){
for(j in 1:62){
if (is.na(tas[i,j,1]) == T) {
pet[i,j,] = NA
}else{
pet[i,j,] = thornthwaite(tas[i,j,], lat[j])
}
}
}
SPEI3 = array(NA,c(66,62,408))
for(i in 1:66){
for(j in 1:62){
if (is.na(pet[i,j,1]) == T){
SPEI3[i,j,] = NA
}else{
a = spei(pr[i,j,] - pet[i,j,], 3) ##3个月时间尺度
SPEI3[i,j,] = a$fitted
}
}
}
dim(SPEI3) ##SPEI三维数据,第三维度为时间维
[1] 66 62 396
sum(SPEI3[,,16],na.rm=T) ##对第16个时间单位的SPEI3求和,结果为无穷大
[1] Inf
我初步怀疑是计算SPEI值时,本身就存在INF,因此我将数组以CSV的形式保存,在excel中查看,发现并无INF。并且在EXCEL上进行求和运算,得出结果并不是INF,而是有限数大小。
我尝试使用nc数据进行保存,但是结果在写入数据时出错。
spei = ncvar_def(name = 'spei', units = ' ',
dim = list(longitude,latitude,t),
missval = NA, prec = 'float' ) ##创建变量spei
ncnew = nc_create(filename = 'spei_mon_CNE_CN05.1_1982_2014.nc',
vars = spei) ##创建nc数据,命名为spei_mon_CNE_CN05.1_1982_2014.nc',只包含1个数据变量spei
ncvar_put(nc = ncnew, varid = spei,
vals = SPEI3 ) ##写入数据
Error in Rsx_nc4_put_vara_double: NetCDF: Numeric conversion not representable
Error in ncvar_put(nc = ncnew, varid = spei, vals = SPEI3) :
C function Rsx_nc4_put_vara_double returned error
查阅了写入nc的相关错误,发现在cdo处理时也存在该问题(https://code.mpimet.mpg.de/boards/1/topics/5194;https://blog.csdn.net/weixin_44237337/article/details/122359820)。有人解释说添加"-b F64" 可以解决,似乎是提高了精度。
cdo -b F64 mergetime tep.*.nc merge.nc
我现在怀疑是数据精度的问题,但不清楚该如何解决?求解。
清除一下缓存重新运行
我也有出现lnf的问题,之前用同样代码计算别的时间段的spei却没问题。估计是数据方面的问题,但真的找不到,确定数据没有空值
我的SPEI写完后 出现部分月份的空值 而且每个站点都不同 请问是什么原因啊 原始数据也没有缺失