Azzera filtri
Azzera filtri

Calculate standard deviation given frequency counts rather than sample

4 visualizzazioni (ultimi 30 giorni)
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?

Risposta accettata

dpb
dpb il 27 Ago 2013
Modificato: dpb il 27 Ago 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 Commenti
the cyclist
the cyclist il 27 Ago 2013
Patience! Not every pounces on the answers within minutes. :-)
dpb
dpb il 27 Ago 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)

Accedi per commentare.

Più risposte (1)

Iain
Iain il 27 Ago 2013
Modificato: Iain il 27 Ago 2013
mu = (A(:,1).*A(:,2)) ./ sum(A(:,1));
std =sqrt(sum(A(:,1).*(A(:,2)-mu).^2)) ./(sum(A(:,1))-1));
  2 Commenti
the cyclist
the cyclist il 27 Ago 2013
This gives vector results for mu and std, so guessing you are missing an operation.
Iain
Iain il 27 Ago 2013
Yup, I'm missing a sum here or there:
mu = sum(A(:,1).*A(:,2)) ./ sum(A(:,1));

Accedi per commentare.

Community Treasure Hunt

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

Start Hunting!

Translated by