Secara linear meningkatkan data dengan reset manual

8

Saya memiliki rangkaian data deret waktu yang meningkat secara linear dari sebuah sensor, dengan rentang nilai antara 50 dan 150. Saya telah menerapkan algoritma Regresi Linier Sederhana agar sesuai dengan garis regresi pada data tersebut, dan saya memperkirakan tanggal kapan rangkaian akan mencapai 120.

Semua berfungsi dengan baik saat seri bergerak ke atas. Tapi, ada kasus di mana sensor mencapai sekitar 110 atau 115, dan itu diatur ulang; dalam kasus seperti itu nilainya akan mulai lagi dari, katakanlah, 50 atau 60.

Di sinilah saya mulai menghadapi masalah dengan garis regresi, karena mulai bergerak ke bawah, dan mulai memprediksi tanggal lama. Saya pikir saya harus mempertimbangkan hanya subset data dari tempat sebelumnya direset. Namun, saya mencoba memahami jika ada algoritma yang tersedia yang mempertimbangkan kasus ini.

Saya baru dalam ilmu data, akan menghargai petunjuk apa pun untuk melangkah lebih jauh.

Edit: saran nfmcclure diterapkan

Sebelum menerapkan saran

masukkan deskripsi gambar di sini

Di bawah ini adalah snapshot dari apa yang saya dapatkan setelah memisahkan dataset tempat reset terjadi, dan kemiringan dua set.

masukkan deskripsi gambar di sini

menemukan rata-rata dari dua lereng dan menggambar garis dari rata-rata.

masukkan deskripsi gambar di sini

Apakah ini ok?

ArunDhaJ
sumber
1
Anda memiliki ide yang tepat, kecuali ketika merencanakannya Anda harus mulai dari mana seri dimulai setiap reset. Untuk memperkirakan di mana ia akan mencapai, katakan 120, lihat edit pertama saya di jawaban saya.
nfmcclure

Jawaban:

5

Saya pikir ini adalah masalah yang menarik, jadi saya menulis kumpulan data sampel dan penaksir kemiringan linier di R. Saya harap ini membantu Anda dengan masalah Anda. Saya akan membuat beberapa asumsi, yang terbesar adalah Anda ingin memperkirakan kemiringan konstan, yang diberikan oleh beberapa segmen dalam data Anda. Asumsi lain untuk memisahkan blok data linier adalah bahwa 'reset' alami akan ditemukan dengan membandingkan perbedaan berturut-turut dan menemukan yang penyimpangan standar-X di bawah rata-rata. (Saya memilih 4 sd, tetapi ini bisa diubah)

Berikut adalah sebidang data, dan kode untuk menghasilkannya ada di bagian bawah. Contoh data

Sebagai permulaan, kami menemukan jeda dan pas untuk setiap set nilai-y dan mencatat lereng.

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

Inilah lerengnya: (3.309110, 4.419178, 3.292029, 4.531126, 3.675178, 4.294389)

Dan kita bisa mengambil mean untuk menemukan kemiringan yang diharapkan (3.920168).


Sunting: Memprediksi kapan seri mencapai 120

Saya menyadari bahwa saya tidak menyelesaikan prediksi ketika seri mencapai 120. Jika kami memperkirakan kemiringan menjadi m dan kami melihat reset pada waktu t ke nilai x (x <120), kami dapat memperkirakan berapa lama lagi untuk mencapai 120 oleh beberapa aljabar sederhana.

masukkan deskripsi gambar di sini

Di sini, t adalah waktu yang dibutuhkan untuk mencapai 120 setelah reset, x adalah apa yang diatur ulang, dan m adalah kemiringan yang diperkirakan. Saya bahkan tidak akan menyentuh subjek unit di sini, tetapi praktik yang baik untuk menyelesaikannya dan memastikan semuanya masuk akal.


Edit: Membuat Data Sampel

Data sampel akan terdiri dari 100 poin, derau acak dengan kemiringan 4 (Semoga kita akan memperkirakan ini). Ketika nilai-y mencapai cutoff, mereka mereset ke 50. Cutoff dipilih secara acak antara 115 dan 120 untuk setiap reset. Berikut adalah kode R untuk membuat kumpulan data.

# 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
sumber
Saya pikir jawaban Anda berguna untuk masalah ini. Hanya beberapa saran: Saya akan memindahkan kode pembuatan data ke bawah, atau bahkan ke Gist eksternal, karena itu bukan bagian dari solusi yang diusulkan. Dan saya akan menguraikan sedikit lebih banyak pada fakta bahwa Anda menggunakan 4 standar deviasi untuk mendeteksi ulang: saat ini, itu hanya sebuah komentar yang hilang dalam kode, dan itu adalah inti dari solusi Anda.
logc
Ide bagus Akan melakukan.
nfmcclure
Hai nfmcclure, saya telah menerapkan saran Anda dan memperbarui pos. Harap berikan komentar Anda.
ArunDhaJ
3

Masalah Anda adalah bahwa pengaturan ulang bukan bagian dari model linier Anda. Anda juga harus memotong data menjadi fragmen yang berbeda di reset, sehingga tidak ada reset terjadi dalam setiap fragmen, dan Anda bisa menyesuaikan model linier untuk setiap fragmen. Atau Anda dapat membangun model yang lebih rumit yang memungkinkan pengaturan ulang. Dalam hal ini, waktu terjadinya reset harus dimasukkan ke dalam model secara manual, atau waktu reset harus menjadi parameter bebas dalam model yang ditentukan dengan memasukan model ke data.

Paul
sumber