在R(BTYD包)中构建Pareto / NBD模型时出现cbind错误

时间:2012-11-09 18:29:58

标签: r model statistics

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

我一直在认真遵循this tutorial中第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函数的源代码,但我无法弄清楚到底出了什么问题。有没有人有一丝线索我怎么解决这个问题?任何建议将不胜感激,因为我现在完全陷入困境。

8 个答案:

答案 0 :(得分:2)

更改此行:

tot.cbt <- dc.CreateFreqCBT(elog)

到此:

tot.cbt <- dc.CreateFreqCBT(elog.cal)

答案 1 :(得分:1)

所以我实际上已经遇到了完全相同的问题而且我得到了代码来处理样本数据没有问题...但是对于我自己的数据我遇到了上述问题...我的想法是有r ,值与f和T值的长度不匹配,因此返回错误....想法?

所以我想出了这个问题...基本上你的数据集的长度不匹配...即向量不是相同的长度(行)...你最有可能从原来的elog创建cbt并且不是elog.cal ...尝试这个,我相信它会起作用...同时确保擦洗你的初始数据集...

希望这有帮助! 干杯

答案 2 :(得分:1)

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

这是CRAN中当前BTYD程序包中的一个问题。但是,解决方法是在运行dc.ElogToCbsCbt之前从您的elog中裁掉一天的交易。

答案 3 :(得分: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")

答案 4 :(得分: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,t.x,T.cal。确保x <= T.cal,即您不能拥有比观察用户的总时间段更多的事务。例如,如果您每天有更多交易,则必须将它们折叠成一个牵引力。

检查以下代码是否适合您。

> sel = cal.cbs$x < cal.cbs$T.x 
> cal.cbs1 = cal.cbs[sel,]
> params  = pnbd.EstimateParameters(freq.cal.cbs1)

答案 5 :(得分:0)

我遇到了同样的错误,我可以通过替换下面的

来修复它
  

tot.cbt&lt; - dc.CreateFreqCBT(elog.cal)#used elog.cal而不是elog

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

  

sel = cal.cbs $ x&lt; cal.cbs $ T.x

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

sel = cal.cbs $ x&lt; cal.cbs $ t.x

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

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

答案 6 :(得分:0)

sel = cal.cbs $ x&lt; cal.cbs $ T.x

使用cal.cbs [,1]“&lt;”ca; .cbs [,2]或转换为数据框并使用“$”

答案 7 :(得分:0)

cal.cbs是一个矩阵而不是数据帧。

试试这个:

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

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

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

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

data&lt; -dc.ElogToCbsCbt(elog,per =“week”,T.cal,T.tot = max(elog $ date),merge.same.date = TRUE,cohort.birth.per = T.cal ,dissipate.factor = 1,statistic =“freq”)

获取cal.cbs矩阵,使用:

数据$ $ CAL CBS