?
Solved

std deviation and dynamic array

Posted on 2011-04-26
8
Medium Priority
?
604 Views
Last Modified: 2012-05-11
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

0
Comment
Question by:pgmerLA
7 Comments
 
LVL 31

Expert Comment

by:Zoppo
ID: 35465065
Hi pgmerLA,

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

ZOPPO
0
 
LVL 53

Accepted Solution

by:
Infinity08 earned 2000 total points
ID: 35465359
>> sd= 1/(n-1)[ Sum(x^2)-1/(n-1)[(Sum(x))^2] ]

That formula doesn't look like any standard deviation formula I know.


>> When I double check with excel, both my results don't match.

Be aware that the STDEV function in Excel does NOT calculate the standard deviation. It calculates the sample standard deviation :

        http://office.microsoft.com/en-us/excel-help/stdev-HP005209277.aspx

To calculate the standard deviation in Excel, use STDEVP :

        http://office.microsoft.com/en-us/excel-help/stdevp-HP005209281.aspx?CTT=1



>> in my code: .8.....why???

0.8 happens to be the sample variance  (ie. the square of the sample standard deviation). But that might be by accident rather than by design :)



The standard deviation of the 6 values you entered would be 0.81650, and is obtained using the formula :

        mu = Sum(xi) / n                              <--- average (mean)
        sigma = sqrt( Sum((xi - mu)²) / n )   <--- standard deviation
0
 
LVL 33

Expert Comment

by:phoffric
ID: 35465466
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.
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 53

Expert Comment

by:Infinity08
ID: 35465569
>> 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
0
 
LVL 53

Expert Comment

by:Infinity08
ID: 35468871
@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.
0
 

Author Comment

by:pgmerLA
ID: 35471352
@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?
0
 
LVL 53

Expert Comment

by:Infinity08
ID: 35472909
>> How can I retract it?

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

Thanks for clarifying :)
0

Featured Post

Free Tool: Site Down Detector

Helpful to verify reports of your own downtime, or to double check a downed website you are trying to access.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Errors will happen. It is a fact of life for the programmer. How and when errors are detected have a great impact on quality and cost of a product. It is better to detect errors at compile time, when possible and practical. Errors that make their wa…
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

616 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question