Effacer les filtres
Effacer les filtres

Calculate standard deviation given frequency counts rather than sample

4 vues (au cours des 30 derniers jours)
the cyclist
the cyclist le 27 Août 2013
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?

Réponse acceptée

dpb
dpb le 27 Août 2013
Modifié(e) : dpb le 27 Août 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 commentaires
the cyclist
the cyclist le 27 Août 2013
Patience! Not every pounces on the answers within minutes. :-)
dpb
dpb le 27 Août 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)

Connectez-vous pour commenter.

Plus de réponses (1)

Iain
Iain le 27 Août 2013
Modifié(e) : Iain le 27 Août 2013
mu = (A(:,1).*A(:,2)) ./ sum(A(:,1));
std =sqrt(sum(A(:,1).*(A(:,2)-mu).^2)) ./(sum(A(:,1))-1));
  2 commentaires
the cyclist
the cyclist le 27 Août 2013
This gives vector results for mu and std, so guessing you are missing an operation.
Iain
Iain le 27 Août 2013
Yup, I'm missing a sum here or there:
mu = sum(A(:,1).*A(:,2)) ./ sum(A(:,1));

Connectez-vous pour commenter.

Community Treasure Hunt

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

Start Hunting!

Translated by