Je pensais que c'était un problème intéressant, alors j'ai écrit un échantillon de données et un estimateur de pente linéaire dans R. J'espère que cela vous aidera avec votre problème. Je vais faire quelques hypothèses, la plus importante est que vous souhaitez estimer une pente constante, donnée par certains segments dans vos données. Une autre hypothèse pour séparer les blocs de données linéaires est que la «réinitialisation» naturelle sera trouvée en comparant les différences consécutives et en trouvant celles qui sont des écarts standard X inférieurs à la moyenne. (J'ai choisi 4 sd, mais cela peut être changé)
Voici un tracé des données, et le code pour les générer est en bas.
Pour commencer, nous trouvons les pauses et ajustons chaque ensemble de valeurs y et enregistrons les pentes.
# 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]))
Voici les pistes: (3.309110, 4.419178, 3.292029, 4.531126, 3.675178, 4.294389)
Et nous pouvons simplement prendre la moyenne pour trouver la pente attendue (3.920168).
Edit: Prédire quand la série atteint 120
J'ai réalisé que je n'avais pas fini de prédire quand la série atteindrait 120. Si nous estimons la pente à m et que nous voyons une réinitialisation au temps t à une valeur x (x <120), nous pouvons prédire combien de temps il faudrait pour atteindre 120 par une algèbre simple.
Ici, t est le temps qu'il faudrait pour atteindre 120 après une réinitialisation, x est ce à quoi il se réinitialise et m est la pente estimée. Je ne vais même pas toucher au sujet des unités ici, mais c'est une bonne pratique de les travailler et de m'assurer que tout a un sens.
Modifier: création des exemples de données
Les données de l'échantillon seront composées de 100 points de bruit aléatoire avec une pente de 4 (nous espérons que nous l'estimerons). Lorsque les valeurs y atteignent un seuil, elles sont réinitialisées à 50. Le seuil est choisi au hasard entre 115 et 120 pour chaque réinitialisation. Voici le code R pour créer l'ensemble de données.
# 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