Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

simple examples of filter function, recursive option specifically

I am seeking some simple (i.e. - no maths notation, long-form reproducible code) examples for the filter function in R I think I have my head around the convolution method, but am stuck at generalising the recursive option. I have read and battled with various documentation, but the help is just a bit opaque to me.

Here are the examples I have figured out so far:

# Set some values for filter components f1 <- 1; f2 <- 1; f3 <- 1; 

And on we go:

# basic convolution filter filter(1:5,f1,method="convolution") [1] 1 2 3 4 5  #equivalent to: x[1] * f1  x[2] * f1  x[3] * f1  x[4] * f1  x[5] * f1   # convolution with 2 coefficients in filter filter(1:5,c(f1,f2),method="convolution") [1]  3  5  7  9 NA  #equivalent to: x[1] * f2 + x[2] * f1 x[2] * f2 + x[3] * f1 x[3] * f2 + x[4] * f1  x[4] * f2 + x[5] * f1  x[5] * f2 + x[6] * f1  # convolution with 3 coefficients in filter filter(1:5,c(f1,f2,f3),method="convolution") [1] NA  6  9 12 NA  #equivalent to:  NA  * f3 + x[1] * f2 + x[2] * f1  #x[0] = doesn't exist/NA x[1] * f3 + x[2] * f2 + x[3] * f1 x[2] * f3 + x[3] * f2 + x[4] * f1  x[3] * f3 + x[4] * f2 + x[5] * f1  x[4] * f3 + x[5] * f2 + x[6] * f1 

Now's when I am hurting my poor little brain stem. I managed to figure out the most basic example using info at this post: https://stackoverflow.com/a/11552765/496803

filter(1:5, f1, method="recursive") [1]  1  3  6 10 15  #equivalent to:  x[1] x[2] + f1*x[1] x[3] + f1*x[2] + f1^2*x[1] x[4] + f1*x[3] + f1^2*x[2] + f1^3*x[1] x[5] + f1*x[4] + f1^2*x[3] + f1^3*x[2] + f1^4*x[1] 

Can someone provide similar code to what I have above for the convolution examples for the recursive version with filter = c(f1,f2) and filter = c(f1,f2,f3)?

Answers should match the results from the function:

filter(1:5, c(f1,f2), method="recursive") [1]  1  3  7 14 26  filter(1:5, c(f1,f2,f3), method="recursive") [1]  1  3  7 15 30 

EDIT

To finalise using @agstudy's neat answer:

> filter(1:5, f1, method="recursive") Time Series: Start = 1  End = 5  Frequency = 1  [1]  1  3  6 10 15 > y1 <- x[1]                                             > y2 <- x[2] + f1*y1       > y3 <- x[3] + f1*y2  > y4 <- x[4] + f1*y3  > y5 <- x[5] + f1*y4  > c(y1,y2,y3,y4,y5) [1]  1  3  6 10 15 

and...

> filter(1:5, c(f1,f2), method="recursive") Time Series: Start = 1  End = 5  Frequency = 1  [1]  1  3  7 14 26 > y1 <- x[1]                                             > y2 <- x[2] + f1*y1       > y3 <- x[3] + f1*y2 + f2*y1 > y4 <- x[4] + f1*y3 + f2*y2 > y5 <- x[5] + f1*y4 + f2*y3 > c(y1,y2,y3,y4,y5) [1]  1  3  7 14 26 

and...

> filter(1:5, c(f1,f2,f3), method="recursive") Time Series: Start = 1  End = 5  Frequency = 1  [1]  1  3  7 15 30 > y1 <- x[1]                                             > y2 <- x[2] + f1*y1       > y3 <- x[3] + f1*y2 + f2*y1 > y4 <- x[4] + f1*y3 + f2*y2 + f3*y1 > y5 <- x[5] + f1*y4 + f2*y3 + f3*y2 > c(y1,y2,y3,y4,y5) [1]  1  3  7 15 30 
like image 351
thelatemail Avatar asked Jan 17 '13 05:01

thelatemail


People also ask

What is the syntax of the filter function?

Syntax. The FILTER function filters an array based on a Boolean (True/False) array. =FILTER(array,include,[if_empty]) Argument.

What is the output of filter function?

Output: The filtered letters are: e e. Application: It is normally used with Lambda functions to separate list, tuple, or sets. # a list contains both even and odd numbers. seq = [ 0 , 1 , 2 , 3 , 5 , 8 , 13 ]


2 Answers

In the recursive case, I think no need to expand the expression in terms of xi. The key with "recursive" is to express the right hand expression in terms of previous y's.

I prefer thinking in terms of filter size.

filter size =1

y1 <- x1                                             y2 <- x2 + f1*y1       y3 <- x3 + f1*y2  y4 <- x4 + f1*y3  y5 <- x5 + f1*y4  

filter size = 2

y1 <- x1                                             y2 <- x2 + f1*y1       y3 <- x3 + f1*y2 + f2*y1    # apply the filter for the past value and add current input y4 <- x4 + f1*y3 + f2*y2 y5 <- x5 + f1*y4 + f2*y3 
like image 126
agstudy Avatar answered Sep 25 '22 17:09

agstudy


Here's the example that I've found most helpful in visualizing what recursive filtering is really doing:

(x <- rep(1, 10)) # [1] 1 1 1 1 1 1 1 1 1 1  as.vector(filter(x, c(1), method="recursive"))  ## Equivalent to cumsum() #  [1]  1  2  3  4  5  6  7  8  9 10 as.vector(filter(x, c(0,1), method="recursive")) #  [1] 1 1 2 2 3 3 4 4 5 5 as.vector(filter(x, c(0,0,1), method="recursive")) #  [1] 1 1 1 2 2 2 3 3 3 4 as.vector(filter(x, c(0,0,0,1), method="recursive")) #  [1] 1 1 1 1 2 2 2 2 3 3 as.vector(filter(x, c(0,0,0,0,1), method="recursive")) #  [1] 1 1 1 1 1 2 2 2 2 2 
like image 24
Josh O'Brien Avatar answered Sep 26 '22 17:09

Josh O'Brien