SSブログ

パラメータに非負制約を与えた重回帰分析 [データサイエンス、統計モデル]

重回帰で回帰係数の符号が逆転している場合の意味
http://skellington.blog.so-net.ne.jp/2017-05-17

マルチコは悪か?
http://skellington.blog.so-net.ne.jp/2017-09-25


xとyの相関はプラスなのに、重回帰になると逆のマイナスになる場合の続き。

重回帰の偏回帰係数の意味をきちんと理解していると、
分析者本人は、符号が逆になっても問題ないと理解できるのですが、
上司に説明する際など、そのままでは誤解を生む場合があります。

重回帰の場合、マイナスだからといって、その効果がマイナスということを意味していません。
一方で、マイナスをなんとかプラスの係数にして、しかも、重回帰を行いたい!という気持ちもわかります。

もはや、普通の重回帰ではなく、重回帰の形をした別の分析ということになります。
しかも、出てくるアウトプットが重回帰の形をしているので、これまた、誤解を生みかねないので、あまりお勧めをしませんが、、、
自分ならこうやってプラスにするという方法を書いておきます。

重回帰分析の流れ
1. 最尤法(最小二乗法)を解く
ただし、普通のパッケージにおいては、回帰係数に制約条件を付けれないのでRの最適化関数optimを使って解きます。

2. 通常、パラメータの探索区間は -∞~∞ なので、exp(β)と変数変換することで、非負の制約を与えることができます。

気になる精度ですが、

# 普通の重回帰分析
モデル作成用:1.058
モデル検証用:1.002

# パラメータに非負制約を与えた重回帰分析
モデル作成用:1.090
モデル検証用:1.009

ということで、パラメータに非負制約を与えた重回帰分析の方が精度が落ちてしまいますね。
この辺りは、パラメータに制約与えて最適化を解いているので、自明と言えば自明ですが。。。


~以下、実際のコード~

# 普通の重回帰分析
fr <- function(x)
{
b1 <- x[1]
b2 <- x[2]
b3 <- x[3]
b4 <- x[4]

LL = 0
for(i in 1:hh) {
x_ols <- b1 * dat_b[i, 1] + b2 * dat_b[i, 2] + b3 * dat_b[i, 3] + b4
y_ols <- dat_b[i, 4]
LLL <- (y_ols - x_ols)^2
LL <- LL + LLL
}
return(LL)
}

res1 <- optim(b0, fr, method = "BFGS", hessian = TRUE, control = list(fnscale = 1))

# パラメータに非負制約を与えた重回帰分析
fr <- function(x)
{
b1 <- x[1]
b2 <- x[2]
b3 <- x[3]
b4 <- x[4]

LL = 0
for(i in 1:hh) {
x_ols <- exp(b1) * dat_b[i, 1] + exp(b2) * dat_b[i, 2] + exp(b3) * dat_b[i, 3] + b4
y_ols <- dat_b[i, 4]
LLL <- (y_ols - x_ols)^2
LL <- LL + LLL
}
return(LL)
}

# 対数尤度関数の最大化
res2 <- optim(b0, fr, method = "BFGS", hessian = TRUE, control = list(fnscale = 1))

nice!(7)  コメント(0) 
共通テーマ:学問