即使使用mle2

时间:2016-01-11 18:51:03

标签: r mle

可能涉及的人,

我对二元选择任务的个别数据集进行了MLE分析(每个数据集包括一些试验,其中某个主题需要选择选项A或B)。首先我尝试了optim(method = BFGS)。对于某些人来说,由于"非有限的有限差分误差"我无法得到参数估计值。我在网上搜索,发现bbmle工具箱可以通过提供反转Hessian矩阵的选项来解决这个错误。在计算期间。但是,即使我采用mle2函数并设置" skip.hessian = T",错误仍然会出现。我知道可能还有一些其他的解决方案,例如改变初始猜测;但是,有时候更新的初始猜测适用于这个主题,但对其他主题不起作用,这真的很烦人。    有人能告诉我如何在mle2中解决这个问题吗?我期待着你的回复。谢谢,祝你有个愉快的一天: - )

最佳, 杨

很抱歉没有提供testdata,因为我没有在线驾驶。欢迎您通过电子邮件获取testdata(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)

0 个答案:

没有答案