r语言 - BTYD 包。BGNBD绘图中的误差:校准中的频率需要有限的'ylim'值



在"BTYD"包中绘制"bgnbd.PlotFrequencyInCalibration"时遇到一些问题。数据集中没有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

如有任何帮助,我们将不胜感激。非常感谢。卡拉数据的子集

我修复了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=真

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

再次运行该函数,现在应该可以工作

最新更新