我从MODIS terra和Sentinel 2数据建模NDVI时间序列。
为了获得连续的NDVI值(需要对植物物候学进行推断),我借助于包phenex
(modelNDVI
函数)将曲线拟合到我的数据中。方法" 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)
以及包含Deriv
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)
我将控制台的输出反馈回函数并再次运行。不幸的是,生物量变化率的值似乎不是很有说服力(Spline非常小的值和DL非常高的值)。我不是最伟大的数学家,因此非常感谢任何帮助