Datos linealmente crecientes con reinicio manual

8

Tengo un conjunto de datos de series temporales de un sensor que aumenta linealmente, con rangos de valores entre 50 y 150. Implementé un algoritmo de regresión lineal simple para ajustar una línea de regresión en dichos datos, y estoy prediciendo la fecha en que la serie alcanzaría 120

Todo funciona bien cuando la serie se mueve hacia arriba. Pero, hay casos en los que el sensor alcanza alrededor de 110 o 115, y se reinicia; en tales casos, los valores comenzarían nuevamente en, por ejemplo, 50 o 60.

Aquí es donde empiezo a enfrentar problemas con la línea de regresión, ya que comienza a moverse hacia abajo y comienza a predecir la fecha anterior. Creo que debería considerar solo el subconjunto de datos desde donde se restableció anteriormente. Sin embargo, estoy tratando de entender si hay algún algoritmo disponible que considere este caso.

Soy nuevo en ciencia de datos, agradecería cualquier sugerencia para avanzar.

Editar: sugerencias de nfmcclure aplicadas

Antes de aplicar las sugerencias

ingrese la descripción de la imagen aquí

A continuación se muestra la instantánea de lo que tengo después de dividir el conjunto de datos donde se produce el restablecimiento, y la pendiente de dos conjuntos.

ingrese la descripción de la imagen aquí

encontrar la media de las dos pendientes y dibujar la línea desde la media.

ingrese la descripción de la imagen aquí

¿Esta bien?

ArunDhaJ
fuente
1
Tiene la idea correcta, excepto que al trazarla debe comenzar donde comienza la serie cada reinicio. Para estimar dónde llegará, digamos 120, vea mi primera edición en mi respuesta.
nfmcclure

Respuestas:

5

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. Data de muestra

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.

ingrese la descripción de la imagen aquí

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
nfmcclure
fuente
Creo que tu respuesta es útil para el problema. Solo algunas sugerencias: movería el código de generación de datos al final, o incluso a un Gist externo, ya que no es realmente parte de la solución propuesta. Y explicaría un poco más el hecho de que está utilizando 4 desviaciones estándar para detectar restablecimientos: en este momento, es solo un comentario perdido en el código, y es el núcleo de su solución.
logc
Buenas ideas. Lo haré
nfmcclure
Hola nfmcclure, apliqué tu sugerencia y actualicé la publicación. Por favor proporcione sus comentarios.
ArunDhaJ
3

Su problema es que los reinicios no son parte de su modelo lineal. Debe cortar sus datos en diferentes fragmentos en los reinicios, para que no se produzca ningún reinicio dentro de cada fragmento y pueda ajustar un modelo lineal a cada fragmento. O puede crear un modelo más complicado que permita restablecimientos. En este caso, el tiempo de ocurrencia de los reinicios debe ingresarse manualmente en el modelo o el tiempo de reinicios debe ser un parámetro libre en el modelo que se determina ajustando el modelo a los datos.

Pablo
fuente