Ho pensato che fosse un problema interessante, quindi ho scritto un set di dati di esempio e uno stimatore di pendenza lineare in R. Spero che ti aiuti con il tuo problema. Farò alcune ipotesi, la più grande è che vuoi stimare una pendenza costante, data da alcuni segmenti nei tuoi dati. Un altro presupposto per separare i blocchi di dati lineari è che il naturale "reset" sarà trovato confrontando le differenze consecutive e trovando quelle che sono deviazioni standard X al di sotto della media. (Ho scelto 4 sd, ma questo può essere cambiato)
Ecco un grafico dei dati e il codice per generarli è in fondo.
Per cominciare, troviamo le pause e adattiamo ogni serie di valori y e registriamo le pendenze.
# 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]))
Ecco le piste: (3.309110, 4.419178, 3.292029, 4.531126, 3.675178, 4.294389)
E possiamo solo prendere il mezzo per trovare la pendenza prevista (3.920168).
Modifica: prevedere quando la serie raggiunge 120
Mi sono reso conto di non aver finito la previsione quando la serie raggiunge 120. Se stimiamo che la pendenza sia m e vediamo un reset al tempo t su un valore x (x <120), possiamo prevedere quanto tempo ci vorrebbe per raggiungere 120 con una semplice algebra.
Qui, t è il tempo necessario per raggiungere 120 dopo un reset, x è ciò che reimposta e m è la pendenza stimata. Non toccherò nemmeno l'argomento delle unità qui, ma è buona pratica elaborarle e assicurarsi che tutto abbia un senso.
Modifica: creazione dei dati di esempio
I dati del campione saranno composti da 100 punti, rumore casuale con una pendenza di 4 (speriamo di stimarlo). Quando i valori y raggiungono un valore soglia, vengono ripristinati a 50. Il valore soglia viene scelto casualmente tra 115 e 120 per ogni ripristino. Ecco il codice R per creare il set di dati.
# 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