Aumento linear de dados com redefinição manual

8

Eu tenho um conjunto de dados de séries temporais que aumenta linearmente de um sensor, com valores variando entre 50 e 150. Eu implementei um algoritmo de regressão linear simples para ajustar uma linha de regressão a esses dados, e estou prevendo a data em que a série chegaria 120

Tudo funciona bem quando a série se move para cima. Mas há casos em que o sensor atinge cerca de 110 ou 115 e é redefinido; nesses casos, os valores recomeçariam em, digamos, 50 ou 60.

É aqui que começo a enfrentar problemas com a linha de regressão, que começa a se mover para baixo e começa a prever datas antigas. Eu acho que deveria considerar apenas o subconjunto de dados de onde ele foi redefinido anteriormente. No entanto, estou tentando entender se existem algoritmos disponíveis que considerem esse caso.

Eu sou novo na ciência de dados, gostaria de receber dicas para avançar.

Editar: sugestões de nfmcclure aplicadas

Antes de aplicar as sugestões

insira a descrição da imagem aqui

Abaixo está o instantâneo do que obtive depois de dividir o conjunto de dados onde ocorre a redefinição e a inclinação de dois conjuntos.

insira a descrição da imagem aqui

encontrar a média das duas inclinações e desenhar a linha a partir da média.

insira a descrição da imagem aqui

Isso está bom?

ArunDhaJ
fonte
1
Você tem a idéia certa, exceto quando plotá-la, deve começar onde a série inicia a cada redefinição. Para estimar onde ele vai chegar, digamos 120, veja minha primeira edição na minha resposta.
Nfmcclure

Respostas:

5

Eu pensei que este era um problema interessante, então escrevi um conjunto de dados de amostra e um estimador de inclinação linear em R. Espero que ajude você com o seu problema. Vou fazer algumas suposições, a maior delas é que você deseja estimar uma inclinação constante, dada por alguns segmentos em seus dados. Outra suposição para separar os blocos de dados lineares é que o 'reset' natural será encontrado comparando-se diferenças consecutivas e encontrando aquelas que são desvios do padrão X abaixo da média. (Eu escolhi 4 sd, mas isso pode ser alterado)

Aqui está um gráfico dos dados, e o código para gerá-los está na parte inferior. Dados de amostra

Para iniciantes, encontramos as quebras e ajustamos cada conjunto de valores y e registramos as inclinações.

# 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]))

Aqui estão as pistas: (3.309110, 4.419178, 3.292029, 4.531126, 3.675178, 4.294389)

E podemos apenas usar a média para encontrar a inclinação esperada (3.920168).


Editar: prever quando a série atingir 120

Percebi que não terminei o previsto quando a série atingir 120. Se estimarmos a inclinação para m e vermos uma redefinição no tempo t para um valor x (x <120), podemos prever quanto tempo levará para alcançar 120 por uma álgebra simples.

insira a descrição da imagem aqui

Aqui, t é o tempo que levaria para atingir 120 após uma redefinição, x é o que é redefinido e m é a inclinação estimada. Não vou nem tocar no assunto das unidades aqui, mas é uma boa prática resolvê-las e garantir que tudo faça sentido.


Editar: Criando os dados de amostra

Os dados da amostra consistirão em 100 pontos, ruído aleatório com uma inclinação de 4 (esperamos estimar isso). Quando os valores y atingem um ponto de corte, eles são redefinidos para 50. O ponto de corte é escolhido aleatoriamente entre 115 e 120 para cada redefinição. Aqui está o código R para criar o conjunto de dados.

# 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
fonte
Eu acho que sua resposta é útil para o problema. Apenas algumas sugestões: eu moveria o código de geração de dados para o final, ou mesmo para um Gist externo, pois ele não faz parte da solução proposta. E eu detalharia um pouco mais o fato de você estar usando 4 desvios padrão para detectar redefinições: agora, é apenas um comentário perdido no código e é o núcleo da sua solução.
logc 14/07
Boas idéias. Vai fazer.
Nfmcclure
Oi nfmcclure, apliquei sua sugestão e atualizei a postagem. Por favor, forneça seus comentários.
ArunDhaJ
3

Seu problema é que as redefinições não fazem parte do seu modelo linear. Você deve cortar seus dados em diferentes fragmentos nas redefinições, para que não ocorra redefinição em cada fragmento e ajuste um modelo linear a cada fragmento. Ou você pode criar um modelo mais complicado que permita redefinições. Nesse caso, o tempo de ocorrência das redefinições deve ser inserido manualmente no modelo ou o tempo de redefinições deve ser um parâmetro livre no modelo que é determinado ajustando o modelo aos dados.

Paulo
fonte