1

I have a log-likelihood function I would like to optimize and understood I could do so with optim() in R. The parameters my function requires is a vector of probabilities (of length N) as well as a symmetric matrix of size N*N (where only N-choose-2 (right now N=5) values matter, due to the symmetry).

When I try using optim() I receive the following error:

Error in optim(params, L) : (list) object cannot be coerced to type 'double'

Why do I receive this error and how can I make this work? (If there is a better solution in Matlab or Python, references or suggestions for functions in these languages are welcome too) Here is the code:

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)

Briefly, the setting is y is a vector of purchases, but here we want to take our purchase data and find the underlying probabilities.

Thank you very much!

Ralf Stubner
  • 26,263
  • 3
  • 40
  • 75
sa_zy
  • 331
  • 1
  • 10

0 Answers0