ご担当者様、
Rを介して、バイナリ選択タスクの個々のデータセット(各データセットには、特定の被験者がオプションAまたはBを選択する必要があるいくつかの試行が含まれています)でMLE分析を実行しました。最初に最適化(メソッド= BFGS)を試しました。一部の個人では、「非有限差分誤差」のためにパラメーター推定値を取得できません。オンラインで検索したところ、計算中に「ヘッセ行列を反転するオプション」を提供することで、bbmle ツールボックスがこのエラーを処理できることがわかりました。ただし、mle2関数を採用して「skip.hessian=T」を設定してもエラーが発生しました。最初の推測を変更するなど、他の解決策があるかもしれないことは知っています。ただし、更新された最初の推測がこのサブジェクトでは機能するが、他のサブジェクトでは機能しない場合があるのは本当に厄介です。mle2でこの問題を解決する方法を教えてもらえますか? お返事をお待ちしております。ありがとう、良い一日を:-)
ベスト、ヤン
オンラインドライブを持っていないため、テストデータを提供できなくて申し訳ありません。テストデータは電子メール (huyang@uni-bonn.de) で入手できます。
私のコードは次のとおりです。
##############################################################
### Step 1: Define the Log-likelihood Function of M1 ###
##############################################################
logl <- function(alpha,beta,delta1,delta2,delta3,epsilon){
data<-df_sbj
y <- data$Y
s1 <- data$s1
o1 <- data$o1
s2 <- data$s2
o2 <- data$o2
adv1<- ifelse(data$s1>data$o1,c(data$s1-data$o1),c(0))
adv2<- ifelse(data$s2>data$o2,c(data$s2-data$o2),c(0))
disadv1<- ifelse(data$o1>data$s1,c(data$o1-data$s1),c(0))
disadv2<- ifelse(data$o2>data$s2,c(data$o2-data$s2),c(0))
u1<-vector()
u2<-vector()
for (j in 1:nrow(data)) {
if (data$f1[j]=="human" & data$f2[j]=="greedy"){
u1[j]<-s1[j]-alpha*disadv1[j]-beta*adv1[j]+delta1*adv1[j]-delta1*disadv1[j]
u2[j]<-s2[j]-alpha*disadv2[j]-beta*adv2[j]+delta1*adv2[j]-delta1*disadv2[j]
} else if (data$f1[j]=="human" & data$f2[j]=="equal") {
u1[j]<-s1[j]-alpha*disadv1[j]-beta*adv1[j]-delta2*adv1[j]+delta2*disadv1[j]
u2[j]<-s2[j]-alpha*disadv2[j]-beta*adv2[j]-delta2*adv2[j]+delta2*disadv2[j]
} else if (data$f1[j]=="human" & data$f2[j]=="generous") {
u1[j]<-s1[j]-alpha*disadv1[j]-beta*adv1[j]-delta3*adv1[j]+delta3*disadv1[j]
u2[j]<-s2[j]-alpha*disadv2[j]-beta*adv2[j]-delta3*adv2[j]+delta3*disadv2[j]
} else {
u1[j]<-s1[j]-alpha*disadv1[j]-beta*adv1[j]
u2[j]<-s2[j]-alpha*disadv2[j]-beta*adv2[j]
}
}
#u1<-s1-alpha%*%disadv1-beta%*%adv1
#u2<-s2-alpha%*%disadv2-beta%*%adv2
udiff<-epsilon%*%(u2-u1)
# Use the log-likelihood of the Bernouilli distribution, where p is
# defined as the logistic transformation of a linear combination
# of predictors, according to logit(p)=(x%*%beta)
loglik <- sum(-y*log(1 + exp(-udiff)) - (1-y)*log(1 + exp(udiff)))
return(-loglik)
}
##############################################################
### Step 2: Prepare the data ###
##############################################################
df_sbj<-read.csv('./model/testdata_bbmle.csv',header=T)
fit <- mle2(logl, start = list(alpha = 0.2, beta=0.2, delta1=0.02, delta2=0.02, delta3=0.02, epsilon=0),method="BFGS",data=df_sbj,skip.hessian=T)