No.07843 関数simplex()が返すのは。。。  【波音】 2008/10/07(Tue) 02:24

質問があるのですが,

http://aoki2.si.gunma-u.ac.jp/R/simplex.html

にあるsimplex()において,初期値が"テキトー"なものだと当然ですが当てはまりのよい曲線を描いてくれないことは明らかです。しかし,当てはまりの良い曲線を描いたり(そういう結果を返したり),そうでなかったりするのはどうしてでしょうか?

指定する初期値が悪いのであれば,そもそも当てはまりの良い曲線を描くようなパラメータを推定してくれるわけないですから,初期値が悪いわけではないと思うのですが,どうなのでしょう。
### 実行例 ###
x <- c(1.691, 1.724, 1.755, 1.784, 1.811, 1.837, 1.861, 1.884)
y <- c(0.06779661, 0.16666667, 0.30645161, 0.55357143, 0.82539683, 0.89830508, 0.96774194, 1)
model1 <- function(x, p){
return(p[1]/(1+exp(p[2]+p[3]*x)))
}
simplex(model1, c(1, 2.4982329, -0.3721354), x, y, plot.flag=TRUE)
### ここまで ###
たぶん,何度か
> simplex(model1, c(1, 2.4982329, -0.3721354), x, y, plot.flag=TRUE)
の部分を実行してみると分かると思いますが,何度かに1度の頻度でポカをするようですが,,,

蛇足かもしれませんが,こういう関数を作って試してみました。
# 空のベクトルを作成
result.dat <- c()

# simplex()を繰り返し試すための関数
prog <- function(){
# 20回ほどsimplex()がどういう結果を返すか試す
for(i in 1:20){
a <-simplex(model1, c(1, 2.4982329, -0.3721354), x, y, plot.flag=FALSE)
#result.datに残差を代入していく
result.dat[i] <- a$residuals
}
plot(result.dat)
result.dat
}

> prog()
[1] 0.003724610 0.131497697 0.129823985 0.003724610 0.003724613 0.131507439
[7] 0.003724610 0.132327833 0.003724614 0.132034875 0.132017506 0.003724610
[13] 0.130665340 0.129278250 0.003724610 0.003724610 0.003724611 0.003724610
[19] 0.003724612 0.003724610

No.07845 Re: 関数simplex()が返すのは。。。  【青木繁伸】 2008/10/07(Tue) 09:26

シンプレックスを作るときに,与えられた初期値を元に乱数を使用します。そこに不安定の原因があります。うまくい かないときの結果は下図のようになります。図に描いてみると明らかなので,解が得られたら図を描いてチェックすべきですね。ニュートン法などよりは正解を 得られる確率は高いとは思いますが。


No.07846 Re: 関数simplex()が返すのは。。。  【波音】 2008/10/07(Tue) 10:29

回答ありがとうございます。

> シンプレックスを作るときに,与えられた初期値を元に乱数を使用します。

なるほど,22行目の diag(pa) <- diag(pa)*runif(ip, min=LO, max=HI) の部分ですね。だから,上手くいかないこともあったわけですか。ありがとうございました。

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