如何计算栅格堆栈的变化百分比?

tib*_*ibi 2 statistics r raster time-series

我有一个土地覆盖地图的栅格堆栈(年度时间序列),我想计算变化的百分比。我发现了这个问题,但我不清楚。有什么想法如何做到这一点?

假设我的栅格堆栈名为r_stk,目前我计算的唯一统计数据是sdcv

关于如何计算百分比变化有什么想法吗?

r_stk_sd<-calc(r_stk, fun=sd)
r_stk_cv<-r_stk_sd/r_stk_Mean
Run Code Online (Sandbox Code Playgroud)

Rob*_*ans 5

这是一些示例数据。从?raster::stack

library(raster)
s <- stack(system.file("external/rlogo.grd", package="raster")) 
Run Code Online (Sandbox Code Playgroud)

我知道你已经这样做了

 mn <- mean(s)
 sd <- calc(s, sd)
 cv <- sd / mn
Run Code Online (Sandbox Code Playgroud)

现在您想要“%更改”,但您没有定义它。请编辑您的问题,并更好地解释您想要计算的内容。您是否想要进行本地更改(逐个单元地进行);但如果是这样,你会如何计算百分比?或者您想要全局的(每一层/时间段一个数字)。您想对所有时间段进行相互比较吗?或者??

这里还有另一种可能性,将第一层与所有其他层进行比较。也许这可以让你开始做你想做的事,或者提出更好的问题。

x <- s[[1]] != s[[-1]]
Run Code Online (Sandbox Code Playgroud)

细胞有变化吗?

y <- any(x)
Run Code Online (Sandbox Code Playgroud)

相对于第一年发生变化的细胞总比例是多少?

cellStats(y, "mean")
#[1] 0.7923364
Run Code Online (Sandbox Code Playgroud)

或者相对于第一年的每个“年”。

cellStats(x, "mean")
#    green      blue 
#0.6218336 0.7891218 
Run Code Online (Sandbox Code Playgroud)

如果你想要逐年改变,你可以这样做

 s1 <- s[[2:nlayers(s)]]
 s2 <- s[[1:(nlayers(s)-1)]]
 z <- s1 != s2
 cellStats(z, "mean")
 #     green      blue 
 # 0.6218336 0.7672624 
Run Code Online (Sandbox Code Playgroud)