Clear Filters
Clear Filters

How to calculate Trailing Moving Sums going up vertically in a table?

1 view (last 30 days)
I have the following table:
- - -
Columns 'L' and 'U' consist of cells that contain object names that correspond to the headers in columns 4-281. Example for ABC.L{1,1} :
- - -
Goal: For every date verify what objects are in 'L' (respectively 'U') and sum the aggregate of those objects' 4-point trailing moving sum and its standard deviation (going up in the table!) and store it in a new variable, e.g. LSum and LStd for 'L' as well as USum and UStd for 'U'. For dates with insufficient values, e.g. 15-Jul-2016 with only 3 instead of 4 time steps ahead, return NaN's.
- - -
How I would start:
for row=1:size(ABC,1)
row_values = ABC{row,:};
row_values = row_values(4:end);
% How to make the loop for columns L and U where there are multiple objects in one cell?
% How can I use 'movsum' and 'movstd' here to calculate values vertically going up?
end;
Thanks a lot for your help!

Accepted Answer

Image Analyst
Image Analyst on 28 Dec 2016
Extract the column of data, then use conv() to sum up the counts and values, then divide them.
column = randi(9, 11, 1) % Sample data
kernel = [0;0;0;1;1;1;1]; % Tell it to use a kernel that will compute the trailing 4 values.
onesVector = ones(length(column), 1);
cellSum = conv(onesVector, kernel, 'same')
valuesSum = conv(column, kernel, 'same')
trailingMean = valuesSum ./ cellSum
  8 Comments
Image Analyst
Image Analyst on 30 Dec 2016
You're correct, and so is my code. Look:
K>> thisColumn(1:4)
ans =
0.0376999566108383
0.00945625359211284
-0.0037372516115108
0.0400936676870531
K>> valuesSum(4)
ans =
0.0835126262784934
I don't know where you got that 0.0209 number.
How you handle what they call "edge effects" is a judgment call. There are several ways you can do it. What I did was to have a shrinking window as it nears the edges. If you want to avoid the first 3 completely, then you can call conv() or conv2() with the 'valid' option and it won't move the window closer to the edge if the window would leave the array. However this way will leave you with 3 fewer rows than your data so row 1 corresponds to row 4 of your data. This is fine as long as you remember that fact. Or you can do what I did and have a shrinking window and then just replace all the elements in the first 3 rows with nans after the loop has finished:
trailingMean(1:3, :) = nan;

Sign in to comment.

More Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!