R² 値の出力
この最終ステップでは、ファイルからデータを読み込み、回帰パラメータを計算し、詳細な解釈とともに R² 値を出力する包括的なプログラムを作成します。
まず、サンプルデータファイルを作成します。
cd ~/project
nano regression_data.txt
サンプル回帰データを追加します。
1.0 2.0
2.0 4.0
3.0 5.0
4.0 4.0
5.0 5.0
次に、最終的な R² 計算プログラムを作成します。
nano r_squared_print.c
以下のコードを入力します。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 線形回帰パラメータを計算する関数
void calculateRegressionParameters(double *x, double *y, int n,
double *slope, double *intercept) {
double sum_x = 0, sum_y = 0, sum_xy = 0, sum_x_squared = 0;
for (int i = 0; i < n; i++) {
sum_x += x[i];
sum_y += y[i];
sum_xy += x[i] * y[i];
sum_x_squared += x[i] * x[i];
}
// 最小二乗法を用いて傾きと切片を計算
*slope = (n * sum_xy - sum_x * sum_y) / (n * sum_x_squared - sum_x * sum_x);
*intercept = (sum_y - *slope * sum_x) / n;
}
// R-二乗を計算する関数
double computeRSquared(double *x, double *y, int n, double slope, double intercept) {
double total_variation = 0.0;
double explained_variation = 0.0;
double y_mean = 0.0;
// y の平均を計算
for (int i = 0; i < n; i++) {
y_mean += y[i];
}
y_mean /= n;
// 変動を計算
for (int i = 0; i < n; i++) {
total_variation += pow(y[i] - y_mean, 2);
double predicted_y = slope * x[i] + intercept;
explained_variation += pow(y[i] - predicted_y, 2);
}
// R-二乗を計算
return 1 - (explained_variation / total_variation);
}
// R-二乗値を解釈する関数
void interpretRSquared(double r_squared) {
printf("\nR² の解釈:\n");
if (r_squared < 0.3) {
printf("適合度が低いモデル:モデルは変動の 30% 未満を説明しています。\n");
} else if (r_squared < 0.5) {
printf("適合度が中程度のモデル:モデルは変動の 30-50% を説明しています。\n");
} else if (r_squared < 0.7) {
printf("適合度の良いモデル:モデルは変動の 50-70% を説明しています。\n");
} else {
printf("適合度の優れたモデル:モデルは変動の 70% 以上を説明しています。\n");
}
}
int main() {
FILE *file;
int n = 0, max_lines = 100;
double x[100], y[100];
double slope, intercept, r_squared;
// データファイルを開く
file = fopen("regression_data.txt", "r");
if (file == NULL) {
printf("ファイルを開くことができませんでした!\n");
return 1;
}
// ファイルからデータを読み込む
while (fscanf(file, "%lf %lf", &x[n], &y[n]) == 2) {
n++;
if (n >= max_lines) break;
}
fclose(file);
// 回帰パラメータを計算
calculateRegressionParameters(x, y, n, &slope, &intercept);
// R-二乗を計算
r_squared = computeRSquared(x, y, n, slope, intercept);
// 結果を出力
printf("回帰分析結果:\n");
printf("データポイント数:%d\n", n);
printf("傾き:%.4f\n", slope);
printf("切片:%.4f\n", intercept);
printf("R-二乗 (R²): %.4f\n", r_squared);
// R-二乗を解釈
interpretRSquared(r_squared);
return 0;
}
プログラムをコンパイルします。
gcc -o r_squared_print r_squared_print.c -lm
プログラムを実行します。
./r_squared_print
出力例:
回帰分析結果:
データポイント数: 5
傾き: 0.6000
切片: 1.5000
R-二乗 (R²): 0.5600
R² の解釈:
適合度の良いモデル: モデルは変動の 50-70% を説明しています。
重要な点:
- 外部ファイルからデータを読み込みます。
- 最小二乗法を使用して回帰パラメータを計算します。
- R² 値を計算します。
- R² 値を解釈します。
- モデルの予測力を理解するのに役立ちます。