TL; DRあなたが応答変数は、理論上の最大値である二項N(より大きい場合はゼロの可能性(したがって、負の無限対数尤度)を取得するつもりですレスポンス)。実際の問題では、Nは既知のものとして扱われ、確率は推定されます。 Nを見積もりたいのであれば、(1)サンプルの最大値以上になるように制約する必要があります。 (2)離散的でなければならないパラメータに対して最適化するために特別なことをする(これは高度な/トリッキーな問題である)。
最初の部分は問題を特定するためのデバッグ戦略を示し、2番目はNとpを同時に最適化する戦略を示しています。
セットアップ:
set.seed(101)
n <- 100
xi <- rbinom(n, size=20, prob=0.5) # Sample
対数尤度関数:
lnlike <- function(theta){
log(prod(choose(theta[1],xi))) + sum(xi*log(theta[2])) +
(n*theta[1] - sum(xi))*log(1-theta[2])
}
はこれを打破するのをしてみましょう。
theta <- c(10,0.3) ## starting values
lnlike(c(10,0.3)) ## -Inf
OK、対数尤度は、開始値で-Inf
です。驚くことではないがoptim()
はそれで動作しません。
用語を解説しましょう。
log(prod(choose(theta[1],xi))) ## -Inf
OK、私たちはすでに最初の言葉に困っています。
prod(choose(theta[1],xi)) ## 0
製品はゼロです...なぜですか?
choose(theta[1],xi)
## [1] 120 210 10 0 0 10 120 210 0 0 45 210 1 0
ゼロがたくさんあります。どうして? xi
の値は何か問題がありますか?
## [1] 7 6 9 12 11 9 7 6
アハ!私たちは、あなたが本当にこれをしたい場合は、あなたがn
の妥当な値上ブルートフォース列挙によってそれを行うことができます12
badvals <- (choose(theta[1],xi)==0)
all(badvals==(xi>10)) ## TRUE
で7、6、9 ...しかし、トラブルにするためにOKです。.. 。
## likelihood function
llik2 <- function(p,n) {
-sum(dbinom(xi,prob=p,size=n,log=TRUE))
}
## possible N values (15 to 50)
nvec <- max(xi):50
Lvec <- numeric(length(nvec))
for (i in 1:length(nvec)) {
## optim() wants method="Brent"/lower/upper for 1-D optimization
Lvec[i] <- optim(par=0.5,fn=llik2,n=nvec[i],method="Brent",
lower=0.001,upper=0.999)$val
}
nvec[which.min(Lvec)] ## 20
par(las=1,bty="l")
plot(nvec,Lvec,type="b")
エラーとは何ですか? – duffymo
私は答えに到達する方法がわかりませんが、私もエラーは表示されません...あなたはそれを投稿できますか?あなたの質問は、ソリューションに到達する方法を超えてエラーを修正する方法に焦点を当てるべきです。 (ソリューションへのアクセスは、エラーを修正するだけかもしれません..) –
@ZheyuanLiこれは、私が必要とするものの実例です。 – andre