O estimador de Theil-Sen de um conjunto de pontos bidimensionais (\(x_i\), \(y_i\)) é a mediana m das inclinações \({(y_j – y_i)}/{(x_j – x_i)}\) determinadas por todos os pares de pontos amostrais. Sen (1968) estendeu essa definição para lidar com o caso em que dois pontos de dados têm a mesma coordenada x. Na definição de Sen, toma-se a mediana das inclinações definidas apenas a partir de pares de pontos com coordenadas x distintas.
\[ \text{Sen's Slope} = \text{mediana}(x_j - x_i), \forall i < j \] em que \(x_j - x_i\) são os dados na série histórica do tempo i e j.
Considerando n número de pontos dos dados, então
\[N = \frac{n(n-1)}{2}\] onde N é o o número calculado de estimativas da inclinação.
A inclinação de Sen’s slope é dada como a mediana do número de N por meio da inclinação. Se N é par \([(N+1)/2]\), caso seja Ãmpar \([(N/2) + ((n/2)/2)]/2\)
SenSlopeRaster <- function(rasterstack) {
print(paste("Iniciando SenSlopeRaster:", Sys.time()))
layers <- nlayers(rasterstack)
ncell <- ncell(rasterstack)
ncol <- ncol(rasterstack)
nrow <- nrow(rasterstack)
crs <- crs(rasterstack)
extent <- extent(rasterstack)
pb <- txtProgressBar(min = 0, max = ncell, initial = 0)
print("Parâmetros carregados")
mtrx <- as.matrix(rasterstack, ncol = layers)
empt <- matrix(nrow = ncell, ncol = 1)
print("Iniciando loop de cálculo do Sen Slope")
for (i in 1:ncell) {
y <- mtrx[i, ]
if (all(is.na(y)) || sum(!is.na(y)) < 3) {
empt[i, 1] <- NA
} else {
y <- na.omit(y)
SenSlope <- sens.slope(y)$estimates
empt[i, 1] <- SenSlope
}
setTxtProgressBar(pb, i)
}
SenSlope_raster <- raster(nrows = nrow, ncols = ncol, crs = crs)
extent(SenSlope_raster) <- extent
values(SenSlope_raster) <- empt[, 1]
print(paste("Sen Slope calculado com sucesso. Fim da função em", Sys.time()))
return(SenSlope_raster)
}
Como executar:
#sen_slope <- SenSlopeRaster(pilha_raster)
Testando:
## Carregando pacotes exigidos: sp
# Calculando o Sen Slope para cada pixel usando a função SenSlopeRaster
sen_slope <- SenSlopeRaster(Conjunto)
## [1] "Iniciando SenSlopeRaster: 2023-05-24 18:14:59.070628"
## [1] "Parâmetros carregados"
## [1] "Iniciando loop de cálculo do Sen Slope"
## ================================================================================[1] "Sen Slope calculado com sucesso. Fim da função em 2023-05-24 18:15:54.97461"
# Resultado
plot(sen_slope)