[R] how to use mle with a defined function

Lin Pan linpan1975 at yahoo.com
Tue Jul 10 00:06:13 CEST 2007


Hi all,

sorry for the misleading in the previous email. here is my function to
calculate the maximum likelihood function for a multinormial distribution:

mymle <- function (sigmaX, sigmaY, constraints, env){

	# build omega
	omegaX = abs(sigmaX) * kin + abs(env) * diag(1.0, n, n)
	omegaY = abs(sigmaY) * kin + abs(env) * diag(1.0, n, n)
	omegaXY = (sqrt(sigmaX * sigmaY) - abs(constraints)) * kin
	omega = array(0, c(2*n, 2*n))
	for(i in 1:n){
		for(j in 1:n){
			omega[i, j] = omegaX[i, j]
			omega[i+n, j+n] = omegaY[i, j]
			omega[i+n, j] = omegaXY[i, j]
			omega[i, j+n] = omegaXY[i, j]
		}
	}

	# obtain det of omega
	odet = unlist(determinant(omega))[1]

	# Cholesky decomposition
	C = chol(omega)

	# beta parameter estimates
	newY = t(C)%*%Y
	newX = t(C)%*%X

	# maximum likelihood estimates
	Z = Y - X%*%(lm(newY~newX-1)$coef)
	V = solve(t(C), Z)

	# compute the -2log-likelihood
	square = t(V)%*%V
	0.5*odet + 0.5*square
}

here kin, n, X and Y are known, for example

> kin
           [,1]       [,2]       [,3]       [,4]       [,5]       [,6]
[1,] 1.02276611 0.04899597 0.05076599 0.06727600 0.05561066 0.05561066
[2,] 0.04899597 1.02087402 0.11497498 0.07623291 0.06423950 0.06423950
[3,] 0.05076599 0.11497498 1.02291870 0.07189941 0.11162567 0.11162567
[4,] 0.06727600 0.07623291 0.07189941 1.03277588 0.05522156 0.05522156
[5,] 0.05561066 0.06423950 0.11162567 0.05522156 1.03971863 0.54769897
[6,] 0.05561066 0.06423950 0.11162567 0.05522156 0.54769897 1.03971863
> Y
 [1] 0.4054651 0.6931472 0.7884574 0.6931472 0.5306283 0.5306283 3.1696856
3.5467397 3.5862929 2.5494452 3.1354942 3.2188758
> X
      [,1] [,2] [,3] [,4]
 [1,]    1   69    0    0
 [2,]    1   65    0    0
 [3,]    1   50    0    0
 [4,]    1   54    0    0
 [5,]    1   48    0    0
 [6,]    1   42    0    0
 [7,]    0    0    1    1
 [8,]    0    0    1    2
 [9,]    0    0    1    2
[10,]    0    0    1    2
[11,]    0    0    1    1
[12,]    0    0    1    1
> n
[1] 6


when I call the function
fit <- mle(corr_add, start=list(sigmaX=0.855, sigmaY=0.5, constraints=0.15,
env=0.199), 
	method = "L-BFGS-B", lower=c(0.001, 0.001, 0.001, 0.001),
upper=c(1000,1000,1000,1000))

it always gave me error message something like
"Error in chol(omega) : the leading minor of order 8 is not positive
definite"

I checked the eigenvalues at each iteration and found that when it stopped
there existed negative eigenvalues. I don't know why this is not working
since omega supposed to be positive definite at each iteration. Any hints
would be very appreciated.



Lin





Lin Pan wrote:
> 
> Hi all,
> 
> I am trying to use mle() to find a self-defined function. Here is my
> function:
> 
> test <- function(a=0.1, b=0.1, c=0.001, e=0.2){
> 
> # omega is the known covariance matrix, Y is the response vector, X is the
> explanatory matrix
> 
> odet = unlist(determinant(omega))[1]
>  
> # do cholesky decomposition
> 
> C = chol(omega)
> 
> # transform data
> 
> U = t(C)%*%Y
> WW=t(C)%*%X
> 
> beta = lm(U~W)$coef
> 
> Z=Y-X%*%beta
> V=solve(t(C), Z)
> 
> 0.5*odet + 0.5*(t(V)%*%V)
> 
> }
> 
> and I am trying to call mle() to calculate the maximum likelihood
> estimates for function (0.5*odet+0.5*(t(V)%*%V)) by
> 
> result = mle(test, method="Nelder-Mead")
> 
> But I get the following error message:
> 
> Error in optim(start, f, method = method, hessian = TRUE, ...) : 
>         (list) object cannot be coerced to 'double'
> 
> I am pretty sure that the matrices, parameters etc are numerical before
> importing to the function. But why I still get such error message? Could
> anybody give some help on this? thanks a lot.
> 
> 
> Lin
> 

-- 
View this message in context: http://www.nabble.com/how-to-use-mle-with-a-defined-function-tf4015002.html#a11511446
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list