运行和的R函数

flvlnr44  于 2023-09-27  发布在  其他
关注(0)|答案(4)|浏览(81)

由于没有R软件包,我有一个关于创建自己的函数来计算SAPEI指数的问题-s标准化aintecedentp降水量e蒸散量index(“A standardized index for assessing sub-monthly compound dry and hot conditions with application in China”by Li et al.,2021)。据我所知,要计算SAPEI指数,我需要首先计算每个日历日的降水量和PET(如3个月尺度)之间的累积日差。
计算公式如下:

我所做的:

WSD <- function(P, PET, n){
 
  wat_bal <- P - PET
  
  for(i in (n+1):length(wat_bal)){ 
   
    condition = ifelse(wat_bal > 0, "wet", "dry")

    return(data.frame(wat_bal, condition))
  }
}

不幸的是,我没有得到预期的结果。我知道我的功能还没有完成,但我也不知道如何继续下去。特别是 n(前几天的数量)是一个问题。有人能帮我吗?
非常感谢你提前法比安

y1aodyip

y1aodyip1#

@MikkoMarttila不幸的是,cumsum()函数没有工作,只是每天累积值。也许我会引用这篇文章的一部分:“[.]计算了降水量和潜在蒸散量之间的日差,以估计水量平衡。为了反映给定日期的干和湿条件,通过以下等式计算前期水盈余或赤字(WSD):(见上文),其中n是先前天数,PET代表潜在蒸散量,P代表降水量。WSD值可以在不同的时间尺度上聚合,例如3个月、6个月、9个月等。[...]”(Li等人,2021年)。

WSD <- function(P, PET, n){
 
  wat_bal <- cumsum(P - PET)
  
  for(i in (n+1):length(wat_bal)){ 
   
    condition = ifelse(wat_bal > 0, "wet", "dry")

    }
   return(data.frame(wat_bal, condition))
}
qltillow

qltillow2#

根据你对算法的描述,听起来你可以这样做:

wsd <- cumsum(p - pet)
vcirk6k6

vcirk6k63#

这可能是解决方案:

WSD <- function(P, PET, n){
    
    lag_sum = 0
    wat_bal = P - PET
 
  for(i in 1:n){ 
    
  lag_sum = lag_sum + lag(wat_bal, i)
   
    }
   return(lag_sum)
}

3pmvbmvn

3pmvbmvn4#

您可以使用filter()函数来实现这一点。

WSD <- function(P, PET, n){
  # This generates WSD with a backwards looking window of n observations
  # Result is a time-series object
  wat_bal <- filter(P - PET, filter = rep(1, n), method = "convolution", sides = 1)

  # Convert to vector, if so desired
  wat_bal <- as.vector(wat_bal)
  
  # Produce the desired result
  data.frame(wat_bal = wat_bal, condition = ifelse(wat_bal > 0, "wet", "dry"))
}

除了做你想做的事情之外,它还可以根据与要计算的值的距离将权重(上面示例中的所有1都是为了求和)应用到过滤器,这在水平衡研究中是典型的,所以这个函数可能对你更感兴趣。

相关问题