R语言:基于thornthwaite方法计算得出的SPEI求和结果为INF

问题遇到的现象和发生背景

在使用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写完后 出现部分月份的空值 而且每个站点都不同 请问是什么原因啊 原始数据也没有缺失