স্থান এবং সময় নৈকট্য


10

আমার কাছে কিছু পয়েন্ট ডেটা রয়েছে যা কোনও প্রাণীর দৈনিক ল্যাট-লোন অবস্থানের প্রতিনিধিত্ব করে, সম্পর্কিত টাইমস্ট্যাম্প সহ।

আমি সমস্ত পয়েন্টগুলি সনাক্ত করতে চাই যেখানে STATIONARY = সত্য। চারপাশে যদি 100 কিলোমিটার বাফার 5 টি অস্থায়ীভাবে সংলগ্ন পয়েন্টগুলিকে ওভারল্যাপ করে তবে একটি বিন্দু স্থির হয়ে ওঠার যোগ্যতা অর্জন করে। সুতরাং যদি 10 দিনটি আমার আগ্রহের বিষয় হয় তবে আমি জিজ্ঞাসা করতে চাই যে 5 অস্থায়ীভাবে সংলগ্ন দিনগুলি এই বিন্দুর 100 কিলোমিটার বাফারের মধ্যে রয়েছে কিনা। দিনগুলি যদি 5,6,7,8 & 9 হয়; বা দিন 11,12,13,14 & 15; বা দিন 8,9,11,12,13 (ইত্যাদি) বাফারের মধ্যে থাকে, তারপরে স্টেশানারি = সত্য। তবে, যদি 5,7,9,11 এবং 13 দিন বাফারের মধ্যে থাকে তবে এর মধ্যে বিকল্প (এমনকি) দিন না হয় তবে STATIONARY = FALSE

আমি মনে করি যে কোনও ধরণের মুভিং উইন্ডো বাফার সমাধান সরবরাহ করবে, তবে কীভাবে এটি বাস্তবায়ন করতে হয় তা আমি জানি না।

আমি আর্কজিআইএস এবং আর উভয় ক্ষেত্রেই এই সমস্যাটি ঘিরে আমার মাথা পেতে চেষ্টা করেছি, তবে এখন পর্যন্ত কোনও মস্তিষ্কের তরঙ্গ নেই। এটি সমাধানের কাছে আমার কাছে সবচেয়ে কাছাকাছি, তবে এটি পুরোপুরি খাপ খায় না বলে আমি মনে করি না: নির্দিষ্ট বাফারের মধ্যে পরপর পয়েন্টগুলির সনাক্তকরণ

