Abdelghaffar
Abdelghaffar

Reputation: 13

Error in using optim function due to length

I am trying to estimate the below log function using maximum likelihood method in R, but I get the following error:

Error in optim(start, f, method = method, hessian = TRUE, ...) : objective function in optim evaluates to length 10 not 1

My attempt was as follows:

Generating data

set.seed(101)
n <- 10
u <- runif(n)
theta1 <- 1
lamba1 <- 0.5

Generating PTIR data using quantile function

x <- function(u, theta1, lamba1) { 
    (-theta1/(log((1+lamba1)-sqrt((1+lamba1)^2-(4*lamba1*u)))/(2*lamba1)))^(1/(2))
}
x <- x(u = u, theta1 = theta1, lamba1 = lamba1)

Declaring the Log-Likelihood function

LL <- function(theta, lamba) { 
    R = suppressWarnings((n*log(2))+
      (n*log(theta))-(((2)+1)*sum(log(x)))-
      (sum(theta/(x^(2))))+
      (log(1+lamba-(2*lamba*exp(-theta/(x^(2)))))))
    return(-R) 
}
mle(LL, start = list(theta = 5, lamba=0.5))

Any advice would be greatly appreciated.

Upvotes: 1

Views: 2256

Answers (1)

Ben Bolker
Ben Bolker

Reputation: 226801

I don't know how to fix your problem, but hopefully I can help you diagnose it. As @KonradRudolph suggests in comments, This may be a case where the usual advice "add more parentheses if you're not sure" may do more harm than good ... I've rewritten your function in a way that matches what you've got above, but has fewer parentheses and more consistent line breaking/indentation. Every line below is a separate additive term. Your specific problem is that the last term involves x (which has length 10 in this case), but is not summed, so the return value ends up being a length-10 vector.

LL2 <- function(theta, lambda) {
    R <- n*log(2)+
        n*log(theta)-
        ((2)+1)*sum(log(x))-
        sum(theta/(x^2))+
        log(1+lambda-(2*lambda*exp(-theta/x^2)))
    return(-R)
}

all.equal(LL(1,1),LL2(1,1)) ## TRUE
length(LL2(1,1))  ## 10

Upvotes: 1

Related Questions