Saya memiliki beberapa data titik yang mewakili lokasi lat-harian binatang, dengan cap waktu yang terkait.
Saya ingin mengidentifikasi semua poin di mana STATIONARY = TRUE. Suatu titik memenuhi syarat sebagai stasioner jika 100 km penyangga di sekitarnya tumpang tindih dengan tambahan (katakanlah) 5 titik yang berdekatan sementara . Jadi, jika hari ke 10 adalah tempat tujuan saya, saya ingin bertanya apakah 5 hari yang berdekatan untuk sementara berada dalam jarak 100 km dari titik ini. Jika hari 5,6,7,8 & 9; ATAU hari 11,12,13,14 & 15; ATAU hari-hari 8,9,11,12,13 (dll.) Berada di dalam buffer, kemudian STATIONARY = TRUE. Namun, jika hari 5,7,9,11 & 13 berada dalam buffer, tetapi bukan hari-hari alternatif (datar) di antara keduanya, maka STATIONARY = FALSE
Saya pikir beberapa jenis buffer jendela bergerak akan memberikan solusi, tetapi saya tidak tahu bagaimana cara mengimplementasikannya.
Saya telah mencoba untuk mengatasi masalah ini di ArcGIS dan R, tetapi sejauh ini tidak ada gelombang otak. Ini adalah yang paling dekat dengan solusi, tetapi tidak cocok, saya tidak berpikir: Identifikasi poin berurutan dalam buffer yang ditentukan
Berikut adalah beberapa data dummy, yang mendekati struktur data saya (meskipun dalam kenyataannya saya memiliki lokasi dua kali sehari (tengah hari dan tengah malam) dengan beberapa lokasi hilang - tetapi saya akan mengkhawatirkannya nanti)
x<-seq(0,15,length.out=20)
y<-seq(10,-10,length.out=20)
t<-seq(as.POSIXct('2013-07-01'), length.out = 20, by = "days")
data<-data.frame(cbind(x,y,t=as.data.frame.POSIXct(t)))
x y t
1 0.0000000 10.0000000 2013-07-01
2 0.7894737 8.9473684 2013-07-02
3 1.5789474 7.8947368 2013-07-03
4 2.3684211 6.8421053 2013-07-04
5 3.1578947 5.7894737 2013-07-05
6 3.9473684 4.7368421 2013-07-06
7 4.7368421 3.6842105 2013-07-07
... ... ... ...
Jawaban:
Mari kita bagi menjadi beberapa bagian sederhana. Dengan melakukan itu, semua pekerjaan diselesaikan hanya dalam setengah lusin baris kode yang mudah diuji.
Pertama, Anda harus menghitung jarak. Karena data berada dalam koordinat geografis, berikut adalah fungsi untuk menghitung jarak pada datum bola (menggunakan rumus Haversine):
Ganti ini dengan implementasi favorit Anda jika Anda mau (seperti yang menggunakan datum ellipsoidal).
Selanjutnya, kita perlu menghitung jarak antara setiap "titik dasar" (diperiksa untuk staionaritas) dan lingkungan temporal. Itu hanya masalah melamar
dist
ke lingkungan:Ketiga - ini adalah ide kunci - titik-titik stasioner ditemukan dengan mendeteksi lingkungan dari 11 titik yang memiliki setidaknya lima berturut-turut yang jaraknya cukup kecil. Mari kita terapkan ini sedikit lebih umum dengan menentukan panjang nilai true nilai terlama dalam array logis nilai boolean:
(Kami menemukan lokasi dari nilai - nilai salah , secara berurutan, dan menghitung perbedaannya: ini adalah panjang dari nilai-nilai non-palsu selanjutnya. Panjang terbesar akan dikembalikan.)
Keempat, kami menerapkan
max.subsequence
untuk mendeteksi titik stasioner.Itu semua adalah alat yang kita butuhkan.
Sebagai contoh, mari kita buat beberapa data menarik yang memiliki beberapa rumpun titik stasioner. Saya akan mengambil jalan acak di dekat Khatulistiwa.
Array
lon
danlat
berisi koordinat, dalam derajat,n
titik secara berurutan. Menerapkan alat kami sangat mudah setelah pertama kali mengubahnya menjadi radian:Argumen
p[max(1,i-5):min(n,i+5), ]
mengatakan untuk melihat sejauh 5 langkah waktu atau sejauh 5 langkah dari titik dasarp[i,]
. Termasukk=5
mengatakan untuk mencari urutan 5 atau lebih dalam satu baris yang berada dalam 100 km dari titik dasar. (Nilai 100 km ditetapkan sebagai defaultis.stationary
tetapi Anda dapat menimpanya di sini.)Outputnya
p.stationary
adalah vektor logis yang menunjukkan stasioneritas: kita memiliki apa yang kita inginkan. Namun, untuk memeriksa prosedur, lebih baik memplot data dan hasil ini daripada memeriksa array nilai. Di plot berikut ini saya menunjukkan rute dan titik-titiknya. Setiap titik kesepuluh diberi label sehingga Anda dapat memperkirakan berapa banyak yang mungkin tumpang tindih dalam rumpun stasioner. Titik stasioner digambar ulang dengan warna merah solid untuk menyorotnya dan dikelilingi oleh buffer 100 km.Untuk pendekatan (berbasis statistik) lainnya untuk menemukan titik diam dalam data yang dilacak, termasuk kode kerja, silakan kunjungi /mathematica/2711/clustering-of-space-time-data .
sumber