我在C编程类中写了一个程序来获取2组实数的相关系数。我已经给出了方程,它引用了维基百科,所以我仔细检查了那里的方程。这里是公式,这似乎是从我的研究非常标准的链接:Odd Pearson相关系数结果
我写的程序,但是当我跑了我得到的数字比1我的结果时,我知道这是不正确的。我查了几遍代码,但找不到任何不合适的地方,所以我试着用n除以n而不是n,这给了我预期的-1到1范围的值,所以我测试了它针对我在网上找到的数据值以及相关系数计算器(http://easycalculation.com/statistics/correlation.php),现在我得到了我输入的所有数字的正确结果。我无法弄清楚这是为什么,所以我想我可以在这里得到一些帮助。这里是我的程序代码,如果还有什么突出的,我在这里做错了,我很想听听一些建议,但主要是我试图找出为什么我得到正确的结果与出现是一个错误的等式。
然后它将读取两个数组(x和y)的值,然后计算两组数字之间的相关系数。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void) {
int n; /* value to determine array length */
/* declare variables to hold results for each equation for x and y
initialize all to zero to prepare for summation */
float r = 0.0, xbar = 0.0, ybar = 0.0, sx = 0.0, sy = 0.0;
/*get number n input from user */
printf("Please enter a number n: ");
scanf("%d", &n);
if(n < 1) {
printf("n must be a positive number.\nPlease enter a new value: ");
scanf("%d", &n);
if(n < 1) {
printf("Invalid input, exiting...\n");
return 0;
}
}
/*initialize arrays x and y with length of n */
float x[n], y[n];
/*use for loop to read in values of x*/
int i;
for(i = 0; i < n; ++i) {
printf("Please enter a number for x: ");
scanf("%f", &x[i]);
}
/*use for loop to read in values of y*/
for(i = 0; i < n; ++i) {
printf("Please enter a number for y: ");
scanf("%f", &y[i]);
}
/*compute xbar */
for(i = 0; i < n; ++i) {
xbar += x[i];
}
xbar /= n;
/*compute ybar*/
for(i = 0; i < n; ++i) {
ybar += y[i];
}
ybar /= n;
/* compute standard deviation of x*/
for(i = 0; i < n; ++i) {
sx += (x[i] - xbar) * (x[i] - xbar);
}
sx = sqrt((sx/n));
/* compute standard deviation of y */
for(i = 0; i < n; ++i) {
sy += (y[i] - ybar) * (y[i] - ybar);
}
sy = sqrt((sy/n));
/*compute r, the correlation coefficient between the two arrays */
for(i = 0; i < n; ++i) {
r += (((x[i] - xbar)/sx) * ((y[i] - ybar)/sy));
}
r /= (n); /* originally divided by n-1, but gave incorrect results
dividing by n instead produces the desired output */
/* print results */
printf("The correlation coefficient of the entered lists is: %6.4f\n", r);
return 0;
}
(它看起来像我的代码格式不工作,对此深表遗憾。使用标签和按钮尝试,但不能弄明白。它看起来像我得到了它有些工作,比以前更好。)
你能发布格式化的代码吗?这将使它更容易遵循。 – Mick 2010-01-28 09:34:21
您是否尝试过使用'double'或甚至'long double'而不是'float'? – kennytm 2010-01-28 09:34:39
@David:新的格式比以前更糟::(缩进4个空格或1个标签来标记一段代码,在发布之前查看预览 – kennytm 2010-01-28 09:39:14