No.15420 Rによる回帰分析について  【FE】 2011/10/01(Sat) 13:36

はじめまして。Rで,非線形最小二乗法を用いて回帰分析を行いたいのですが,エラーがでて困っています。

回帰式は

y = (b1 * Ik + b2 * (1-Ik))*(b3 * x1 - b4 - x2)

Ik= 1 if b3*x1-b4>0
0 otherwise

(b1〜b4がパラメータです。yが被説明変数,x1,x2が説明変数です)

というような,回帰式中に場合分けを含み,分岐の条件にもパラメータが用いられるという回帰式なのですが,自分は

nls(y ~ (b1 * ifelse(b3*x1 - b4 - x2 > 0,1,0)+b2*(1 - ifelse(b3*x1 - b4 - x2 > 0,1,0))*(b3*x1 - b4 - x2))

というように,ifelse関数を用いて記述したのですが,初期値を設定してこれを実行したこところ,「勾配が特異です」とエラーが出てしまい,調べてみても原因がわかりません。

また,ほかにもこのような分岐を含む回帰式の分析をしたところ,「step 因子〜は〜の 'minFactor' 以下に縮小しました」とエラーが出てしまいます。

回帰式中に場合分けを含む場合の記述(ifelseを用いての記述)が間違っているのでしょうか?
ご教授よろしくお願いいたします。

No.15423 Re: Rによる回帰分析について  【青木繁伸】 2011/10/01(Sat) 18:44

> 「勾配が特異です」とエラーが出てしまい

というのは,初期値が悪いからです(他に問題がないとすれば)。何らかの方法で,「ましな」初期値を探索するしかないですね。

> 回帰式中に場合分けを含む場合の記述(ifelseを用いての記述)が間違っているのでしょうか?

そんなことはないですよ。以下のようにテストデータを作って,「適切な」初期値でやれば,ちゃんと答えが出ます。初期値として,全部1を与えたのですが,「適切」だったようです。
b1 <- 1.1
b2 <- 2.2
b3 <- 3.3
b4 <- 4.4
set.seed(12345)
x1 <- rnorm(100)
x2 <- rnorm(100)
y <- round(b1*ifelse(b3*x1-b4-x2 > 0, 1, 0)+
b2*(1-ifelse(b3*x1-b4-x2 > 0, 1, 0))*(b3*x1-b4-x2), 2)
(ans <- nls(y ~ b1*ifelse(b3*x1-b4-x2 > 0, 1, 0)+
b2*(1-ifelse(b3*x1-b4-x2 > 0, 1, 0))*(b3*x1-b4-x2),
start=list(b1=1, b2=1, b3=1, b4=1)))
実行結果は以下の通り。
Nonlinear regression model
model: y ~ b1 * ifelse(b3 * x1 - b4 - x2 > 0, 1, 0) +
b2 * (1 - ifelse(b3 * x1 - b4 - x2 > 0, 1, 0)) * (b3 * x1 - b4 - x2)
data: parent.frame()
b1 b2 b3 b4
1.100 2.200 3.300 4.401
residual sum-of-squares: 0.0005689

Number of iterations to convergence: 3
Achieved convergence tolerance: 3.734e-07

No.15434 Re: Rによる回帰分析について  【FE】 2011/10/03(Mon) 00:01

ifelseの記述に間違いがないのならば,やはり初期値の問題なのですね。

わざわざテストデータを作成して実行して頂き,ありがとうございます。
今後は自分もテストデータで試してみることを考えてみます。

初期値の探索は地道にやってみます!
ありがとうございました

● 「統計学関連なんでもあり」の過去ログ--- 044 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る