R
非常に特定の問題のために作成した対数尤度関数を最小化するために、ニュートンラプソンアルゴリズムを使用しようとしています。正直言って、推定方法は頭上にありますが、私の分野(心理測定学)の多くの人がNRアルゴリズムを使って推定していることを知っているので、少なくともそもそもこの方法を使おうとしています。特定のデータベクトルの対数尤度推定としてスカラーを返す一連の入れ子関数があります。
log.likelihoodSL <- function(x,sxdat1,item) {
theta <- x[1]
rho <- x[2]
log.lik <- 0
for (it in 1:length(sxdat1)) {
val <- as.numeric(sxdat1[it])
apars <- item[it,1:3]
cpars <- item[it,4:6]
log.lik <- log.lik + as.numeric(log.pSL(theta,rho,apars,cpars,val))
}
return(log.lik)
}
log.pSL <- function(theta,rho,apars,cpars,val) {
p <- (rho * e.aSL(theta,apars,cpars,val)) + ((1-rho) * e.nrm(theta,apars,cpars,val))
log.p <- log(p)
return(log.p)
}
e.aSL <- function(theta,apars,cpars,val) {
if (val==1) {
aprob <- e.nrm(theta,apars,cpars,val)
} else if (val==2) {
aprob <- 1 - e.nrm(theta,apars,cpars,val)
} else
aprob <- 0
return(aprob)
}
e.nrm <- function(theta,apars,cpars,val) {
nprob <- exp(apars*theta + cpars)/sum(exp((apars*theta) + cpars))
nprob <- nprob[val]
return(nprob)
}
これらの関数はすべて、提示された順序で順番に相互に呼び出します。最高の関数の呼び出しは次のとおりです。
max1 <- maxNR(log.likelihoodSL,grad=NULL,hess=NULL,start=x,print.level=1,sxdat1=sxdat1,item=item)
sxdat1
入力データのサンプルを次に示します(この場合はこれを呼び出します)。
> sxdat1
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18
2 1 3 1 3 3 2 2 3 2 2 2 2 2 3 2 3 2
V19 V20
2 2
そしてここに変数がありますitem
:
> item
V1 V2 V3 V4 V5 V6
[1,] 0.2494625 0.3785529 -0.6280155 -0.096817808 -0.7549263 0.8517441
[2,] 0.2023690 0.4582290 -0.6605980 -0.191895013 -0.8391203 1.0310153
[3,] 0.2044005 0.3019147 -0.5063152 -0.073135691 -0.6061725 0.6793082
[4,] 0.2233619 0.4371988 -0.6605607 -0.160377714 -0.8233197 0.9836974
[5,] 0.2257933 0.2851198 -0.5109131 -0.044494872 -0.5970246 0.6415195
[6,] 0.2047308 0.3438725 -0.5486033 -0.104356236 -0.6693569 0.7737131
[7,] 0.3402220 0.2724951 -0.6127172 0.050795183 -0.6639092 0.6131140
[8,] 0.2513672 0.3263046 -0.5776718 -0.056203015 -0.6779823 0.7341853
[9,] 0.2008285 0.3389165 -0.5397450 -0.103565987 -0.6589961 0.7625621
[10,] 0.2890680 0.2700661 -0.5591341 0.014251386 -0.6219001 0.6076488
[11,] 0.3127214 0.2572715 -0.5699929 0.041587479 -0.6204483 0.5788608
[12,] 0.2697048 0.2965255 -0.5662303 -0.020115553 -0.6470669 0.6671825
[13,] 0.2799978 0.3219374 -0.6019352 -0.031454750 -0.6929045 0.7243592
[14,] 0.2773233 0.2822723 -0.5595956 -0.003711768 -0.6314010 0.6351127
[15,] 0.2433519 0.2632824 -0.5066342 -0.014947878 -0.5774375 0.5923853
[16,] 0.2947281 0.3605812 -0.6553092 -0.049389825 -0.7619178 0.8113076
[17,] 0.2290081 0.3114185 -0.5404266 -0.061807853 -0.6388839 0.7006917
[18,] 0.3824588 0.2543871 -0.6368459 0.096053788 -0.6684247 0.5723709
[19,] 0.2405821 0.3903595 -0.6309416 -0.112333048 -0.7659758 0.8783089
[20,] 0.2424331 0.3028480 -0.5452811 -0.045311136 -0.6360968 0.6814080
関数を最小化したい2つのパラメーターlog.likelihood()
はthetaとrhoであり、thetaを-3から3の間に、rhoを0から1の間に制限したいのですが、これを行う方法がわかりません。現在の設定。誰かが私を助けることができますか?ニュートンラプソン法とは異なる推定法を使用する必要がありますか、それとも現在使用してmaxNR
いるパッケージの関数を使用してこれを実装する方法はありますか?maxLik
ありがとう!
x
編集:パラメーターthetaおよびrhoの開始値を含むベクトルは、それがc(0,0)
これらのパラメーターの「平均」または「デフォルト」の仮定であるためです(実質的な解釈の観点から)。