R:条件logit模型

时间:2016-05-29 19:00:34

标签: r mlogit maximization

我试图最大化loglikelihood函数来获得条件logit模型的系数。我有一个大数据框,大约有9M行(300k选择集)和大约40个参数需要估算。它看起来像这样:

ChoiceSet Choice  SKU Price Caramel etc.
        1      1 1234   1.0       1  ...
        1      0  145   2.0       1  ...
        1      0 5233   2.0       0  ...
        2      0 1432   1.5       1  ...
        2      0 5233   2.0       0  ...
        2      1 8320   2.0       0  ...
        3      0 1234   1.5       1  ...
        3      1  145   1.0       1  ...
        3      0 8320   1.0       0  ... 

其中ChoiceSet是购买时可在商店中获得的一组产品,而选择SKU时,Choice = 1。

由于ChoiceSets可能会有所不同,我使用loglikelihood函数:

clogit.ll <- function(beta,X) {    #### This is a function to be maximized
X <- as.data.table(X) 
setkey(X,ChoiceSet,Choice) 

sum((as.matrix(X[J(t(as.vector(unique(X[,1,with=F]))),1),3:ncol(X),with=F]))%*%beta)- 

sum(foreach(chset=unique(X[,list(ChoiceSet)])$ChoiceSet, .combine='c', .packages='data.table') %dopar% { 

Z <- as.matrix(X[J(chset,0:1),3:ncol(X), with=F]) 
Zb <- Z%*%beta 
e <- exp(Zb) 

log(sum(e)) 
}) 
}

创建没有SKU(不需要)和零矢量的新数据框:

X0 <- Data[,-3]
b0 <- rep(0,ncol(X0)-2)

我在maxLike包的帮助下最大化了这个功能,我使用渐变来加快计算速度:

grad.clogit.ll <- function(beta,X) { ###It is a gradient of likelihood function
  X <- as.data.table(X) 
  setkey(X,ChoiceSet,Choice) 

colSums(foreach(chset=unique(X[,list(ChoiceSet)])$ChoiceSet, .combine='rbind',.packages='data.table') %dopar% { 
Z <- as.matrix(X[J(chset,0:1),3:ncol(X), with=F]) 
Zb <- Z%*%beta 
e <- exp(Zb) 
as.vector(X[J(chset,1),3:ncol(X),with=F]-t(as.vector(X[J(chset,0:1),3:ncol(X),with=F]))%*%(e/sum(e))) 
}) 
}

最大化问题如下:

fit <- maxLik(logLik = clogit.ll, grad = grad.clogit.ll, start=b0, X=X0, method="NR", tol=10^(-6), iterlim=100) 

一般来说,它适用于小样本,但对于大样本来说太长了:

Number of Choice sets    Duration of computation

        300                       4.5min
        400                      10.5min
       1000                        25min

但是当我为5000多个选择集进行R终止会话时。

所以(如果你还在阅读它)如果我有300,000多个选择集和1.5周完成我的课程工作,我怎么能最大化这个功能?请帮忙,我不知道。

0 个答案:

没有答案