अंतरिक्ष और समय में निकटता


10

मेरे पास कुछ बिंदु डेटा हैं जो एक संबंधित टाइमस्टैम्प के साथ एक जानवर के दैनिक लैट-लोन स्थानों का प्रतिनिधित्व करते हैं।

मैं उन सभी बिंदुओं की पहचान करना चाहूँगा जहाँ STATIONARY = TRUE है। एक बिंदु स्थिर होने के रूप में योग्य है यदि इसके चारों ओर एक 100 किमी बफर एक अतिरिक्त (कहते हैं) 5 अस्थायी रूप से आसन्न बिंदु है। इसलिए यदि दिन 10 मेरी रुचि का है, तो मैं पूछना चाहता हूं कि क्या 5 अस्थायी रूप से आसन्न दिन इस बिंदु के 100 किमी बफर के भीतर हैं। यदि दिन 5,6,7,8 & 9; या दिन 11,12,13,14 और 15; या दिन 8,9,11,12,13 (आदि) बफर के भीतर हैं, फिर स्टेशनरी = TRUE। यदि, हालांकि, दिन 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-3-4-12-13-20-21-22-29-30-30 के बाद की तारीख अलग (दिन 1 से शुरू) है 1,2,3,4 और 12 दिनों में हैं?
२१:३३ में हॉर्निड

नहीं, मुझे केवल 1-4 दिनों में दिलचस्पी होगी। यदि जानवर 'बफर' छोड़ता है तो 12 दिन (या दिन 6) पर लौटता है, तो उस स्थिर अवधि को 'रद्द' कर देगा - अर्थात पशु को दिन में 1-2-3-4-5 के लिए बफर में रहना होगा बफर के केंद्र में बिंदु को गिना जा सकता है। सही बात? मुझे खुद पर यकीन नहीं है ..
टॉम फिंच

1
बस जांच करने के लिए, यदि ब्याज की दर 7 दिन थी, तो आप रुचि वाले बिंदु होंगे जो कि 7K,9,10 और 11 दिनों के लिए 100Km के भीतर आते हैं?
हॉर्नबड सेप 16'13

प्वाइंट 7 को एक स्थिर बिंदु के रूप में चुना जाएगा यदि दिन 8,9,10, 11 और 12 100 किमी के साथ थे। या दिन 5,6,8,9,10। यदि कोई अन्य 5 अस्थायी रूप से समीपवर्ती बिंदु (5 पिछले दिन, 5 बाद के दिन, या कुछ दिन दोनों ओर) किसी भी एक बिंदु का चयन हो जाता है, तो सभी बफर के भीतर हैं। मुझे लगता है कि चलती खिड़की इसे अवधारणा बनाने का सबसे अच्छा तरीका है। प्रत्येक 'फोकल' बिंदु के लिए किसी भी बिंदु को 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)))
}

यदि आप चाहें तो इसे अपने पसंदीदा कार्यान्वयन के साथ बदलें (जैसे कि एक दीर्घवृत्त डेटा का उपयोग करके)।

अगला, हमें प्रत्येक "आधार बिंदु" (staionarity के लिए जाँच की जा रही है) और इसके अस्थायी पड़ोस के बीच की दूरी की गणना करने की आवश्यकता होगी। यह बस 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 बिंदुओं के पड़ोस का पता लगाकर पाया जाता है जिनकी पंक्ति में कम से कम पांच होते हैं जिनकी दूरी पर्याप्त रूप से छोटी होती है। आइए हम बूलियन मानों के एक तार्किक सरणी के भीतर सच्चे मूल्यों के सबसे लंबे समय तक चलने की लंबाई निर्धारित करके इसे थोड़ा और सामान्य रूप से लागू करें:

#
# 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 पर जाएं


वाह धन्यवाद! इस के आसपास मेरे सिर पाने के लिए आगे देख रहे हैं। अपने समय और प्रयास के लिए फिर से धन्यवाद
टॉम फिंच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.