Также есть zyp.sen
из пакета zyp
. zyp.sen
и sens.slope
похоже согласны.
library(trends)
library(zyp)
library(mblm)
set.seed(1)
df <- data.frame(x = 1:100,y = 1:100-runif(100,-20,20))
coef(zyp.sen(y~x,df))["x"]
x
1.003835
coef(mblm(y ~ x, df),repeated = FALSE)['x']
x
1.031631
sens.slope(ts(df)[,-1])$estimate
Sen's slope
1.003835
Если мы рассмотрим источник mblm
, мы обнаружим, что есть ошибка и что он возвращает результаты повторного метода независимо от аргумента repeated =
.
coef(mblm(y ~ x, df),repeated = TRUE)['x']
x
1.031631
Вот отрывок из кода mblm
:
x = df$x
y = df$y
# if (length(term) > 2) {
# stop("Only linear models are accepted")
# }
xx = sort(x)
yy = y[order(x)]
n = length(xx)
slopes = c()
intercepts = c()
smedians = c()
imedians = c()
# if (repeated) {
# <snip>
# }
# else {
for (i in 1:(n - 1)) {
for (j in i:n) {
if (xx[j] != xx[i]) {
slopes = c(slopes, (yy[j] - yy[i])/(xx[j] -
xx[i]))
}
}
}
slope = median(slopes)
intercepts = yy - slope * xx
intercept = median(intercepts)
# }
slope
[1] 1.003835
И, таким образом, все согласны.