Dati in aumento lineare con ripristino manuale


8

Ho un set di dati di serie temporali di un sensore che aumenta in modo lineare, con intervalli di valori compresi tra 50 e 150. Ho implementato un algoritmo di regressione lineare semplice per adattare una linea di regressione su tali dati e sto prevedendo la data in cui la serie raggiungerà 120.

Tutto funziona bene quando la serie si sposta verso l'alto. Tuttavia, ci sono casi in cui il sensore raggiunge circa 110 o 115 e viene ripristinato; in tali casi i valori ricomincerebbero a, diciamo, a 50 o 60.

È qui che inizio ad affrontare problemi con la linea di regressione, poiché inizia a spostarsi verso il basso e inizia a prevedere la vecchia data. Penso che dovrei considerare solo il sottoinsieme di dati da cui è stato precedentemente ripristinato. Tuttavia, sto cercando di capire se ci sono algoritmi disponibili che considerano questo caso.

Sono nuovo nella scienza dei dati, apprezzerei qualsiasi suggerimento per andare oltre.

Modifica: vengono applicati i suggerimenti di nfmcclure

Prima di applicare i suggerimenti

inserisci qui la descrizione dell'immagine

Di seguito è riportato lo snapshot di ciò che ho dopo aver diviso il set di dati in cui si verifica il ripristino e la pendenza di due set.

inserisci qui la descrizione dell'immagine

trovare la media delle due pendenze e tracciare la linea dalla media.

inserisci qui la descrizione dell'immagine

Va bene?


1
Hai la giusta idea, tranne che nel momento della stampa, dovresti iniziare da dove la serie inizia ogni reset. Per stimare dove colpirà, diciamo 120, vedi la mia prima modifica nella mia risposta.
nfmcclure,

Risposte:


5

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. Dati di esempio

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.

inserisci qui la descrizione dell'immagine

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

Penso che la tua risposta sia utile al problema. Solo alcuni suggerimenti: sposterei il codice di generazione dei dati verso il basso, o anche su un Gist esterno, dal momento che non fa davvero parte della soluzione proposta. E vorrei approfondire un po 'di più il fatto che stai utilizzando 4 deviazioni standard per rilevare i ripristini: in questo momento, è solo un commento perso nel codice ed è il nucleo della tua soluzione.
logc

Buone idee. Andrà bene.
nfmcclure,

Ciao nfmcclure, ho applicato il tuo suggerimento e aggiornato il post. Si prega di fornire i vostri commenti.
ArunDhaJ,

3

Il tuo problema è che i ripristini non fanno parte del tuo modello lineare. O devi tagliare i tuoi dati in diversi frammenti ai ripristini, in modo che non si verifichi alcun ripristino all'interno di ciascun frammento e puoi adattare un modello lineare a ciascun frammento. Oppure puoi creare un modello più complicato che consenta il ripristino. In questo caso, il tempo di occorrenza dei ripristini deve essere inserito manualmente nel modello oppure il tempo dei ripristini deve essere un parametro libero nel modello che viene determinato adattando il modello ai dati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.