How to calculate Trailing Moving Sums going up vertically in a table?
3 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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!
0 commentaires
Réponse acceptée
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
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;
Plus de réponses (0)
Voir également
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!