# [S] Summary for Moving Range Control Chart Question

Marty Goss (goss@spk.hp.com)
Mon, 31 Aug 1998 08:55:49 -0700

Greetings,
I have received a handful of responses to my quest for a Moving Range
Control Chart and will summarize here for those that are interested.

>From Pat Welch I learned that the filter() function can be used to
calculate moving averages. Although it is a little convoluted for an
armchair statistician like me. He also offered a moving average function
that allows the window to expand over time.

```--

Jim Robinson-Cox offered a function, (three versions actually) to
calculated a statistic on a moving window.

moving.fn <- function(x, window.size, fun = mean)
{
result <- 1:(length(x) - window.size+1)
for(i in result)
result[i] <- fun(x[i:(i + window.size-1)])
result
}

Or if you are willing to use more memory to avoid a loop (which I
thought was the reason for avoiding loops).

move.fn <-  function(x,window.size,fun=mean){
lx <- length(x)
xmat <- matrix(x[1:window.size + rep(0:(lx-window.size),
rep(window.size,lx-window.size+1))],
nrow=window.size)
apply(xmat,2,fun)
}

Or a third version using lapply:

> move3.fn <- function(x,window.size,fun=mean){
+   len <- length(x)-window.size+1
+   xsplit <- vector("list",len)
+   for(i in 1:len) xsplit[[i]] <- x[1:window.size + i-1]
+   unlist(lapply(xsplit,fun))
+ }

> x
[1] 47 25 38 46 45 44 31 27 50 35
> move.fn(x,3)
[1] 36.66667 36.33333 43.00000 45.00000 40.00000 34.00000 36.00000
37.33333
> move.fn(x,3,max) - move.fn(x,3,min)
[1] 22 21  8  2 14 17 23 23

Then to make a Moving Range control chart use the function to find the
moving range and plot the line. Control limits and such would have to be
developed and and added to make the whole thing complete. This is a
nicely simple solution.

> x <- c( 47, 25, 38, 46, 45, 44, 31, 27, 50, 35)

> moving.fn(x,3)  ## mean is default
[1] 39.00 38.50 43.25 41.50 36.75 38.00 35.75

Do it with max - min to get range:
>  mv.range <- moving.fn(x,3,max)-moving.fn(x,3,min)
> mv.range
[1] 22 21  8 15 18 23 23

so then you just plot as in:

plot(1:length(mv.range), mv.range, type="b", xlab="Run", ylab="Moving
Range")

--

Daniel Rie suppplied the pot of gold in his response pointing to
qtoolbox, (worth repeating that you can find it at
http://www.dms.csiro.au/world/S-PLUS/qtoolbox/). I haven't tried out the
actually code yet but the manual tells me it has the moving average and
moving range charts for individual values that are just what I wanted to
find. There are a number of other quality control goodies that look
interesting also.

--
Thanks to all that took time to think about my problem.
Marty Goss
--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Marty Goss                Hewlett Packard
goss@spk.hp.com           24001 E. Mission Ave
Telnet 921-3734           Liberty Lake,  WA  99019-9599
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-----------------------------------------------------------------------
This message was distributed by s-news@wubios.wustl.edu.  To unsubscribe
send e-mail to s-news-request@wubios.wustl.edu with the BODY of the
message:  unsubscribe s-news

Next message: Alice Ling: "[S] Using ODBC/SQL to import time data"
Previous message: Andrew Bruce: "Re: [S] S-PLUS 4.5 Network Edition"

```