I need to "undo" an average. The problem is I don't have the whole series of
data; I have only the initial average and, periodically, a new value to be
averaged in.
So, let's say a user hands me a pre-computed average. I want to take that
average, and whenever I get a new value of the series, I want to "expand" the
precomputed average, drop off its leading (oldest) value, append the new value,
and redo the average. Then I would use this new average as my "precomputed"
average.
One wrinkle is that the average is weighted. In particular, the newest value
is always weighted by some user-specified factor (all other weights are 1).
The initial user-provided precomputed average has already taken this into
account for the first iteration, and my code is responsible for taking it into
account for any new values.
Concretely, I would like to emulate this J verb:
L =: ?.~10 NB. Original list -- I won't have access to
this.
wmr =: 3 NB. Weight Most Recent value by a factor of 3
movingAvg =: dyad define
L =: y,}:L
(+/%#) (x*{.L) , }.L
)
wmr movingAvg 10
7
wmr movingAvg 5
5.8
wmr movingAvg 8
6.4
wmr movingAvg 9
7.2
except that I do not have access to the original series of data L . In my
scenario, my initial inputs would be wmr and (+/%#) (wmr*{.L) , }.L and,
later, the values 10 5 8 9 (spread out over time). Ideally, I would like to
avoid keeping any kind of list (e.g., of the new values as they come in).
Is this possible?
-Dan
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm