2012-07-18 9 views
7

से निपटने के लिए मैं समय श्रृंखला को सुचारू बनाने के लिए चेबिशहेव फ़िल्टर को कार्यान्वित करने की कोशिश कर रहा हूं लेकिन दुर्भाग्यवश, डेटा श्रृंखला में एनएएस हैं।आर फ़िल्टर() एनएएस

उदाहरण के लिए,

t <- seq(0, 1, len = 100)      
x <- c(sin(2*pi*t*2.3) + 0.25*rnorm(length(t)),NA, cos(2*pi*t*2.3) + 0.25*rnorm(length(t))) 

मैं Chebyshev फिल्टर का उपयोग कर रहा हूँ: cf1 = cheby1(5, 3, 1/44, type = "low")

मैं गंदगी आदेशों/स्थिति समय श्रृंखला NAS को बाहर फिल्टर करने के लिए कोशिश कर रहा हूँ, लेकिन नहीं। इसलिए, मैंने पहले ही na.rm=T की कोशिश की है, लेकिन ऐसा लगता है कि ऐसा कोई तर्क नहीं है। फिर

z <- filter(cf1, x) # apply filter 

धन्यवाद दोस्तों।

उत्तर

1

आप compelete.cases फ़ंक्शन का उपयोग करके पहले से एनएएस को हटा सकते हैं। आप लापता डेटा को लागू करने पर भी विचार कर सकते हैं। एमटीएसडीआई या अमेलिया II पैकेज देखें।

संपादित करें:

यहाँ Rcpp के साथ एक समाधान है। यह उपयोगी हो सकता है है की गति महत्वपूर्ण है:

require(inline) 
require(Rcpp) 
t <- seq(0, 1, len = 100) 
set.seed(7337) 
x <- c(sin(2*pi*t*2.3) + 0.25*rnorm(length(t)),NA, cos(2*pi*t*2.3) + 0.25*rnorm(length(t))) 
NAs <- x 
x2 <- x[!is.na(x)] 
#do something to x2 
src <- ' 
Rcpp::NumericVector vecX(vx); 
Rcpp::NumericVector vecNA(vNA); 
int j = 0; //counter for vx 
for (int i=0;i<vecNA.size();i++) { 
    if (!(R_IsNA(vecNA[i]))) { 
    //replace and update j 
    vecNA[i] = vecX[j]; 
    j++; 
    } 
} 
return Rcpp::wrap(vecNA); 
' 
fun <- cxxfunction(signature(vx="numeric", 
          vNA="numeric"), 
        src,plugin="Rcpp") 
if (identical(x,fun(x2,NAs))) 
    print("worked") 
# [1] "worked" 
+0

मैं बस सोच रहा हूं कि पूरा.case na.omit जैसा ही है। इसके अलावा, चूंकि मैं मनाई गई एसएसटी समय श्रृंखला का उपयोग कर रहा हूं, मुझे यकीन नहीं है कि गुम मूल्यों को इनपुट करना एक अच्छा विचार है या नहीं। –

+0

उम्मीद है कि यह अद्यतन समस्या हल करता है। – chandler

2

NAs को हटाने के लिए x <- x[!is.na(x)] का उपयोग करने का प्रयास करें, फिर फ़िल्टर चलाएं।

+0

खेद है, लेकिन अगर मैं na.omit उपयोग करते हैं, यह बड़े पैमाने पर आदेश, मैं सिर्फ फिल्टर शेष एनए के बाद एनए का मूल्य चाहते हैं, लेकिन अन्य सभी गैर-एनए मान प्रदान कर सकते हैं। –

+0

क्षमा करें, मुझे यकीन नहीं है कि आप क्या पूछ रहे हैं। क्या आप अपने मूल्यों को एक ही स्थिति में रखना चाहते हैं, और आपके डेटा में रिक्त स्थान हैं? –

+0

tseries पैकेज से na.remove() या na.remove.ts() होगा जो आप चाहते हैं? –

1

मैं ts वस्तुओं लापता मान हो सकते हैं, तो पता नहीं है, लेकिन अगर आप सिर्फ NA मूल्यों को फिर से सम्मिलित करना चाहते हैं, तो आप R.utils से ?insert उपयोग कर सकते हैं। ऐसा करने का एक बेहतर तरीका हो सकता है।

install.packages(c('R.utils', 'signal')) 
require(R.utils) 
require(signal) 
t <- seq(0, 1, len = 100)      
set.seed(7337) 
x <- c(sin(2*pi*t*2.3) + 0.25*rnorm(length(t)), NA, NA, cos(2*pi*t*2.3) + 0.25*rnorm(length(t)), NA) 
cf1 = cheby1(5, 3, 1/44, type = "low") 
xex <- na.omit(x) 
z <- filter(cf1, xex) # apply 
z <- as.numeric(z) 
for (m in attributes(xex)$na.action) { 
    z <- insert(z, ats = m, values = NA) 
} 
all.equal(is.na(z), is.na(x)) 
?insert 
0

यहां एक ऐसा फ़ंक्शन है जिसका उपयोग आप इसमें एनएएस के साथ सिग्नल फ़िल्टर करने के लिए कर सकते हैं। एनएएस को शून्य से प्रतिस्थापित करने के बजाय अनदेखा किया जाता है।

तब आप वजन का अधिकतम प्रतिशत निर्दिष्ट कर सकते हैं जो एनएएस फ़िल्टर किए गए सिग्नल के किसी भी बिंदु पर ले सकता है। यदि किसी विशिष्ट बिंदु पर बहुत से एनएएस (और बहुत कम वास्तविक डेटा) हैं, तो फ़िल्टर किए गए सिग्नल स्वयं को NA पर सेट कर दिए जाएंगे।

# This function applies a filter to a time series with potentially missing data 

filter_with_NA <- function(x, 
          window_length=12,       # will be applied centrally 
          myfilter=rep(1/window_length,window_length), # a boxcar filter by default 
          max_percentage_NA=25)      # which percentage of weight created by NA should not be exceeded 
{ 
    # make the signal longer at both sides 
    signal <- c(rep(NA,window_length),x,rep(NA,window_length)) 
    # see where data are present and not NA 
    present <- is.finite(signal) 

    # replace the NA values by zero 
    signal[!is.finite(signal)] <- 0 
    # apply the filter 
    filtered_signal <- as.numeric(filter(signal,myfilter, sides=2)) 

    # find out which percentage of the filtered signal was created by non-NA values 
    # this is easy because the filter is linear 
    original_weight <- as.numeric(filter(present,myfilter, sides=2)) 
    # where this is lower than one, the signal is now artificially smaller 
    # because we added zeros - compensate that 
    filtered_signal <- filtered_signal/original_weight 
    # but where there are too few values present, discard the signal 
    filtered_signal[100*(1-original_weight) > max_percentage_NA] <- NA 

    # cut away the padding to left and right which we previously inserted 
    filtered_signal <- filtered_signal[((window_length+1):(window_length+length(x)))] 
    return(filtered_signal) 
} 
संबंधित मुद्दे