Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Moving variance in R

Tags:

r

I know that the filter() function in R calculate the moving average. I would like to know if exists a function that return me the moving variance or standard deviation, in order to show it in a plot side by side with the output of filter() function.

like image 412
emanuele Avatar asked Nov 02 '12 12:11

emanuele


People also ask

How do you write variance in R?

In R, sample variance is calculated with the var() function. In those rare cases where you need a population variance, use the population mean to calculate the sample variance and multiply the result by (n-1)/n; note that as sample size gets very large, sample variance converges on the population variance.

What is the function for variance in R?

var() function in R Language computes the sample variance of a vector. It is the measure of how much value is away from the mean value.

How does R calculate software variance?

var(data)*(n-1)/n So, we can use the following simple calculation to retrieve the population variance from sample data. Since var() in R provides the sample variance, we can multiply var() with (n-1)/n to get the population variance.

Which R syntax is used to find out variance of the data?

The var() function in R can be used to calculate sample variance. The population variance can be calculated by multiplying the sample variance by (n-1)/n as follows. It's important to remember that the population variance is always lower than the sample variance.


2 Answers

Consider the zoo package. For example filter() gives:

> filter(1:100, rep(1/3,3)) Time Series: Start = 1  End = 100  Frequency = 1    [1] NA  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25  [26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50  [51] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75  [76] 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 NA 

whereas rollmean() in zoo gives:

> rollmean(1:100, k = 3, na.pad = TRUE)   [1] NA  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25  [26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50  [51] 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75  [76] 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 NA 

which is the same (for a 3 point moving average in this example).

Whilst zoo doesn't have a rollsd() or rollvar() it does have rollapply(), which works like the apply() functions to apply any R function to the specified window.

> rollapply(1:100, width = 3, FUN = sd, na.pad = TRUE)   [1] NA  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  [26]  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  [51]  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  [76]  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 NA Warning message: In rollapply.zoo(zoo(data), ...) : na.pad argument is deprecated 

or on something more interesting:

> rollapply(vec, width = 3, FUN = sd, na.pad = TRUE)   [1]        NA 0.3655067 0.8472871 0.5660495 0.3491970 0.4732417 0.9236859   [8] 0.8075226 1.8725851 1.1930784 0.6329325 1.1412416 0.8430772 0.5808005  [15] 0.3838545 1.1738170 1.1655400 1.3241700 0.6876834 0.1534157 0.4858477  [22] 0.9843506 0.6002713 0.6897541 2.0619563 2.5675788 6.3522039 6.0066864  [29] 6.2618432 5.1704866 2.1360853 2.5602557 1.0408528 1.0316396 4.9441628  [36] 5.0319314 5.7589716 3.2425000 4.8788158 2.0847286 4.5199291 2.5323486  [43] 2.1987149 1.8393000 1.2278639 1.5998965 1.5341485 4.4287108 4.4159166  [50] 4.3224546 3.6959067 4.9826264 5.3134044 8.4084322 9.1249234 7.5506725  [57] 3.8499136 3.9680487 5.6362296 4.9124095 4.3452706 4.0227141 4.5867559  [64] 4.7350394 4.3203807 4.4506799 7.2759499 7.6536424 7.8487654 2.0905576  [71] 4.0056880 5.6209853 1.5551659 1.3615268 2.8469458 2.8323588 1.9848578  [78] 1.1201124 1.4248380 1.7802571 1.4281773 2.5481935 1.8554451 1.0925410  [85] 2.1823722 2.2788755 2.4205378 2.0733741 0.7462248 1.3873578 1.4265948  [92] 0.7212619 0.7425993 1.0696432 2.4520585 3.0555819 3.1000885 1.0945292  [99] 0.3726928        NA Warning message: In rollapply.zoo(zoo(data), ...) : na.pad argument is deprecated 

You can get rid of the warning by using the fill = NA argument, as in

> rollapply(vec, width = 3, FUN = sd, fill = NA) 
like image 191
Gavin Simpson Avatar answered Oct 02 '22 17:10

Gavin Simpson


The TTR package has runSD among others:

> library(TTR) > ls("package:TTR", pattern="run*")  [1] "runCor"    "runCov"    "runMAD"    "runMax"    "runMean"    [6] "runMedian" "runMin"    "runSD"     "runSum"    "runVar" 

runSD will be much faster than rollapply because it avoids making many R function calls. For example:

rzoo <- function(x,n) rollapplyr(x, n, sd, fill=NA) rttr <- function(x,n) runSD(x, n) library(rbenchmark) set.seed(21) x <- rnorm(1e4) all.equal(rzoo(x,250), rttr(x,250)) # [1] TRUE benchmark(rzoo(x,250), rttr(x,250))[,1:6] #           test replications elapsed relative user.self sys.self # 2 rttr(x, 250)          100    0.58    1.000      0.58     0.00 # 1 rzoo(x, 250)          100   54.53   94.017     53.85     0.06 
like image 27
Joshua Ulrich Avatar answered Oct 02 '22 17:10

Joshua Ulrich