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

このエラーは、elog に奇数の日付が含まれている場合に発生する可能性があります。その場合、 を使用してキャリブレーション期間とホールドアウト期間を分割するとdc.ElogToCbsCbt、結果のholdout$cbtcal$cbtは異なる長さのベクトルになります (1 つずれます)。

これは、CRAN の現在の BTYD パッケージの問題です。ただし、回避策は、実行する前に elog から 1 日分のトランザクションを削除することですdc.ElogToCbsCbt

于 2016-04-27T01:08:51.693 に答える
1

だから私は実際にまったく同じ問題を抱えていて、サンプルデータで問題なく動作するコードを手に入れました...しかし、私自身のデータでは、上記のように問題が発生しています...私の考えでは、r、値はありません長さが f および T の値と一致するため、エラーが返されます....

だから私は問題を理解しました...基本的にあなたのデータセットは長さが一致しません...つまり、ベクトルは同じ長さ(行)ではありません...おそらく元のelogからcbtを作成し、elogではありません.cal...これを試してみてください。うまくいくと確信しています...また、NAの初期データセットを必ずスクラブしてください...

お役に立てれば!乾杯

于 2013-03-29T21:07:37.590 に答える
0

同じエラーがあり、以下を置き換えることで修正できました

tot.cbt <- dc.CreateFreqCBT(elog.cal) #elog の代わりに elog.cal を使用

ただし、次の問題があります。

sel = cal.cbs$x < cal.cbs$Tx

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

sel = 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

以下と同じエラーが発生しましたが、幸いなことに私のケースの理由が見つかりました。それがあなたにも役立つことを願っています.

> 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 の 3 つの列が含まれています。x<=T.cal であることを確認してください。つまり、ユーザーが観察された期間の合計数よりも多くのトランザクションを持つことはできません。たとえば、1 日あたりのトランザクション数が多い場合は、それらを 1 つのトラクションにまとめる必要があります。

以下のコードが機能するかどうかを確認してください。

> 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 に答える