用Optim优化R中的对数似然函数

时间:2018-04-12 12:34:11

标签: r optimization log-likelihood

我有一个对数似然函数我希望优化并理解我可以在R中使用optim()这样做。我的函数所需的参数是一个概率向量(长度为N)as以及大小为N*N的对称矩阵(由于对称性,只有N-choose-2(现在N = 5)值很重要。)

当我尝试使用optim()时,收到以下错误:

  

optim中的错误(params,L):( list)对象无法强制键入' double'

为什么我收到此错误,我该如何使用? (如果在Matlab或Python中有更好的解决方案,也欢迎使用这些语言的函数的参考或建议) 这是代码:

numerator <- function(P, Gamma, y, U, N) {
  expr = 1
  for (i in 1:N-1) {
    for ( j in i+1:N) {
      if ((y[i] == y[j]) & (y[i] == 1)) {
        expr = expr*P[i]*P[j]*exp(Gamma[i,j])
      }
      if ((y[i] != y[j]) & (y[i] == 1)) {
        expr = expr*P[i]*(1 - P[j])
      }
      if ((y[i] != y[j]) & (y[i] == 0)) {
        expr = expr*(1 - P[i])*P[j]
      }
      if ((y[i] == y[j]) & (y[i] == 0)) {
        expr = expr*(1 - P[i]*P[j]*exp(Gamma[i,j]) - P[i]*(1 - P[j]) - (1 - P[i])*P[j])
      }
    }
  }
return(expr)
}

denominator <- function(params, y, U, N) {
  P <- params$probs
  val <- 1
  for (i in 1:N-1) {
      val <- val*(y[i]*P[i]^(N-3) + (1-y[i])*(1 - P[i])^(N-3))
  }
  val <- val * y%*%P + (1 - y)%*%(1 - P)
  return(val)
}

L <- function(params, y, U, N) {
  P <- params$probs
  Gamma <- params[,2:(N+1)]
  n <- log(numerator(P, Gamma, y, U, N))
  d <- log(denominator(P, y, U, N))
  l <- n-d
  return(l)
}

y <- readRDS(file="purchase_records_df.rds")
N <- ncol(y)

params <- data.frame('probs'=rep(0.001, N), 'gamma'=matrix(0,nrow=N,ncol=N))

optim(params, L)

简单地说,设置是y是购买的向量,但在这里我们想要获取我们的购买数据并找到潜在的概率。

非常感谢!

0 个答案:

没有答案