3

我正在使用 BTYD 包构建 CLV 模型,但遇到了一个似乎无法解决的障碍。

我一直在仔细遵循本教程第 2.1 节中的指示。一切似乎都很顺利,直到我到达校准客户-足够的统计矩阵 (cal.cbs)。按照教程中的说明,我使用以下代码生成 cal.cbs:

birth.periods <- split.data$cust.data$birth.per
last.dates <- split.data$cust.data$last.date
cal.cbs.dates <- data.frame(birth.periods, last.dates, end.of.cal.period)
cal.cbs <- dc.BuildCBSFromCBTAndDates(cal.cbt, cal.cbs.dates, per="week")

直到最后一行似乎一切正常。R给了我以下信息:

> cal.cbs <- dc.BuildCBSFromCBTAndDates(cal.cbt, cal.cbs.dates, per="week")
Started making calibration period CBS...
Finished building CBS.
Warning message:
In cbind(f, r, T) :
  number of rows of result is not a multiple of vector length (arg 2)

我不知道这是否是一笔大交易,因为我不完全确定这意味着什么……我决定忽略它,直到我尝试进行参数估计。这就是发生的事情:

> params <- pnbd.EstimateParameters(cal.cbs)
Error in optim(logparams, pnbd.eLL, cal.cbs = cal.cbs, max.param.value = 
    max.param.value,  : 
L-BFGS-B needs finite values of 'fn'
In addition: Warning message:
In log(exp(loga - logb) - 1) : NaNs produced

我真的不知道从这里去哪里。我查看了 pnbd.EstimateParameters 函数的源代码,但我无法弄清楚到底出了什么问题。有人知道我该如何解决这个问题吗?任何建议都将不胜感激,因为我现在完全陷入困境。

4

8 回答 8

2

更改此行:

tot.cbt <- dc.CreateFreqCBT(elog)

对此:

tot.cbt <- dc.CreateFreqCBT(elog.cal)
于 2013-11-04T19:55:27.267 回答
1

所以我实际上遇到了完全相同的问题,并且我得到了适用于示例数据的代码没有问题......但是对于我自己的数据,我遇到了上述问题......我的想法是 r,值没有与长度上的 f 和 T 值匹配,因此返回错误....想法?

所以我发现了这个问题......基本上你的数据集在长度上不匹配......即向量不是相同长度(行)......你很可能是从原始 elog 而不是 elog 创建 cbt .cal ...试试这个,我相信它会起作用...还请确保清理您的初始NA数据集...

希望这可以帮助!干杯

于 2013-03-29T21:07:37.590 回答
1

当 elog 包含奇数个日期时,可能会发生此错误。在这种情况下,当使用 分割校准期和保持期dc.ElogToCbsCbt时,得到的holdout$cbtcal$cbt将是不同长度的向量(减一)。

这是 CRAN 中当前 BTYD 包中的一个问题。但是,一种解决方法是在运行之前从您的 elog 中删除一天的事务dc.ElogToCbsCbt

于 2016-04-27T01:08:51.693 回答
0

我得到了与下面相同的错误,但幸运的是我找到了我的案例的原因,我希望它也适用于你。

> Error in optim(logparams, pnbd.eLL, cal.cbs = cal.cbs, max.param.value
> = 
>     max.param.value,  :  L-BFGS-B needs finite values of 'fn'

数据 cal.cbs 包含三列:x、tx、T.cal。确保 x<=T.cal,即您的交易不能超过观察用户的时间段总数。例如,如果您每天有更多交易,则必须将它们合并为一个牵引力。

检查下面的代码是否适合您。

> sel = cal.cbs$x < cal.cbs$T.x 
> cal.cbs1 = cal.cbs[sel,]
> params  = pnbd.EstimateParameters(freq.cal.cbs1)
于 2014-04-30T00:30:23.270 回答
0

我浏览了示例代码,一切正常。我认为任何错误都已在最新更新中得到修复。

这是示例中的代码:

require(BTYD)
cdnowElog <-system.file("data/cdnowElog.csv", package ="BTYD")
elog <- dc.ReadLines(cdnowElog, cust.idx = 2,date.idx = 3, sales.idx = 5)
elog$date <-as.Date(elog$date,"%Y%m%d")
elog <- dc.MergeTransactionsOnSameDate(elog)
end.of.cal.period <- as.Date("1997-09-30")
elog.cal <- elog[which(elog$date <= end.of.cal.period), ]
split.data <- dc.SplitUpElogForRepeatTrans(elog.cal)
clean.elog <- split.data$repeat.trans.elog
freq.cbt <- dc.CreateFreqCBT(clean.elog)
freq.cbt[1:3, 1:5]
tot.cbt <- dc.CreateFreqCBT(elog)
cal.cbt <- dc.MergeCustomers(tot.cbt, freq.cbt)
birth.periods <- split.data$cust.data$birth.per
last.dates <- split.data$cust.data$last.date
cal.cbs.dates <- data.frame(birth.periods, last.dates,end.of.cal.period)
cal.cbs <- dc.BuildCBSFromCBTAndDates(cal.cbt, cal.cbs.dates,per="week")
于 2013-03-03T05:01:02.213 回答
0

我有同样的错误,我可以通过在下面替换来修复它

tot.cbt <- dc.CreateFreqCBT(elog.cal) #使用 elog.cal 而不是 elog

但是,我遇到了以下问题:

选择 = cal.cbs$x < cal.cbs$Tx

     > Error in cal.cbs$x : $ operator is invalid for atomic vectors

选择 = cal.cbs$x < cal.cbs$tx

     > Error in cal.cbs$x : $ operator is invalid for atomic vectors

在 cal.cbs 中,列是 tx NOT Tx 我不知道这里出了什么问题。有没有人知道如何解决这个问题?谢谢!

于 2014-10-17T14:55:39.540 回答
0

cal.cbs是矩阵而不是数据框。

尝试这个:

sel = cal.cbs[,1] < cal.cbs[,2]

cal.cbs1 = cal.cbs[(sel=TRUE),]

params  = pnbd.EstimateParameters(freq.cal.cbs1)

有一个功能可以一次执行所有步骤,从事件日志到 cbs 矩阵步骤。它对我很有效。

数据<-dc.ElogToCbsCbt(elog,per = "week",T.cal,T.tot = max(elog$date),merge.same.date = TRUE,cohort.birth.per = T.cal,消散。因子= 1,统计=“频率”)

要获取 cal.cbs 矩阵,请使用:

数据$cal$cbs

于 2014-12-24T21:21:21.337 回答
0

选择 = cal.cbs$x < cal.cbs$Tx

使用 cal.cbs[,1] "< "ca;.cbs[,2] 或转换为数据框并使用 "$"

于 2014-10-25T09:53:38.290 回答