Borrar filtros
Borrar filtros

Calculate standard deviation given frequency counts rather than sample

4 visualizaciones (últimos 30 días)
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
the cyclist
the cyclist el 27 de Ag. de 2013
Patience! Not every pounces on the answers within minutes. :-)
dpb
dpb el 27 de Ag. de 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)

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
the cyclist
the cyclist el 27 de Ag. de 2013
This gives vector results for mu and std, so guessing you are missing an operation.
Iain
Iain el 27 de Ag. de 2013
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 Smoothing en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by