Dear helpers,

I am using R version 2.5.1 to estimate a multinomial logit model using my
own maximum likelihood function (I work with share data and the default
function of R cannot deal with that).

However, the computer (I have an Athlon XP 3200+ with 512 GB ram) takes
quite a while to estimate the model.

With 3 categories, 5 explanatory variables and roughly 5000 observations it
takes 2-3 min. For 10 categories and 10 explanatory variables (still 5000
obs) more than 1 hour.

Is there any way I can speed up this process? (Modifying the code or
modifying some R options maybe?)

I would be really grateful if anybody could help me with this issue, I
attach my code below.

Many thanks,

Carlo

***************************************
Carlo Fezzi

Centre for Social and Economic Research 
on the Global Environment (CSERGE),
School of Environmental Sciences,
University of East Anglia,
Norwich, NR4 7TJ
United Kingdom.

***************************************



# MULTILOGIT

# This function computes the estimates of a multinomial logit model

# inputs:       a matrix vector of 1 and 0 (y) or of shares
#               a matrix of regressors (x) - MUST HAVE COLUMN NAMES! -
#               names of the variables, default = colnames(x)
#               optimization methods, default = 'BFGS'
#               base category, default = 1
#               restrictions, default = NULL
#               weights, default all equal to 1


# outputs:      an object of class "multilogit.c"

# McFadden D. (1974) "Conditional logit analysis of qualitative choice
behavior", in Zarembka P. (ed.), Frontiers in Econometrics, Academic Press.


multilogit.c <- function(y, xi, xi.names = colnames(xi), c.base=1,
rest=NULL, w = rep(1,nrow(y)), method='BFGS')
{
        
        n.obs <- sum(w)
        xi<-cbind(1,xi)
        colnames(xi)[1]<-"Intercept"

        nx<-ncol(xi)
        ny<-ncol(y)
        
        beta<-numeric(nx*ny)
        
        negll<- function(beta,y,xi)
        {
                beta[rest]<-0
                beta[(((c.base-1)*nx)+1):(c.base*nx)]<-0
                lli <- y  * (xi%*%matrix(beta,nx,ny) - log ( apply(exp(
xi%*%matrix(beta,nx,ny)) ,1,sum ) )     )
                lli<-lli*w
                -sum(lli)
        }

        pi<- apply((y*w),2,mean)/mean(w)
        
        ll0 <- (t(pi)%*%log(pi))*sum(w)
        
        result<-c(      optim(par = rep(0,nx*(ny)), fn = negll, y=y, xi=xi,
hessian=T, method=method),
                        list(varnames=xi.names, rest=rest, nx=nx, ny=ny,
npar=nx*(ny-1)-length(rest), ll0=ll0,   pi=pi, xi=xi,
n.obs=n.obs,c.base=c.base,w=w))
        
        result$par <- result$par[-(((c.base-1)*nx)+1):-(c.base*nx)]
        result$hessian <-
result$hessian[-(((c.base-1)*nx)+1):-(c.base*nx),-(((c.base-1)*nx)+1):-(c.ba
se*nx)]

        class(result)<-"multilogit.c"
        return(result)
}

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to