【问题标题】:cbind error while building Pareto/NBD Model in R (BTYD Package)在 R(BTYD 包)中构建 Pareto/NBD 模型时出现 cbind 错误
【发布时间】:2012-10-30 02:46:51
【问题描述】:

我正在使用 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 函数的源代码,但我无法弄清楚到底出了什么问题。有人知道我该如何解决这个问题吗?任何建议都将不胜感激,因为我现在完全陷入困境。

【问题讨论】:

    标签: r model statistics


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      试试这个:

      sel = cal.cbs[,1] < cal.cbs[,2]
      
      cal.cbs1 = cal.cbs[(sel=TRUE),]
      
      params  = pnbd.EstimateParameters(freq.cal.cbs1)
      

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

      数据

      获取 cal.cbs 矩阵,使用:

      数据$cal$cbs

      【讨论】:

        【解决方案3】:

        sel = cal.cbs$x

        使用 cal.cbs[,1] "

        【讨论】:

          【解决方案4】:

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

          tot.cbt

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

          sel = cal.cbs$x

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

          sel = cal.cbs$x

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

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

          【讨论】:

          • cal.cbs 是矩阵,而不是 data.frame,@sharp。上面有合适的解决方案
          【解决方案5】:

          我遇到了与以下相同的错误,但幸运的是我找到了我的情况的原因,我希望它也适用于你。

          > 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

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

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

          【讨论】:

            【解决方案6】:

            改变这一行:

            tot.cbt <- dc.CreateFreqCBT(elog)
            

            到这里:

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

            【讨论】:

              【解决方案7】:

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

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

              希望这会有所帮助! 干杯

              【讨论】:

                【解决方案8】:

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

                这是示例中的代码:

                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")
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-09-28
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-08-20
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-10-02
                  相关资源
                  最近更新 更多