単回帰分析について。
【目次】
計算式等
単回帰分析は、2変量 {x,y} の関係を直線(一次式)で求める分析方法。
モデル、式は次のとおり。
■ 単回帰モデル
■ 単回帰式
は切片(intercept)、
は回帰係数(regression coefficient)であり、回帰係数は x が1増えた時に y がどのくらい増えるかを表す。
また、説明変数で表現できないものを残差 と言い、この残差は独立に正規分布
に従う。
単回帰分析は次の分散分析表で表現することができる。
この分散分析表は一元配置分散分析で示したものと同じ。
■ 分散分析表
変動因 | 平方和 | 自由度 | 平均平方 | F比 |
---|---|---|---|---|
回帰R | ||||
残差e | ||||
全体T |
k=説明変数の数(単回帰分析では1)
なお、平方和と自由度は の関係が成り立つ。
モデルの評価指標としては次のようなものがある(一例)。
寄与率もしくは決定係数(R-square)
0~1の値を取り、1に近いほど良い。
自由度調整済寄与率もしくは自由度調整済決定係数(adjusted R-square)
0~1の値を取り、1に近いほど良い。
RMSE(Root Mean Square Error, 二乗平均平方根誤差)
相対的な指標であり、値が小さいほど良い。予測値と実測値の誤差に関する指標。
ノート
今回も架空データで簡単に計算方法を見てみる。
x = {1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3}
y = {1.1, 2.4, 3.3, 2.5, 1.3, 3.1, 2.7, 4.9, 2.4, 3.5, 5.8, 4.4, 3.1, 4.9, 5.3}
Excelでの計算:
モデルの作成
となるため、
は次のようになる。
よって、今回の単回帰式は次のとおり。
グラフにしたもの。
この計算、ExcelのLINEST関数でも実行できるのでメモ(個人の興味)。
貼付したExcelではP4:Q8が該当箇所。
=LINEST(目的変数の範囲, 説明変数の範囲, 切片項有無, 補正項有無)
[引数]
第1、2引数:特に迷わないと思います。単純なデータ指定です。
第3引数:切片を推定したい場合TRUEとします。FALSEにすると切片=0です。
第4引数:FALSEにすると回帰係数と切片のみを返し、TRUEにすると寄与率、F値、平方和等の情報も計算してくれます。
※今回の例では第3、4引数は両方ともTRUEにしました。
LINEST関数は5行×2列(列数は切片+説明変数の数)を範囲指定し、Ctrl + Shift + Enter で実行する。実行後、各セルに次の結果が得られる。
出力結果<再掲> | 各セルの詳細 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
![]() |
|
出力結果を見てみると は手計算と同じ結果が得られている。
また、F=18.9384(回帰自由度=1、残差自由度=13)なので、p≒0.0007843となる(セルP12=F.DIST.RT(F値のセル, 1, 残差自由度のセル) )。
なお、回帰係数÷標準誤差で t値を求め、p値≒0.0007843 を得ることができる(セルP10:11)。
モデルの評価
LINEST関数の結果で得られる寄与率は0.5930。
「寄与率=回帰平方和÷全体平方和」の式から分かるように、寄与率は本モデルでデータ全体のどのくらいを説明できるかを示す指標(1に近いほど良い)。
今回のモデルでは6割近くを説明できているという解釈になる。
なお、寄与率は「実測値と予測値の相関係数の二乗」に一致する。
※寄与率は説明変数を増やすだけで大きくなってしまうため、その影響を考慮した指標として自由度調整済寄与率がある。
Rでの実行
> ads <- data.frame(x=c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
+ ,y=c(1.1, 2.4, 3.3, 2.5, 1.3, 3.1, 2.7, 4.9, 2.4, 3.5, 5.8, 4.4, 3.1, 4.9, 5.3))
> res <- lm(y ~ x, data=ads)
> summary(res)
Call:
lm(formula = y ~ x, data = ads)
Residuals:
Min 1Q Median 3Q Max
-1.570 -0.735 0.120 0.520 1.520
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.8000 0.6404 1.249 0.233580
x 1.2900 0.2964 4.352 0.000784 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.9374 on 13 degrees of freedom
Multiple R-squared: 0.593, Adjusted R-squared: 0.5617
F-statistic: 18.94 on 1 and 13 DF, p-value: 0.0007843
> #-- グラフはこちら
> ggplot(ads, aes(x=x, y=y)) + geom_point() + geom_smooth(method="lm", se=F)
SASでの実行
data ads;
input x y @@;
cards;
1 1.1 1 2.4 1 3.3 1 2.5 1 1.3 2 3.1 2 2.7 2 4.9 2 2.4 2 3.5 3 5.8 3 4.4 3 3.1 3 4.9 3 5.3
;
run;
proc reg data=ads;
model y = x;
output out=OutputDS p=pred r=resid;
run;
プログラムコード
■ Rのコード
res <- lm(y ~ x, data=InputDS)
summary(res)
■ SASのコード
proc reg data=[InputDS];
model y = x;
output out=[OutputDS] p=pred r=residuals;
run;
■ Pythonのコード
整備中
回帰係数の詳細
の求め方についてもう少し突っ込んでみる。
精度の良いモデルとは、実測値 と予測値
との差(残差
)が小さいものであるため、残差平方和が最小の時の
を用いれば良いと考えられる(最小二乗法)。
よって、 について偏微分した式を連立方程式にして最良値を求める。
上のイメージのように、残差平方和は二乗のため放物線の形をとり、傾き=0が最小値となる。
元:
※合成関数の微分により、[n]×[関数^(n-1)]×[関数の中身の偏微分]。傾き最小を求めるので右辺は0。
ここから -2 を除去すると、具体的な名称として「残差の合計」と「残差×説明変数の合計」が0になる解を求めることが分かる。
この連立方程式を変形すると次のようになり、
①の式を用いて、 を次の関係式で表すことができる。
この③を②に代入すると が次のように求まる。
よって、③と④から は次となる。