1

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

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

optim(params, L) 中的错误:(列表)对象不能被强制输入“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 是购买向量,但在这里我们要获取购买数据并找到潜在的概率。

非常感谢!

4

0 回答 0