#include <stdio.h>
#include <math.h>
#define N 100
// 计算样本相关系数,并输出
void calculateCorrelationCoefficient(double x[], double y[], int n)
{
double sumX = 0.0, sumY = 0.0, sumXY = 0.0, sumXX = 0.0, sumYY = 0.0;
for (int i = 0; i < n; i++)
{
sumX += x[i];
sumY += y[i];
sumXY += x[i] * y[i];
sumXX += x[i] * x[i];
sumYY += y[i] * y[i];
}
double meanX = sumX / n;
double meanY = sumY / n;
double numerator = sumXY - n * meanX * meanY;
double denominator = sqrt(sumXX - n * meanX * meanX) * sqrt(sumYY - n * meanY * meanY);
double correlation = numerator / denominator;
printf("样本相关系数r:%.3f\n", correlation);
}
// 计算经验回归方程,并输出
void calculateLinearRegression(double x[], double y[], int n)
{
double sumX = 0.0, sumY = 0.0, sumXY = 0.0, sumXX = 0.0;
for (int i = 0; i < n; i++)
{
sumX += x[i];
sumY += y[i];
sumXY += x[i] * y[i];
sumXX += x[i] * x[i];
}
double meanX = sumX / n;
double meanY = sumY / n;
double b = (sumXY - n * meanX * meanY) / (sumXX - n * meanX * meanX);
double a = meanY - b * meanX;
printf("经验回归方程:y = %.3fx %c %.3f\n", b, a < 0 ? '-' : '+', fabs(a));
}
// 计算拟合效果R方,并输出
void calculateRSquared(double x[], double y[], int n)
{
double sumX = 0.0, sumY = 0.0, sumXY = 0.0, sumXX = 0.0, sumYY = 0.0;
for (int i = 0; i < n; i++)
{
sumX += x[i];
sumY += y[i];
sumXY += x[i] * y[i];
sumXX += x[i] * x[i];
sumYY += y[i] * y[i];
}
double meanX = sumX / n;
double meanY = sumY / n;
double numerator = n * sumXY - sumX * sumY;
double denominator = sqrt((n * sumXX - sumX * sumX) * (n * sumYY - sumY * sumY));
double RR = (numerator * numerator) / (denominator * denominator);
printf("拟合效果R方:%.3f\n", RR);
}
int main()
{
int n;
double x[N], y[N];
printf("请输入数据组数n:");
scanf("%d", &n);
printf("X:");
for (int i = 0; i < n; i++)
{
scanf("%lf", &x[i]);
}
printf("Y:");
for (int i = 0; i < n; i++)
{
scanf("%lf", &y[i]);
}
calculateCorrelationCoefficient(x, y, n);
calculateLinearRegression(x, y, n);
calculateRSquared(x, y, n);
return 0;
}
数学中计算 相关系数r和经验回归方程
于 2024-03-26 17:50:23 首次发布