条件付きロジットモデルの係数を取得するために対数尤度関数を最大化しようとしています。約 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 は異なる場合があるため、対数尤度関数を使用します。
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 週間ある場合、どうすればこの機能を最大化できますか? 助けてください、私にはわかりません。