Eu pensei que este era um problema interessante, então escrevi um conjunto de dados de amostra e um estimador de inclinação linear em R. Espero que ajude você com o seu problema. Vou fazer algumas suposições, a maior delas é que você deseja estimar uma inclinação constante, dada por alguns segmentos em seus dados. Outra suposição para separar os blocos de dados lineares é que o 'reset' natural será encontrado comparando-se diferenças consecutivas e encontrando aquelas que são desvios do padrão X abaixo da média. (Eu escolhi 4 sd, mas isso pode ser alterado)
Aqui está um gráfico dos dados, e o código para gerá-los está na parte inferior.
Para iniciantes, encontramos as quebras e ajustamos cada conjunto de valores y e registramos as inclinações.
# Find the differences between adjacent points
diffs = y_data[-1] - y_data[-length(y_data)]
# Find the break points (here I use 4 s.d.'s)
break_points = c(0,which(diffs < (mean(diffs) - 4*sd(diffs))),length(y_data))
# Create the lists of y-values
y_lists = sapply(1:(length(break_points)-1),function(x){
y_data[(break_points[x]+1):(break_points[x+1])]
})
# Create the lists of x-values
x_lists = lapply(y_lists,function(x) 1:length(x))
#Find all the slopes for the lists of points
slopes = unlist(lapply(1:length(y_lists), function(x) lm(y_lists[[x]] ~ x_lists[[x]])$coefficients[2]))
Aqui estão as pistas: (3.309110, 4.419178, 3.292029, 4.531126, 3.675178, 4.294389)
E podemos apenas usar a média para encontrar a inclinação esperada (3.920168).
Editar: prever quando a série atingir 120
Percebi que não terminei o previsto quando a série atingir 120. Se estimarmos a inclinação para m e vermos uma redefinição no tempo t para um valor x (x <120), podemos prever quanto tempo levará para alcançar 120 por uma álgebra simples.
Aqui, t é o tempo que levaria para atingir 120 após uma redefinição, x é o que é redefinido e m é a inclinação estimada. Não vou nem tocar no assunto das unidades aqui, mas é uma boa prática resolvê-las e garantir que tudo faça sentido.
Editar: Criando os dados de amostra
Os dados da amostra consistirão em 100 pontos, ruído aleatório com uma inclinação de 4 (esperamos estimar isso). Quando os valores y atingem um ponto de corte, eles são redefinidos para 50. O ponto de corte é escolhido aleatoriamente entre 115 e 120 para cada redefinição. Aqui está o código R para criar o conjunto de dados.
# Create Sample Data
set.seed(1001)
x_data = 1:100 # x-data
y_data = rep(0,length(x_data)) # Initialize y-data
y_data[1] = 50
reset_level = sample(115:120,1) # Select initial cutoff
for (i in x_data[-1]){ # Loop through rest of x-data
if(y_data[i-1]>reset_level){ # check if y-value is above cutoff
y_data[i] = 50 # Reset if it is and
reset_level = sample(115:120,1) # rechoose cutoff
}else {
y_data[i] = y_data[i-1] + 4 + (10*runif(1)-5) # Or just increment y with random noise
}
}
plot(x_data,y_data) # Plot data