以前書いた下記ネタの続きです
この時は、C#からExcelを起動→LINEST関数を呼んで計算する方法でしたが、
今回はExcelを使わずに、C#内でR2を計算する方法を検討してみました。
再び、R2とは?
今回は下記サイトを参考にして検討しました。
要は、①回帰式を求める → ②回帰式を使って予測値を計算 →
③残差変動(実測値と予測値の差)を計算 という流れになります。
残差変動の二乗和を、全変動(実測値と平均との差)の二乗和で割り、
それを1から引いたものを決定係数R2としています。
は回帰式より求めた予測値、は実測値の平均値、
予測値が実測値に近くなるほどR2は1に近づく、という訳です。
以前のネタで決定係数には何種類か定義が有り、
Excelがどの方法か判らないと書きましたが、上式が最も一般的な定義らしいです。
回帰式を求める
次は先ほどの①、回帰式の計算です、今回は下記サイトの計算式を使いました。
y=ax+b(直線)の場合、およびy=ax2+bx+c(2次曲線)の場合の計算式を使います。
正直、詳しい仕組みは理解出来ていませんが、Excelの線形近似/多項式近似でも、
最小二乗法を使っているそうなので、それなりに近い式が得られることを期待。
ここで得た式(→回帰式)が、より近似出来ているほど予測値は実測値に近づき、
結果として決定係数R2も1に近づくので、実はここが一番のポイント!
C#でプログラム
というわけで、あとはプログラムするだけです、サンプルソフトを作成しました、
画面のXとYにデータを貼り付けて、”X/Yデータ取得”ボタンを押すと計算します。
以前のネタと同じ簡単なデータで試してみます、まずは線形近似の場合
近似式 で、aは9.6、bが1、R2は0.9944となり、
ExcelのLINEST関数と全く同じ結果が得られました!
次に多項式近似(二次)の場合
近似式 で、aは-0.1429、bは10.457、cは0、
R2は0.9947となり、こちらもほぼ同じ結果が得られました。
Excelでcは9E-14(ほぼ0)になってますが、計算誤差っぽいですね。
ソースファイルは下記参照
まとめ
最小二乗法を使って回帰式を求めることで、Excelで求めていたのと同じ結果を
得られそうなことが判りました、Excelが無い環境でも計算出来るので便利。
ExcelのLINEST関数等は、今回と同じような計算を内部でやっているんでしょうね。
余談ですが今回もインターネットの便利さを痛感、色々有用な情報が開示されてて、 本当に助かりました、参考にさせて頂いたサイトの皆さんに感謝致します!