我试图估计客户在一段时间后还活着的概率。我有一家公司 500 位客户的数据。对于每个客户,我知道 x(给定客户在所有时间段内的交易次数)、tx(最后一次交易的时间)和 T(从第一次购买到观察窗口结束的总时间)。
我使用 BG/NBD 模型。为了估计活着的概率,我首先需要估计这个模型中包含的 4 个参数(r、alpha、a 和 b)。为了优化这些参数的值,我使用了 « bbmle » 包(如下所示)。
但是,当我运行代码时,它没有给出任何结果。此外,R 似乎也无法识别以下函数中包含的许多“对象”。
有没有人注意到我在代码中犯的任何错误?有没有别的写法?
bgLlh <- function(mydata, r, alpha, a, b) {
with (mydata, {
if (a<=0 | b<=0 | r<=0 | alpha<=0) return (NaN)
term1 <-log(gamma(r+mydata$x)) - log(gamma(r)) + r*log(alpha)
term2 <-log(gamma(a+b))+log(gamma(b+mydata$x))-log(gamma(b))-log(gamma(a+b+mydata$x))
term3<- -(r+mydata$x)*log(alpha+mydata$T)
term4 <- if(mydata$x > 1) {log(a)-log(b+mydata$x-1)-(r+mydata$x)*log(alpha+mydata$tx)
} else {0}
llh <- term1 + term2 +log(exp(term3)+(mydata$x>0)*exp(term4))
f <- -sum(llh)
return(f)
})
}
bgEstimateParameters <- function(mydata, initValues, safeMode=FALSE) {
llhd <- function(r, alpha, a, b) {
return (bgLlh(data, r, alpha, a, b))
}
library(bbmle)
if (safeMode) {
fit <- mle2(llhd, initValues, skip.hessian=TRUE, method="Nelder-Mead")
} else {
fit <- mle2(llhd, initValues)
}
return (fit)
}