2012-11-19 19 views
6

प्रश्न: स्थानीय स्तर पर नाएन के स्थानीय स्तर पर कैसे इंटरपोलेट करें?MATLAB: एक समय श्रृंखला में NaNs पर इंटरपोलेशन

मेरे पास एक समय श्रृंखला ("एक्स" डेटा समान रूप से "टी" समय पर नमूना है) जिसमें NaNs के ब्लॉक हैं। उदाहरण के लिए:

x = [ 1 2 4 2 3 15 10 NaN NaN NaN NaN 2 4 NaN 19 25] 
t = [0.1 0.2 0.3 ...etc..] 

मैं NaN से अधिक प्रक्षेप प्रदर्शन करने के लिए चाहते हैं।

सबसे प्राथमिक दृष्टिकोण केवल बाएं-अधिकांश डेटा बिंदु से दाएं-डेटा बिंदु से रैखिक रूप से इंटरपोलेट करना होगा। उदाहरण के लिए। x = 10 से x = 2 की रेखा और 4 NaN मानों को लाइन से मान असाइन किए जाएंगे।

~ 10000 NaNs के साथ समय श्रृंखला की लंबाई ~ 1.5 मिलियन है, इसलिए मैं डेटा (इंटरपोलेशन में) को शामिल नहीं करना चाहता जो कि NaN स्थानों से बहुत दूर है। कुछ NaNs 1000-2000 की लंबाई फैलाते हैं।

X(isnan(X)) = interp1(find(~isnan(X)), X(~isnan(X)), find(isnan(X)), 'linear'); 

पूरे समय श्रृंखला का उपयोग करके NaN पर रैखिक रूप से इंटरपोलेट करेगा।

मैं स्थानीय रूप से कैसे इंटरपोलेट करूं? रैखिक पर्याप्त होना चाहिए। शायद रैखिक इंटरपोलेशन बाएं और कुछ नैन ब्लॉक (शायद 100-200 अंक) के दाईं ओर कुछ बिंदुओं को शामिल करता है। एक प्राकृतिक पड़ोसी या स्पलीन (?) एल्गोरिदम अधिक उपयुक्त हो सकता है; मुझे समय श्रृंखला में असंगत व्यवहार जोड़ने में सावधान रहना चाहिए (उदा। इंटरपोलेशन जो आवृत्ति के लिए कल्पित "शक्ति" जोड़ता है)।

अद्यतन: समय श्रृंखला एक वर्ष लंबी अवधि में एक मिनट-नमूना तापमान का रिकॉर्ड है। रैखिक इंटरपोलेशन पर्याप्त है; मुझे सिर्फ NaNs के ~ 6-7 घंटे की लंबाई अंतराल भरने की आवश्यकता है (मुझे NaN अंतराल से पहले और NaN अंतराल के बाद डेटा प्रदान किया गया है)।

+1

रैखिक प्रक्षेप केवल मानों को साथ वाले क्षेत्र के लिए उपयोग करता है interpolated होने के कारण, "पूरे समय श्रृंखला का उपयोग" के बारे में चिंता करने की कोई ज़रूरत नहीं है। या समस्या प्रदर्शन है? – Jonas

+0

आह मुझे मूर्खतापूर्ण। मैं इस धारणा के तहत था कि यह कम से कम वर्ग रैखिक फिट का उपयोग कर फिट का उपयोग कर बिंदु निर्दिष्ट कर रहा था। यदि इंटरप 1 'रैखिक' पड़ोसी बाएं और दाएं बिंदुओं और इंटरपोलेट्स में शामिल हो जाता है, तो 'क्यूबिक' और 'पचिप' क्या अंतर करते हैं? जैसे यह डेटा पर एक घन फिट नहीं है तो interpolate? – Justin

+2

क्या आप पूछ रहे हैं कि इंटरपोलेशन का सबसे अच्छा तरीका क्या है? यदि ऐसा है, तो सबसे अच्छी विधि वास्तव में आपके आवेदन पर निर्भर करती है। उदाहरण के लिए, कुछ अनुप्रयोगों के लिए, आप केवल पिछले डेटा का उपयोग करके इंटरपोलेट करना चाहते हैं, क्योंकि रैखिक इंटरपोलेशन जैसी विधि का तात्पर्य है कि आप समय से पहले जानते हैं कि अगला गैर-एनएन अवलोकन क्या होगा। स्पेक्ट्रम के दूसरे छोर पर आप एक ईएम एल्गोरिदम लागू कर सकते हैं जो हर दूसरे अवलोकन के संयुक्त वितरण पर सशर्त, उनके सशर्त रूप से अपेक्षित मूल्यों के साथ गायब अवलोकनों को प्रतिस्थापित करता है। इसलिए आपके आवेदन को जानने के बिना जवाब देना मुश्किल है। –

उत्तर

3

inpaint_nans का उपयोग करने पर विचार करें, गैर-एनएन तत्वों का उपयोग करके 1-डी या 2-डी सरणी में NaN तत्वों को विभाजित करने के लिए डिज़ाइन किया गया एक बहुत अच्छा टूल। यह भी extrapolate कर सकते हैं, क्योंकि यह डेटा के त्रिकोण का उपयोग नहीं करता है। यह इंटरपोलेशन के लिए विभिन्न दृष्टिकोणों की भी अनुमति देता है।

4

मुझे लगता है कि यह (कम से कम आंशिक रूप से) है कि तुम क्या चाहते हैं:

% example data 
x = [ 1 2 4 2 3 15 10 NaN NaN NaN NaN 2 4 NaN 19 25]; 
t = linspace(0.1, 10, numel(x)); 

% indices to NaN values in x 
% (assumes there are no NaNs in t) 
nans = isnan(x); 

% replace all NaNs in x with linearly interpolated values 
x(nans) = interp1(t(~nans), x(~nans), t(nans)); 

ध्यान दें कि आप आसानी से प्रक्षेप यहां विधि को स्विच कर सकते हैं:

% cubic splines 
x(nans) = interp1(t(~nans), x(~nans), t(nans), 'spline'); 

% nearest neighbor 
x(nans) = interp1(t(~nans), x(~nans), t(nans), 'nearest'); 
संबंधित मुद्दे