我正在处理NDVI Time-Series一年内有 23 个观察值的数据。我能够检测到 14 - 19 次观察之间出现的峰值。现在我想找到山顶的起点和终点。我可以通过使用“diff()”查找符号变化来找到峰值的开始和结束。但在某些情况下,我注意到能够找到终点,因为高峰期的终点是在明年。解决方案是在 23 次观察后重复这些值,使其循环并找到终点。
下面给出的例子将详细说明问题
x = c(250.7943,292.2904,340.459,368.811,363.4534,330.2302,291.6527,275.2815,299.9305,367.0331,461.2618,559.0772,639.6197,691.723,713.9833,709.5409,680.4415,626.1153,547.0395,450.4623,353.0839,277.257,241.597)
Run Code Online (Sandbox Code Playgroud)
我正在寻找从峰值到两个方向的符号变化,并且能够在 8 个观察点找到峰值的起点,但是当我寻找从峰值开始的终点时,我直到 23 号才发现任何变化。在这种情况下,我应该在 23 处得到峰值。如表所示,我已在 Excel 中手动重复这些值以获得符号更改。
在 R 中如何做到这一点???
一种解决方案可能是设置一个条件来检查是否在第 23 个观察之前未发现符号变化,然后将所有 23 个值填充到向量的末尾,然后查找符号变化。
有没有一种简单的方法可以实现这一点???
另一种可能性:(1)用超前和滞后填充您的值,Inf以在时间序列的开始和结束时创建虚拟局部最小值*。(2) 查找所有最小值(包括虚拟变量)的索引。(3) 找到与最大值相邻的两个最小值的索引。
# pad values with Inf and get indexes of all local minima
i.mins <- which(diff(sign(diff(c(Inf, x, Inf)))) == 2)
# index of max value
i.mx <- which.max(x)
# combine indexes of local minima and the max
i <- sort(c(i.mins, i.mx))
# select the two minima on either side of the max
ix <- i[which(i == i.mx) + c(-1, 1)]
ix
# [1] 8 23
Run Code Online (Sandbox Code Playgroud)
plot(x, type = "b")
points(x = c(ix[1], i.mx, ix[2]),
y = c(x[ix[1]], max(y), x[ix[2]]),
col = c("blue", "red", "blue"), pch = 19, cex = 2)
Run Code Online (Sandbox Code Playgroud)
*参见例如查找局部最大值和最小值
| 归档时间: |
|
| 查看次数: |
3398 次 |
| 最近记录: |