用phenex样条和双逻辑曲线拟合建模的NDVI时间序列的第一个推导

时间:2018-03-16 13:31:47

标签: r spline derivative

我从MODIS terra和Sentinel 2数据建模NDVI时间序列。 为了获得连续的NDVI值(需要对植物物候学进行推断),我借助于包phenexmodelNDVI函数)将曲线拟合到我的数据中。方法" spline"和"双重物流"到目前为止表现最佳,这与各自的文献一致,所以没有问题。

我现在想要计算NDVI随时间的变化,以便获得生物量变化率的测量值。这可以通过计算NDVI时间序列的一阶导数(在0和1之间缩放的值)来实现。因此,我需要推导出用于模拟NDVI值的函数。而这一切都变得有点不稳定。这是我到目前为止所做的:

我从modelNDVI

获取了两个phenex方法的源代码

样条

spline <- function(ndvi){
      days <- length(ndvi)

      f <- splinefun(x=(-days+1):(2*days), y=c(ndvi,ndvi,ndvi), method="monoH.FC")
      ndvi.interpol <- f(1:days)

      ndvi.interpol[which(ndvi.interpol < 0)] <- 0
      ndvi.interpol[which(ndvi.interpol > 1)] <- 1

      return(ndvi.interpol)
    }

双重逻辑

DL <- 
  function(ndvi){
    days <- length(ndvi)

    time <- which(!is.na(ndvi)) 
    ndvi <- ndvi[time]

    Wt <- function(vb,ve,k,p,d,c,q, time) {
      erg <- vb + (k/(1+exp(-c*(time-p)))) - ((k+vb-ve)/(1+exp(-d*(time-q))))
      return(erg)
    }

    Wx <- function(x, time, ndvi){
      erg <- sum((Wt(vb=x[1], ve=x[2], k=x[3], p=x[4], d=x[5], c=x[6], q=x[7], time)-ndvi)^2)
      return(ifelse((is.infinite(erg)||is.nan(erg)),1e50,erg))
    }


    model <- DEoptim(fn=Wx, time=time, ndvi=ndvi,
                     lower=c(0,0,0,1,0,0,1),
                     upper=c(1,1,1,days,1,1,days),
                     control=list(VTR=0, strategy=1, NP=200, itermax = 200, trace=FALSE, CR=0.9))

    vb <- model$optim$bestmem[1]
    ve <- model$optim$bestmem[2]
    k <- model$optim$bestmem[3]
    p <- model$optim$bestmem[4]
    d <- model$optim$bestmem[5]
    c <- model$optim$bestmem[6]
    q <- model$optim$bestmem[7]
    model.interpol <- Wt(vb,ve,k,p,d,c,q, time=1:days) 

    return(model.interpol)
  }

我尝试了以下方法来获得相应函数的一阶导数:

 f <- splinefun(x=(-days+1):(2*days), y=c(ndvi,ndvi,ndvi), method="monoH.FC")
          ndvi.interpol <- f(1:days, deriv = 1)

Graph of spline curve and curve of first derivative thereof

以及包含Deriv

的DL
Wt <- function(vb,ve,k,p,d,c,q, time) {
vb + (k/(1+exp(-c*(time-p)))) - ((k+vb-ve)/(1+exp(-d*(time-q))))
}
Deriv(Wt)

graph of DL curve and first derivative thereof

我将控制台的输出反馈回函数并再次运行。不幸的是,生物量变化率的值似乎不是很有说服力(Spline非常小的值和DL非常高的值)。我不是最伟大的数学家,因此非常感谢任何帮助

0 个答案:

没有答案