Link to home
Start Free TrialLog in
Avatar of pgmerLA
pgmerLA

asked on

std deviation and dynamic array

Hi, I have to calculate the standard deviation and use dynamic array.
When I double check with excel, both my results don't match.
could you tell me what I am doing wrong in my code?
Thanks.

Ps: the professor provided us with the std deviation formula:
sd= 1/(n-1)[ Sum(x^2)-1/(n-1)[(Sum(x))^2] ]

thanks for the help.

I have entered 6 numbers: 2 2 3 3 4 4.
in excel I get: .89
in my code: .8.....why???
#include<iostream>
#include<iomanip>

using namespace std;

int main(){

	int n=0;
	cout<<"How many data: ";
	cin>>n;
	int *a= new int[n];

	cout<<"Enter "<<n<<" data: ";
	for (int i=0;i<n;++i)
		cin>>a[i];

	//sdt deviation
	double sd =0;
	int sumXsquare =0, sumx =0;
	for(int i=0;i<n;++i)
	{sumx+=a[i];
	sumXsquare += a[i]*a[i];
	}
	sd = (1.0/(n-1))*(sumXsquare-((1.0/n)*(sumx*sumx)));

	cout<<"Standard Deviation = "<<setprecision(4)<<sd<<endl;


return 0;
}

Open in new window

Avatar of Zoppo
Zoppo
Flag of Germany image

Hi pgmerLA,

IMO you 'n' instead of (n-1) at '... sumXsquare-((1.0/n)...' - shouldn't this be '... sumXsquare-((1.0/(n-1)) ...'?

ZOPPO
ASKER CERTIFIED SOLUTION
Avatar of Infinity08
Infinity08
Flag of Belgium image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of phoffric
phoffric

Just some arithmetic to show equivalences:

If sigma = sqrt( Sum((xi - mu)²) / n )
then
n sigma²
= Sum(  (xi - mu)²  )
= sum( xi² - 2 xi mu + mu² )
= sum(xi²) - 2mu sum(xi) + mu² * sum(1)
= sum(xi²) - 2mu sum(xi) + n mu²

But mu = sum(xi)/n
==> sum(xi) = n mu

Then
n sigma² = Sum(  (xi - mu)²  )
= sum(xi²) - 2mu sum(xi) + n mu²
= sum(xi²) - 2mu  (n mu)  + n mu²
= sum(xi²) - 2 n mu²    + n mu²
= sum(xi²) - n mu²

sigma² = ( sum(xi²) - n mu² )/n = ( sum(xi²)/n - mu² )
sigma = sqrt( sum(xi²)/n - mu² )


The (n-1) term in the OP (instead of n) is related to a particular method of sampling populations IIRC.
>> Just some arithmetic to show equivalences:

You put a bit more effort into it than me ;)

That would mean that the formula from the question (assuming the second (n-1) was supposed to be n) is meant to calculate the sample variance, and not the standard deviation. In which case, 0.8 is the right answer.
Or, assuming that the sqrt got lost while copy-pasting the formula, it would be meant to calculate the sample standard deviation. In which case 0.89 is the right answer.

Neither of these is the standard deviation though (as I mentioned earlier). So, if you actually want to calculate the standard deviation, you'll have to use the formula I mentioned in my previous post, and you should get the result 0.81650
@pgmerLA : could you explain how that post (http:#35465466) answers your question, please ? It seems I completely misunderstood what your problem was. It appeared to me that your question was about what you were doing wrong in the code, and why you were getting 0.8 as the result.
Avatar of pgmerLA

ASKER

@Infinity08:I added sqrt to my formula and it worked. I actually wanted to give you the points. I did too fast.
How can I retract it?
>> How can I retract it?

You can click the "Request Attention" button, and ask a moderator to re-open the question.

Thanks for clarifying :)