Calculate standard deviation given frequency counts rather than sample
8 views (last 30 days)
Show older comments
Given a sample x
x = [1 1 1 1 2 2 2 3 3 3 3 4 5 6 6];
it is trivial to calculate the standard deviation:
s = std(x);
Suppose instead of x, I have the an array with the frequency counts of x:
A = [4 1;
3 2;
4 3;
1 4;
1 5;
2 6];
What's an elegant way to calculate the standard deviation, without needing to reconstruct x along the way?
0 Comments
Accepted Answer
dpb
on 27 Aug 2013
Edited: dpb
on 27 Aug 2013
One way,
>> m=dot(a(:,1)',a(:,2))/sum(a(:,1))
m =
2.8667
>> s=sqrt(dot([[a(:,2)-m]'].^2,a(:,1))/(sum(a(:,1))-1))
s =
1.7265
>> [mean(x) std(x)]
ans =
2.8667 1.7265
>>
4 Comments
dpb
on 27 Aug 2013
Chuckles...
This implementation is, of course, straightforward and for small sample sizes and well-behaved inputs should be fine. You're at the mercy of data order for computation of course, so isn't as robust as might be (and as I presume the builtin mean/std functions are)
See Also
Categories
Find more on Smoothing 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!