Skip to content

Commit

Permalink
Release v0.10.0 (#224)
Browse files Browse the repository at this point in the history
* Add slash to name
* Fix Pareto/NBD print name (#201)
* Update author name
* Formula interface (#203)
* Github actions: Upgrade to v2 (#214)
* clvdata: Plot Transaction Timings (#213)
* Housekeeping: Makevars (#217)
* Run tests in parallel (#216)
* Draw other models in same plot (#215)
* PNBD Dyncov Rcpp (#205)
* Update docu: continuous discount rate (#223)
* Drop explicit c++11 specification
* Prepare release
* Fix CRAN CPU usage & fix docu
  • Loading branch information
pschil authored Oct 23, 2023
2 parents 7b2cebb + bdfe92b commit 203d218
Show file tree
Hide file tree
Showing 137 changed files with 6,041 additions and 2,704 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/Coverage.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ jobs:
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3

- uses: r-lib/actions/setup-r@v1
- uses: r-lib/actions/setup-r@v2
with:
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v1
- uses: r-lib/actions/setup-r-dependencies@v2
with:
extra-packages: covr

Expand Down
28 changes: 10 additions & 18 deletions .github/workflows/R-CMD-check.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,45 +27,37 @@ jobs:
R_KEEP_PKG_SOURCE: yes

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3

- uses: r-lib/actions/setup-pandoc@v1
- uses: r-lib/actions/setup-pandoc@v2

- uses: r-lib/actions/setup-r@v1
- uses: r-lib/actions/setup-r@v2
with:
r-version: ${{ matrix.config.r }}
http-user-agent: ${{ matrix.config.http-user-agent }}
use-public-rspm: true

- name: Install linux system dependencies
if: runner.os == 'Linux'
env:
RHUB_PLATFORM: linux-x86_64-ubuntu-gcc
run: |
sudo apt-get update
sudo apt-get install -y qpdf texlive-xetex ghostscript
- name: Install mac system dependencies
if: runner.os == 'macOS'
run: |
brew install gsl openssl ghostscript
brew install gsl
- name: Install Windows system dependencies
if: runner.os == 'Windows'
run: |
pacman -Sy # Update repo index
pacman -S --noconfirm mingw-w64-x86_64-gsl mingw-w64-i686-gsl mingw-w64-ucrt-x86_64-gsl
# pacman -S --noconfirm mingw-w64-{i686,x86_64}-gsl
- uses: r-lib/actions/setup-r-dependencies@v1
- uses: r-lib/actions/setup-r-dependencies@v2
with:
extra-packages: rcmdcheck
extra-packages: any::rcmdcheck
needs: check

- uses: r-lib/actions/setup-tinytex@v1
- uses: r-lib/actions/setup-tinytex@v2

- uses: r-lib/actions/check-r-package@v1
- uses: r-lib/actions/check-r-package@v2
with:
args: '"--no-manual", "--as-cran", "--no-tests"'
args: 'c("--no-manual", "--as-cran", "--no-tests")'

- name: Upload check results
if: failure()
Expand Down
20 changes: 16 additions & 4 deletions .github/workflows/Tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,39 @@ on:

jobs:
tests-ubuntu-latest:
runs-on: ubuntu-latest
runs-on: macOS-latest
env:
R_REMOTES_NO_ERRORS_FROM_WARNINGS: true
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3

- uses: r-lib/actions/setup-r@v1
- uses: r-lib/actions/setup-r@v2
with:
use-public-rspm: true

- uses: r-lib/actions/setup-r-dependencies@v1
- name: Install mac system dependencies
run: |
brew install gsl
- uses: r-lib/actions/setup-r-dependencies@v2
with:
extra-packages: devtools

- name: diag output
run: sysctl hw.logicalcpu

- name: Run tests
run: |
library(testthat)
library(devtools)
# Ncpus=1 by default, and takes precedence over TESTTHAT_CPUS env var
# set to 3 which is default num cpus on mac GH actions runner
options(Ncpus=3)
# If on a release branch (name starts with 'release'),
# run all tests, including lengthy ones marked with skip_on_ci()
if(grepl(pattern = "^release", x = Sys.getenv("GITHUB_HEAD_REF"))){
Expand Down
36 changes: 10 additions & 26 deletions .github/workflows/pkgdown.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,38 +10,22 @@ jobs:
env:
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3

- uses: r-lib/actions/setup-pandoc@master
- uses: r-lib/actions/setup-pandoc@v2

- uses: r-lib/actions/setup-r@master

- name: Install dependencies for mac
run: |
brew install gsl openssl
- name: Query dependencies
run: |
install.packages('remotes')
saveRDS(remotes::dev_package_deps(dependencies = TRUE), ".github/depends.Rds", version = 2)
shell: Rscript {0}

- name: Cache R packages
uses: actions/cache@v1
- uses: r-lib/actions/setup-r@v2
with:
path: ${{ env.R_LIBS_USER }}
key: macOS-r-4.0-0-${{ hashFiles('.github/depends.Rds') }}
restore-keys: macOS-r-4.0-0-
use-public-rspm: true

- name: Install dependencies
- name: Install mac system dependencies
run: |
install.packages("remotes")
remotes::install_deps(dependencies = TRUE)
remotes::install_dev("pkgdown")
shell: Rscript {0}
brew install gsl
- name: Install package
run: R CMD INSTALL .
- uses: r-lib/actions/setup-r-dependencies@v2
with:
extra-packages: any::pkgdown, local::.
needs: website

- name: Deploy package
run: pkgdown::deploy_to_branch(new_process = FALSE)
Expand Down
1 change: 1 addition & 0 deletions CLVTools.Rproj
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ StripTrailingWhitespace: Yes

BuildType: Package
PackageUseDevtools: Yes
PackageCleanBeforeInstall: No
PackageInstallArgs: --no-multiarch --with-keep.source
PackageCheckArgs: --no-tests --as-cran --no-vignettes --no-build-vignettes --ignore-vignettes
PackageRoxygenize: rd,collate,namespace
22 changes: 13 additions & 9 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
Package: CLVTools
Title: Tools for Customer Lifetime Value Estimation
Version: 0.9.0
Date: 2022-01-07
Version: 0.10.0
Date: 2023-10-23
Authors@R: c(
person(given="Patrick", family="Bachmann", email = "[email protected]", role = c("cre","aut")),
person(given="Niels", family="Kuebler", email = "[email protected]", role = "aut"),
person(given="Markus", family="Meierer", email = "[email protected]", role = "aut"),
person(given="Jeffrey", family="Naef", email = "[email protected]",role = "aut"),
person(given="Elliot", family="Oblander", email = "[email protected]",role = "aut"),
person(given="E. Shin", family="Oblander", email = "[email protected]",role = "aut"),
person(given="Patrik", family="Schilter", email = "[email protected]",role = "aut")
)
Depends:
Expand All @@ -33,6 +33,7 @@ Description:
Further, we provide an implementation of the Gamma/Gamma model to model the spending process of individuals.
Imports:
data.table (>= 1.12.0),
Formula (>= 1.2-4),
ggplot2 (>= 3.2.0),
lubridate (>= 1.7.8),
Matrix (>= 1.2-17),
Expand All @@ -45,19 +46,20 @@ Suggests:
covr,
knitr,
rmarkdown,
testthat
xml2,
testthat (>= 3.0.0)
License: GPL-3
URL: https://github.com/bachmannpatrick/CLVTools
BugReports: https://github.com/bachmannpatrick/CLVTools/issues
NeedsCompilation: yes
SystemRequirements: C++11
LinkingTo: Rcpp, RcppArmadillo (>= 0.9.500.2.0), RcppGSL (>= 0.3.7)
LinkingTo: Rcpp, RcppArmadillo (>= 0.9.500.2.0), RcppGSL (>= 0.3.7), testthat
LazyLoad: yes
Encoding: UTF-8
Collate:
'CLVTools.R'
'RcppExports.R'
'all_generics.R'
'catch-routine-registration.R'
'class_clv_time.R'
'class_clv_data.R'
'class_clv_model.R'
Expand Down Expand Up @@ -112,12 +114,14 @@ Collate:
'f_interface_clvdata.R'
'f_interface_gg.R'
'f_interface_ggomnbd.R'
'f_interface_latentattrition.R'
'f_interface_pmf.R'
'f_interface_pnbd.R'
'f_interface_predict_clvfittedspending.R'
'f_interface_predict_clvfittedtransactions.R'
'f_interface_setdynamiccovariates.R'
'f_interface_setstaticcovariates.R'
'f_interface_spending.R'
'f_s3generics_clvdata.R'
'f_s3generics_clvdata_dynamiccov.R'
'f_s3generics_clvdata_plot.R'
Expand All @@ -137,10 +141,10 @@ Collate:
'pnbd_dyncov_BkSum.R'
'pnbd_dyncov_CET.R'
'pnbd_dyncov_DECT.R'
'pnbd_dyncov_LL.R'
'pnbd_dyncov_createwalks.R'
'pnbd_dyncov_expectation.R'
'pnbd_dyncov_makewalks.R'
'pnbd_dyncov_palive.R'
RoxygenNote: 7.1.2
RoxygenNote: 7.2.3
VignetteBuilder: knitr
Config/testthat/parallel: false
Config/testthat/edition: 3
15 changes: 14 additions & 1 deletion NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ export(SetDynamicCovariates)
export(SetStaticCovariates)
export(as.clv.data)
export(clvdata)
export(latentAttrition)
export(spending)
exportMethods(bgbb)
exportMethods(bgnbd)
exportMethods(gg)
Expand All @@ -52,30 +54,38 @@ exportMethods(predict)
exportMethods(show)
import(data.table)
import(optimx)
importFrom(Formula,as.Formula)
importFrom(Formula,is.Formula)
importFrom(MASS,ginv)
importFrom(Matrix,nearPD)
importFrom(Rcpp,evalCpp)
importFrom(ggplot2,aes)
importFrom(ggplot2,aes_string)
importFrom(ggplot2,element_blank)
importFrom(ggplot2,element_line)
importFrom(ggplot2,element_rect)
importFrom(ggplot2,element_text)
importFrom(ggplot2,geom_col)
importFrom(ggplot2,geom_line)
importFrom(ggplot2,geom_point)
importFrom(ggplot2,geom_segment)
importFrom(ggplot2,geom_text)
importFrom(ggplot2,geom_vline)
importFrom(ggplot2,ggplot)
importFrom(ggplot2,ggtitle)
importFrom(ggplot2,guide_legend)
importFrom(ggplot2,labs)
importFrom(ggplot2,position_dodge)
importFrom(ggplot2,position_dodge2)
importFrom(ggplot2,rel)
importFrom(ggplot2,scale_colour_manual)
importFrom(ggplot2,scale_fill_manual)
importFrom(ggplot2,scale_x_date)
importFrom(ggplot2,scale_x_datetime)
importFrom(ggplot2,scale_x_discrete)
importFrom(ggplot2,stat_density)
importFrom(ggplot2,theme)
importFrom(ggplot2,xlab)
importFrom(ggplot2,ylim)
importFrom(graphics,plot)
importFrom(lubridate,ceiling_date)
importFrom(lubridate,days)
Expand Down Expand Up @@ -105,6 +115,7 @@ importFrom(stats,AIC)
importFrom(stats,BIC)
importFrom(stats,coef)
importFrom(stats,fitted)
importFrom(stats,formula)
importFrom(stats,integrate)
importFrom(stats,logLik)
importFrom(stats,model.frame)
Expand All @@ -118,6 +129,8 @@ importFrom(stats,qnorm)
importFrom(stats,reformulate)
importFrom(stats,sd)
importFrom(stats,setNames)
importFrom(stats,terms)
importFrom(stats,update)
importFrom(stats,vcov)
importFrom(utils,getFromNamespace)
importFrom(utils,modifyList)
Expand Down
10 changes: 10 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
# CLVTools 0.10.0

### NEW FEATURES
* We add an interface to specify models using a formula notation (`latentAttrition()` and `spending()`)
* New method to plot customer's transaction timings (`plot.clv.data(which='timings')`)
* Draw diagnostic plots of multiple models in single plot (`plot(other.models=list(), label=c())`)
* MUCH faster fitting for the Pareto/NBD with time-varying covariates because we implemented the LL in Rcpp



# CLVTools 0.9.0

### NEW FEATURES
Expand Down
22 changes: 5 additions & 17 deletions R/RcppExports.R
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ NULL
#' @description
#' Calculates the discounted expected residual transactions.
#'
#' \itemize{
#' \describe{
#' \item{\code{pnbd_nocov_DERT}}{ Discounted expected residual transactions for the Pareto/NBD model without covariates}
#' \item{\code{pnbd_staticcov_DERT}}{ Discounted expected residual transactions for the Pareto/NBD model with static covariates}
#' }
Expand Down Expand Up @@ -534,23 +534,11 @@ pnbd_staticcov_PMF <- function(r, s, x, vAlpha_i, vBeta_i, vT_i) {
.Call(`_CLVTools_pnbd_staticcov_PMF`, r, s, x, vAlpha_i, vBeta_i, vT_i)
}

pnbd_dyncov_LL_Bi_cpp <- function(i, t_x, d, delta, n_walks, max_walks, walks) {
.Call(`_CLVTools_pnbd_dyncov_LL_Bi_cpp`, i, t_x, d, delta, n_walks, max_walks, walks)
pnbd_dyncov_LL_negsum <- function(params, X, t_x, T_cal, d_omega, walkinfo_aux_life, walkinfo_real_life, walkinfo_aux_trans, walkinfo_real_trans, walkinfo_trans_real_from, walkinfo_trans_real_to, covdata_aux_life, covdata_real_life, covdata_aux_trans, covdata_real_trans) {
.Call(`_CLVTools_pnbd_dyncov_LL_negsum`, params, X, t_x, T_cal, d_omega, walkinfo_aux_life, walkinfo_real_life, walkinfo_aux_trans, walkinfo_real_trans, walkinfo_trans_real_from, walkinfo_trans_real_to, covdata_aux_life, covdata_real_life, covdata_aux_trans, covdata_real_trans)
}

pnbd_dyncov_LL_Di_cpp <- function(i, real_d, aux_d, real_n_walks, aux_n_walks, real_max_walks, aux_max_walks, real_adj_walk1, real_walks, aux_walks) {
.Call(`_CLVTools_pnbd_dyncov_LL_Di_cpp`, i, real_d, aux_d, real_n_walks, aux_n_walks, real_max_walks, aux_max_walks, real_adj_walk1, real_walks, aux_walks)
}

hyp_alpha_ge_beta_cpp <- function(alpha_1, beta_1, alpha_2, beta_2, x, r, s) {
.Call(`_CLVTools_hyp_alpha_ge_beta_cpp`, alpha_1, beta_1, alpha_2, beta_2, x, r, s)
}

hyp_beta_g_alpha_cpp <- function(alpha_1, beta_1, alpha_2, beta_2, x, r, s) {
.Call(`_CLVTools_hyp_beta_g_alpha_cpp`, alpha_1, beta_1, alpha_2, beta_2, x, r, s)
}

F2_3_vecs_cpp <- function(n_walks_cbs, dT_cbs, Bjsum_cbs, x_cbs, t_x_cbs, n_walks_trans, walks_trans, d_trans, delta_trans, max_walks_trans, n_walks_life_real, d_life_real, max_walks_life_real, adj_walk1_life_real, walks_life_real, n_walks_life_aux, d_life_aux, max_walks_life_aux, walks_life_aux, r, alpha, s, beta) {
.Call(`_CLVTools_F2_3_vecs_cpp`, n_walks_cbs, dT_cbs, Bjsum_cbs, x_cbs, t_x_cbs, n_walks_trans, walks_trans, d_trans, delta_trans, max_walks_trans, n_walks_life_real, d_life_real, max_walks_life_real, adj_walk1_life_real, walks_life_real, n_walks_life_aux, d_life_aux, max_walks_life_aux, walks_life_aux, r, alpha, s, beta)
pnbd_dyncov_LL_ind <- function(params, X, t_x, T_cal, d_omega, walkinfo_aux_life, walkinfo_real_life, walkinfo_aux_trans, walkinfo_real_trans, walkinfo_trans_real_from, walkinfo_trans_real_to, covdata_aux_life, covdata_real_life, covdata_aux_trans, covdata_real_trans, return_intermediate_results = FALSE) {
.Call(`_CLVTools_pnbd_dyncov_LL_ind`, params, X, t_x, T_cal, d_omega, walkinfo_aux_life, walkinfo_real_life, walkinfo_aux_trans, walkinfo_real_trans, walkinfo_trans_real_from, walkinfo_trans_real_to, covdata_aux_life, covdata_real_life, covdata_aux_trans, covdata_real_trans, return_intermediate_results)
}

2 changes: 2 additions & 0 deletions R/all_generics.R
Original file line number Diff line number Diff line change
Expand Up @@ -206,11 +206,13 @@ setGeneric("clv.time.format.timepoint", function(clv.time, timepoint)
#' See section "Details" of \link{clvdata} for more details on parameters and usage.
#'
#' @examples
#' \donttest{ # dont test because ncpu=2 limit on cran (too fast)
#' data(cdnow)
#'
#' # Turn data.table of transaction data into a clv.data object,
#' # using default date format and column names but no holdout period
#' clv.cdnow <- as.clv.data(cdnow)
#' }
#'
#' @export
as.clv.data <- function(x,
Expand Down
6 changes: 6 additions & 0 deletions R/catch-routine-registration.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# This dummy function definition is included with the package to ensure that
# 'tools::package_native_routine_registration_skeleton()' generates the required
# registration info for the 'run_testthat_tests' symbol.
(function() {
.Call("run_testthat_tests", FALSE, PACKAGE = "CLVTools")
})
2 changes: 1 addition & 1 deletion R/class_clv_model_pnbd.R
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ setClass(Class = "clv.model.pnbd.no.cov", contains = "clv.model.with.correlation
clv.model.pnbd.no.cov <- function(){

return(new("clv.model.pnbd.no.cov",
name.model = "Pareto NBD Standard",
name.model = "Pareto/NBD Standard",
names.original.params.model = c(r="r", alpha="alpha", s="s", beta="beta"),
names.prefixed.params.model = c("log.r","log.alpha", "log.s", "log.beta"),
start.params.model = c(r=1, alpha=1, s=1, beta=1),
Expand Down
Loading

0 comments on commit 203d218

Please sign in to comment.