Calculate standard deviation given frequency counts rather than sample

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?

 Respuesta aceptada

dpb
dpb el 27 de Ag. de 2013
Editada: dpb el 27 de Ag. de 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 comentarios

No accept??? :)
Patience! Not every pounces on the answers within minutes. :-)
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)

Iniciar sesión para comentar.

Más respuestas (1)

Iain
Iain el 27 de Ag. de 2013
Editada: Iain el 27 de Ag. de 2013
mu = (A(:,1).*A(:,2)) ./ sum(A(:,1));
std =sqrt(sum(A(:,1).*(A(:,2)-mu).^2)) ./(sum(A(:,1))-1));

2 comentarios

This gives vector results for mu and std, so guessing you are missing an operation.
Yup, I'm missing a sum here or there:
mu = sum(A(:,1).*A(:,2)) ./ sum(A(:,1));

Iniciar sesión para comentar.

Categorías

Más información sobre Numerical Integration and Differential Equations en Centro de ayuda y File Exchange.

Etiquetas

Preguntada:

el 27 de Ag. de 2013

Community Treasure Hunt

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

Start Hunting!

Translated by