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

3 vues (au cours des 30 derniers jours)
John
John le 28 Déc 2016
Commenté : John le 31 Déc 2016
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!

Réponse acceptée

Image Analyst
Image Analyst le 28 Déc 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 commentaires
Image Analyst
Image Analyst le 30 Déc 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;
John
John le 31 Déc 2016
Perfect, thank you!

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Data Type Conversion dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by