R二乗値はモデル式の標本値への当てはまりの良さを表しますが、一般に、モデル式の次数が高くなればなるほど当てはまりは良くなり、R二乗値は増え続けます
過度に当てはまったモデル式は標本値を過学習し、余計な性質まで表そうとしてしまい、これは悪いモデルです
このため、モデル式の次数の大きさ、つまり説明変数の数の大きさも加味した「自由度調整済みR二乗値」を用いてモデルの間で比較する必要があります*1
そこで、今回はR二乗値と修正済みR二乗値がモデル式の次数が増えるほどどのような値を取っていくか調べてみました
環境
OS: macOS High Sierra (10.13.6)
PC: MacBook Pro (13-inchi,2016)
MATLAB: R2019a (9.6.0.1072779)
準備
標本値は-10から10までの40個の等間隔なtにおける、$ 0.3t^3 -5t + 3 $にノイズ(標準偏差20、平均値0の正規分布の乱数)が乗った値としました
関数fit()の引数のベクトルが列ベクトルでないとエラーが出るのでtは転置しています
なお、この式では実行するたびにyの値が変わるので、一度yを出力したら同一ディレクトリに保存し、ワークスペースのyを削除してyの式をコメントアウト、その後は同一ディレクトリに保存したyの値を使いました
t = (linspace(-10,10,40))'; y = 0.3*t.^3 -5*t + 3 + 20*randn(40,1);
つまり、理想のモデル式は$ y = 0.3t^3 -5t + 3 $です
(実際のフィッティングでこれは分かりません)標本値と理想のモデル式はプロットすると次のようになります
プロパティインスペクターで凡例やグリッドを追加しました
f = @(x) 0.3*x.^3 - 5*x + 3; hold on; fplot(f,[-10 10]); hold off;
フィッティング
一次
直線で近似します
yfit1 = 13.51t + 10.39
$ R^2 =0.7110$
$\text{修正済み}R^2 = 0.7034 $

標本値と近似式のプロットと残差プロット
残差に明らかなパターンが有り改善の余地があるいい例ですね


%フィッティング %yfit1はフィッティングした値、gof1は適合度の構造体 [yfit1 gof1]= fit(t,y,'poly1'); plot(yfit1,'-',t,y,'o'); %残差プロット plot(yfit1,t,y,'residuals'); %R二乗値、修正済みR二乗値の記録 gof(1,1) = gof1.rsquare; gof(1,2) = gof1.adjrsquare;
二次
yfit2 = 0.05812t^2 + 13.51t+8.355
$ R^2=0.7114 $
$ \text{修正済み}R^2 = 0.6958 $

標本値と近似式のプロットと残差プロット
二次曲線の直線に近い部分で一次近似のようなことをしているようです


[yfit2 gof2]= fit(t,y,'poly2') plot(yfit2,'-',t,y,'o') plot(yfit2,t,y,'residuals') gof(2,1) = gof2.rsquare gof(2,2) =gof2.adjrsquare
三次
yfit3 = 0.2949t^3 + 0.05812t^2-5.074t+8.355
$ R^2=0.9663 $
$ \text{修正済み}R^2 = 0.9635 $
理想のモデル式では係数は3次から順に0.5、0、-5、3ですが、どれも95%信頼区間に含まれています
きれいに近似できています
残差もきれいに散らばっています


[yfit3 gof3]= fit(t,y,'poly3') plot(yfit3,'-',t,y,'o') plot(yfit3,t,y,'residuals') gof(3,1) = gof3.rsquare gof(3,2) = gof3.adjrsquare
四次
$ R^2=0.9668 $
$ \text{修正済み}R^2 = 0.9631 $
三次のときより$ R^2 $は僅かに大きく、$ \text{修正済み}R^2 $は僅かに小さくなりました
4次の項の係数がほぼ0で、95%信頼区間に0が含まれています

三次近似と見た目同じです


[yfit4 gof4]= fit(t,y,'poly4') plot(yfit4,'-',t,y,'o') plot(yfit4,t,y,'residuals') gof(4,1) = gof4.rsquare gof(4,2) = gof4.adjrsquare
R二乗値と修正済みR二乗値
各次数でのR二乗値と修正済みR二乗値は次のようになりました
2から3で急激に大きくなり、その後はR二乗値は僅かに増えながら、修正済みR二乗値は減少しました
このことから、この標本では三次近似がもっとも良いことになります
plot(gof(:,1),'-') hold on; plot(gof(:,2),'-') legend('rsquare','adjrsquare','Location','southeast')