Pensé que era un problema interesante, así que escribí un conjunto de datos de muestra y un estimador de pendiente lineal en R. Espero que te ayude con tu problema. Voy a hacer algunas suposiciones, la más importante es que desea estimar una pendiente constante, dada por algunos segmentos en sus datos. Otra suposición para separar los bloques de datos lineales es que el 'restablecimiento' natural se encontrará comparando las diferencias consecutivas y encontrando las que son desviaciones estándar X por debajo de la media. (Elegí 4 SD, pero esto se puede cambiar)
Aquí hay una gráfica de los datos, y el código para generarlos está en la parte inferior.
Para empezar, encontramos los descansos y ajustamos cada conjunto de valores de y registramos las pendientes.
# 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]))
Aquí están las pendientes: (3.309110, 4.419178, 3.292029, 4.531126, 3.675178, 4.294389)
Y podemos tomar la media para encontrar la pendiente esperada (3.920168).
Editar: predecir cuando la serie alcanza 120
Me di cuenta de que no terminé la predicción cuando la serie llega a 120. Si estimamos que la pendiente es m y vemos un restablecimiento en el tiempo t a un valor x (x <120), podemos predecir cuánto más tardaría en llegar 120 por un poco de álgebra simple.
Aquí, t es el tiempo que tomaría llegar a 120 después de un reinicio, x es a lo que se restablece ym es la pendiente estimada. Ni siquiera voy a tocar el tema de las unidades aquí, pero es una buena práctica resolverlas y asegurarme de que todo tenga sentido.
Editar: Crear los datos de muestra
Los datos de la muestra consistirán en 100 puntos, ruido aleatorio con una pendiente de 4 (con suerte lo calcularemos). Cuando los valores y alcanzan un límite, se restablecen a 50. El límite se elige aleatoriamente entre 115 y 120 para cada restablecimiento. Aquí está el código R para crear el conjunto de datos.
# 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