BTYD包。 bgnbd绘图中的错误:需要有限的' ylim'校准频率的值

时间:2015-12-04 21:44:15

标签: r plot

我在绘制" bgnbd.PlotFrequencyInCalibration"时遇到了一些麻烦。在" BTYD"包。 数据集中没有NA,其他图表无误。 下面是我的剧情代码:

CustData<- read.csv("~/ltv/CustData")
> cal.cbs<-cbind(CustData$t.x,CustData$x,CustData$T.cal,CustData$x.star)
> colnames(cal.cbs)<-c("t.x","x","T.cal","x.star")
est.params<-c(0.0313,0.9165,1.088,0.7903)
bgnbd.PlotFrequencyInCalibration(est.params,cal.cbs,7)
Error in plot.window(xlim, ylim, log = log, ...) : 
  need finite 'ylim' values

任何帮助将不胜感激。谢谢。 卡拉 subset of the data

1 个答案:

答案 0 :(得分:0)

我修复了pnbd.pnbd.PlotFrequencyInCalibration。对bgnbd重复相同的操作。如果您查看pnbd.PlotFrequencyInCalibration的实际功能: “ https://github.com/cran/BTYD/blob/master/R/pnbd.R”(在此处检查)

pnbd.PlotFrequencyInCalibration <- function(params, cal.cbs, censor, plotZero = TRUE, 
                                            xlab = "Calibration period transactions", ylab = "Customers", title = "Frequency of Repeat Transactions") {

  tryCatch(x <- cal.cbs[, "x"], error = function(e) stop("Error in pnbd.PlotFrequencyInCalibration: cal.cbs must have a frequency column labelled \"x\""))
  tryCatch(T.cal <- cal.cbs[, "T.cal"], error = function(e) stop("Error in pnbd.PlotFrequencyInCalibration: cal.cbs must have a column for length of time observed labelled \"T.cal\""))

  dc.check.model.params(c("r", "alpha", "s", "beta"), params, "pnbd.PlotFrequencyInCalibration")
  if (censor > max(x)) 
    stop("censor too big (> max freq) in PlotFrequencyInCalibration.")

  n.x <- rep(0, max(x) + 1)
  custs = nrow(cal.cbs)

  for (ii in unique(x)) {
    n.x[ii + 1] <- sum(ii == x)
  }

  n.x.censor <- sum(n.x[(censor + 1):length(n.x)])
  n.x.actual <- c(n.x[1:censor], n.x.censor)

  T.value.counts <- table(T.cal)
  T.values <- as.numeric(names(T.value.counts))
  n.T.values <- length(T.values)

  total.probability <- 0

  n.x.expected <- rep(0, length(n.x.actual))

  for (ii in 1:(censor)) {
    this.x.expected <- 0
    for (T.idx in 1:n.T.values) {
      T <- T.values[T.idx]
      if (T == 0) 
        next
      n.T <- T.value.counts[T.idx]
      expected.given.x.and.T <- n.T * pnbd.pmf(params, T, ii - 1)
      this.x.expected <- this.x.expected + expected.given.x.and.T
      total.probability <- total.probability + expected.given.x.and.T/custs
    }
    n.x.expected[ii] <- this.x.expected
  }
  n.x.expected[censor + 1] <- custs * (1 - total.probability)

  col.names <- paste(rep("freq", length(censor + 1)), (0:censor), sep = ".")
  col.names[censor + 1] <- paste(col.names[censor + 1], "+", sep = "")
  censored.freq.comparison <- rbind(n.x.actual, n.x.expected)
  colnames(censored.freq.comparison) <- col.names

  cfc.plot <- censored.freq.comparison
  if (plotZero == FALSE) 
    cfc.plot <- cfc.plot[, -1]

  n.ticks <- ncol(cfc.plot)
  if (plotZero == TRUE) {
    x.labels <- 0:(n.ticks - 1)
    x.labels[n.ticks] <- paste(n.ticks - 1, "+", sep = "")
  } else {
    x.labels <- 1:(n.ticks)
    x.labels[n.ticks] <- paste(n.ticks, "+", sep = "")
  }

  ylim <- c(0, ceiling(max(cfc.plot,na.rm = TRUE) * 1.1))
  barplot(cfc.plot, names.arg = x.labels, beside = TRUE, ylim = ylim, main = title, 
          xlab = xlab, ylab = ylab, col = 1:2)

  legend("topright", legend = c("Actual", "Model"), col = 1:2, lwd = 2)

  return(censored.freq.comparison)
}

有一行:

ylim <- c(0, ceiling(max(cfc.plot) * 1.1))

添加到它,na.rm = TRUE

ylim <- c(0, ceiling(max(cfc.plot,na.rm = TRUE) * 1.1))

再次运行该功能,现在应该可以使用