plot_uplift_guelman: Qini plot and metric from uplift package

Package: uplift

Package uplift by Guelman (https://github.com/cran/uplift).

Simple plot reproduces uplift package’s qini(...) plot.

library(uplifteval)

set.seed(123)

alpha <- 0.1
n <- 1000
W <- rbinom(n, 1, 0.5)
Y <- W
p1 <- Y + alpha*rnorm(n)
plot_uplift_guelman(p1, W, Y, groups=10)
##  [1]    1.0  100.9  200.8  300.7  400.6  500.5  600.4  700.3  800.2  900.1
## [11] 1000.0

## $Qini
## [1] 0.2476978
## 
## $inc.gains
##  [1] 0.2028398 0.4056795 0.6085193 0.8113590 1.0000000 1.0000000 1.0000000
##  [8] 1.0000000 1.0000000 1.0000000
## 
## $random.inc.gains
##  [1] 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

Now work with a slightly more realistic toy model.

library(grf)

rl <- function(x){
  round(1/(1+exp(-x)))
}
n = 2000; p = 10
X = matrix(rnorm(n*p), n, p)
W = rbinom(n, 1, 0.2)
Y = rl(rl(X[,1]) * W - rl(X[,3]) * W + rnorm(n))
tau.forest = causal_forest(X, Y, W)
tau.hat = predict(tau.forest, X)
plot_uplift_guelman(tau.hat$predictions, W, Y)
##  [1]    1.0  200.9  400.8  600.7  800.6 1000.5 1200.4 1400.3 1600.2 1800.1
## [11] 2000.0

## $Qini
## [1] 0.08695195
## 
## $inc.gains
##  [1]  0.07994898  0.09809889  0.10284188  0.10722604  0.12324585
##  [6]  0.11527672  0.09911338  0.07809615  0.04094821 -0.01453885
## 
## $random.inc.gains
##  [1] -0.001453885 -0.002907769 -0.004361654 -0.005815539 -0.007269424
##  [6] -0.008723308 -0.010177193 -0.011631078 -0.013084963 -0.014538847

The uplift package splits into quantiles, but can have issues finding splits when distributions are highly concentrated.

library(tweedie)

#
# Case: plot_uplift_guelman fails to find quantiles
#
# Generate equal prediction distributions
n <- 1000
W <- rbinom(n, 1, 0.5)
Y <- rbinom(n, 1, 0.5)
p1 <- rtweedie(n, xi=1.4, mu=1, phi=1)
hist(p1,100)

plot_uplift_guelman(p1, W, Y, groups=10)
## [1]   1.0 100.9 200.8 300.7 400.6 500.5 600.4 700.3 893.5
## Warning in performance(p1, p0, Y, W, direction = direction, groups):
## uplift: due to ties in uplift predictions, the number of groups is less
## than 10

## $Qini
## [1] 0.0008526142
## 
## $inc.gains
## [1]  6.570513e-03  1.858974e-02  1.266026e-02 -2.884615e-03 -7.692308e-03
## [6]  7.401487e-18  5.448718e-03  6.570513e-03
## 
## $random.inc.gains
## [1] 0.0008213141 0.0016426282 0.0024639423 0.0032852564 0.0041065705
## [6] 0.0049278846 0.0057491987 0.0065705128