এখানে কিছু ডামি ডেটা রয়েছে, যা আমার ডেটা কাঠামোটির সমান করে দেয় (যদিও বাস্তবে আমার দু'বার দৈনিক অবস্থান রয়েছে (মধ্যাহার এবং মধ্যরাত) কিছু লোকেশন নিখোঁজ রয়েছে - তবে আমি পরে এটি নিয়ে উদ্বিগ্ন হব))

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
... ...         ...       ...

1
প্রশ্ন? ধরে নিচ্ছি সমস্ত 10 পয়েন্ট বাফারের মধ্যে রয়েছে এবং আপনার তারিখের বিচ্ছেদ রয়েছে (1 দিন থেকে শুরু) 1-04-04-23-28-28-22-29-30 তারপর আপনি কি বলছেন আপনি কেবল পয়েন্ট বাছাই করতে আগ্রহী? যে দিনগুলিতে 1,2,3,4 এবং 12?
হর্নবিডি

না, আমি কেবল 1-4 দিনের মধ্যে আগ্রহী। যদি প্রাণীটি বাফারটিকে 'ছেড়ে যায়' তবে 12 (বা 6 দিনের দিন) ফিরে আসে, তবে এটি সেই স্থিতিকালটি 'বাতিল' করবে - অর্থাত্ প্রাণীটি বাফারে 1-2-2-2-2-25-তে থাকতে হবে বাফারের কেন্দ্রে পয়েন্টটি গণনা করতে হবে। ধারণা তৈরী কর? আমি নিজেই নিশ্চিত নই ..
টম ফিঞ্চ

1
কেবলমাত্র পরীক্ষা করে দেখুন, যদি আগ্রহের পয়েন্টটি day দিন হয় তবে আপনি কি আগ্রহী পয়েন্টগুলি 7,8,9,10 এবং 11 দিনের জন্য 100 কিলোমিটারের মধ্যে চলে যাবেন?
হর্নবিডি

Point, ৯, ১০, ১১ ও ১২ দিন যদি 100 কিলোমিটারের সাথে থাকে তবে পয়েন্ট 7টি স্টেশনারি পয়েন্ট হিসাবে নির্বাচিত হবে। বা দিনগুলি 5,6,8,9,10। সুতরাং যে কোনও একটি বিন্দু নির্বাচিত হয় যদি অন্য 5 টি অস্থায়ীভাবে সংলগ্ন পয়েন্টগুলি (5 পূর্ববর্তী দিনগুলি, 5 পরবর্তী দিনগুলি, বা উভয় পক্ষের কয়েক দিন) সমস্ত বাফারের মধ্যে থাকে। আমি মনে করি চলমান উইন্ডো এটি ধারণার সেরা উপায় way প্রতিটি 'ফোকাল' পয়েন্টের জন্য অতীত / ভবিষ্যতের 5 দিনের বেশি বিন্দু ভুলে যেতে পারে। আমি আমার মূল প্রশ্নটি আপডেট করতে পারি, কারণ আমি এখন এটি আরও কিছুটা বুঝতে পারি ...
টম ফিঞ্চ

তথ্য বিন্যাস কি? উদাহরণস্বরূপ, আপনার কাছে কি প্রতিটি সময় / অবস্থানটি কোনও শেফফাইলে ভেক্টর পয়েন্ট এবং সময়টি সঞ্চয় করে এমন একটি অ্যাট্রিবিউট টেবিল হিসাবে থাকে? বা প্রতিটি সময় / অবস্থান পৃথক পৃথক আকারের ফাইলে সংরক্ষণ করা হয়? ডেটাগুলি কি ভূ-স্থান সংক্রান্ত বিন্যাসে এবং কেবল কোনও এক্সেল ফাইলে নেই? এটি জেনে আমাদের উত্তর দিতে সাহায্য করবে।

উত্তর:


12

আসুন এটিকে সাধারণ টুকরো টুকরো টুকরো টুকরো টুকরো করে ফেলুন। এটি করার মাধ্যমে, সমস্ত কাজ সহজেই পরীক্ষিত কোডের অর্ধ ডজন লাইনে সম্পন্ন হয়।

প্রথমত, আপনাকে দূরত্ব গণনা করতে হবে। যেহেতু ডেটা ভৌগলিক স্থানাঙ্কে রয়েছে, এখানে একটি গোলাকৃতির ডেটুমের (হ্যাভারসাইন সূত্র ব্যবহার করে) দূরত্ব গণনা করার জন্য এখানে একটি ফাংশন রয়েছে:

#
# Spherical distance.
# `x` and `y` are (long, lat) pairs *in radians*.
dist <- function(x, y, R=1) {
  d <- y - x
  a <- sin(d[2]/2)^2 + cos(x[2])*cos(y[2])*sin(d[1]/2)^2
  return (R * 2*atan2(sqrt(a), sqrt(1-a)))
}

আপনি যদি চান (তবে উপবৃত্তাকার ডেটা ব্যবহার করে এমন) আপনার প্রিয় প্রয়োগের সাথে এটি প্রতিস্থাপন করুন।

এর পরে, আমাদের প্রতিটি "বেস পয়েন্ট" (স্তরেরাই জন্য পরীক্ষা করা হচ্ছে) এবং এর অস্থায়ী প্রতিবেশগুলির মধ্যে দূরত্ব গণনা করতে হবে। এটি কেবল distপাড়ার জন্য প্রয়োগ করার বিষয় :

#
# Compute the distances between an array of locations and a base location `x`.
dist.array <- function(a, x, ...) apply(a, 1, function(y) dist(x, y, ...))

তৃতীয় - এটি মূল ধারণা - স্থায়ী পয়েন্টগুলি 11 টি পয়েন্টের প্রতিবেশী সনাক্তকরণের মাধ্যমে পাওয়া যায় যার সারিতে কমপক্ষে পাঁচজন থাকে যার দূরত্বগুলি যথেষ্ট কম small আসুন আমরা বুুলিয়ান মানগুলির একটি লজিক্যাল অ্যারেতে সত্য মানের দীর্ঘতম অনুচ্ছেদের দৈর্ঘ্য নির্ধারণ করে আরও সাধারণভাবে এটি বাস্তবায়ন করি:

#
# Return the length of the longest sequence of true values in `x`.
max.subsequence <- function(x) max(diff(c(0, which(!x), length(x)+1)))

(আমরা ভ্রান্ত মূল্যবোধগুলির অবস্থানগুলি যথাযথভাবে সন্ধান করি এবং তাদের পার্থক্যগুলি গণনা করি: এটি অ-ভুয়া মানগুলির অনুচ্ছেদের দৈর্ঘ্য।

চতুর্থত, আমরা max.subsequenceস্টেশনারি পয়েন্টগুলি সনাক্ত করতে আবেদন করি ।

#
# Determine whether a point `x` is "stationary" relative to a sequence of its
# neighbors `a`.  It is provided there is a sequence of at least `k`
# points in `a` within distance `radius` of `x`, where the earth's radius is
# set to `R`.
is.stationary <- function(x, a, k=floor(length(a)/2), radius=100, R=6378.137) 
  max.subsequence(dist.array(a, x, R) <= radius) >= k

সেগুলি আমাদের প্রয়োজনীয় সমস্ত সরঞ্জাম।


উদাহরণস্বরূপ, আসুন কিছু আকর্ষণীয় ডেটা তৈরি করুন যা স্টেশনারি পয়েন্টগুলির কয়েকটি ক্লাম্প রয়েছে। আমি নিরক্ষীয় অঞ্চলের কাছাকাছি এলোমেলো পদক্ষেপ নেব।

set.seed(17)
n <- 67
theta <- 0:(n-1) / 50 - 1 + rnorm(n, sd=1/2)
rho <- rgamma(n, 2, scale=1/2) * (1 + cos(1:n / n * 6 * pi))
lon <- cumsum(cos(theta) * rho); lat <- cumsum(sin(theta) * rho)

অ্যারেতে lonএবং বিন্যাসে পয়েন্টের ধারাবাহিকতায় latডিগ্রীতে স্থানাঙ্ক থাকে n। প্রথম রেডিয়ানে রূপান্তরিত হওয়ার পরে আমাদের সরঞ্জাম প্রয়োগ করা সহজসাধ্য:

p <- cbind(lon, lat) * pi / 180 # Convert from degrees to radians
p.stationary <- sapply(1:n, function(i) 
  is.stationary(p[i,], p[max(1,i-5):min(n,i+5), ], k=5))

আর্গুমেন্টটি p[max(1,i-5):min(n,i+5), ]বলছে যে বেস সময় থেকে 5 সময় পদক্ষেপ বা 5 পর্বতমালার চেয়ে অনেক দূরে এগিয়ে যেতে হবে p[i,]। সহ k=5বেসিক পয়েন্টের 100 কিলোমিটারের মধ্যে থাকা সারিতে 5 বা ততোধিক ক্রমের সন্ধান করতে বলে। (100 কিলোমিটারের মানটি ডিফল্ট হিসাবে সেট করা হয়েছিল is.stationaryতবে আপনি এটি এখানে ওভাররাইড করতে পারেন))

আউটপুট p.stationaryহ'ল যৌক্তিক ভেক্টর যা স্থিরতার ইঙ্গিত দেয়: আমাদের কাছে যা ছিল আমরা তা পেয়েছি। তবে পদ্ধতিটি যাচাই করার জন্য মানগুলির অ্যারেগুলি পরীক্ষা করার পরিবর্তে ডেটা এবং এই ফলাফলগুলি প্লট করা ভাল। নিম্নলিখিত প্লটটিতে আমি রুট এবং পয়েন্টগুলি দেখি। প্রতি দশম পয়েন্টকে লেবেলযুক্ত করা হয় যাতে আপনি অনুমান করতে পারবেন কতগুলি স্থির ক্লাম্পের মধ্যে ওভারল্যাপ হতে পারে। এগুলি হাইলাইট করার জন্য স্টেশনারি পয়েন্টগুলি শক্ত লালতে পুনরায় চিত্রিত করা হয় এবং তাদের 100 কিলোমিটার বাফার দ্বারা বেষ্টিত হয়।

ব্যক্তিত্ব

plot(p, type="l", asp=1, col="Gray", 
     xlab="Longitude (radians)", ylab="Latitude (radians)")
points(p)
points(p[p.stationary, ], pch=19, col="Red", cex=0.75)
i <- seq(1, n, by=10)
#
# Because we're near the Equator in this example, buffers will be nearly 
# circular: approximate them.
disk <- function(x, r, n=32) {
  theta <- 1:n / n * 2 * pi
  return (t(rbind(cos(theta), sin(theta))*r + x))
}
r <- 100 / 6378.137  # Buffer radius in radians
apply(p[p.stationary, ], 1, function(x) 
  invisible(polygon(disk(x, r), col="#ff000008", border="#00000040")))
text(p[i,], labels=paste(i), pos=3, offset=1.25, col="Gray")

ওয়ার্কিং কোড সহ ট্র্যাকড ডেটাগুলিতে স্থিতিশীল পয়েন্টগুলি সন্ধানের জন্য অন্যান্য (পরিসংখ্যান ভিত্তিক) পদ্ধতির জন্য দয়া করে /mathematica/2711/clustering-of-space-time-data দেখুন


ওহ ধন্যবাদ! এই সম্পর্কে আমার মাথা পেতে প্রত্যাশায়। আপনার সময় এবং প্রচেষ্টার জন্য আবার ধন্যবাদ
টম ফিঞ্চ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.