This notebook illustrates what it means to “exponentially tilt” a carrier measure \(h(x)\) toward a linear combination of sufficient statistics \(T(x) \in \mathbb{R}^s\).

We will start off with the carrier density \(h(x) = 1 - |x|\) on the set \(\mathcal{X} = [-1, 1]\) (which we will numerically approximate with a fine grid of equally spaced points). Note that \(h(x)\) is a probability density function so we can write \(p_0(x) = h(x)\).

## Inputs: 
##   p0:          carrier density, evaluated at a fine grid of points (n-vector)
##   suff.stats:  sufficient statistics, evaluated at the same points (n x s matrix)
##   nat.params:  natural parameters
## Output:
##   p_eta, evaluated at the same points
exp.fam <- function(p0, suff.stats, nat.params) {
  p <- exp(suff.stats %*% nat.params) * p0
  norm.const <- sum(p)/sum(p0)     ## Assumes p0 is a probability density
  p / norm.const
}
## Inputs:
##   x.grid:  grid of points at which to plot densities
##   rest same as above
## Output:
##   creates plot showing p0 and its exponential tilt p_eta
plot.exp.fam <- function(x.grid, p0, suff.stats, nat.params) {
  p.eta <- exp.fam(p0, suff.stats, nat.params)
  plot(x.grid, p0, type="l",ylim=c(0,1.01*max(c(p0,p.eta))),
       lty=2,ylab="density",xlab="x",yaxs="i",xaxs="i",
       main=bquote("Exponential tilt:"~eta == "("~.(paste(nat.params, collapse=", "))~")")
       )
  lines(x.grid, p.eta)
  legend("topright", bty="n", lty=c(2,1),
         legend=c(expression(p[0](x),p[eta](x))))
}
## Triangle density
x.grid <- seq(-1,1,by=.001)
p0 <- 1-abs(x.grid)

We begin by using the sufficient statistics \(T_1(x) = x\) and \(T_2(x) = x^2\).

## X, X^2 ~~> natural parameters shift first two moments
suff.stats <- cbind(x.grid, x.grid^2)

By leaving \(\eta_2 = 0\) and taking \(\eta_1\) positive or negative, we tilt to the right or left respectively.

## Tilt to the right or left
plot.exp.fam(x.grid, p0, suff.stats, c(.5,0))

plot.exp.fam(x.grid, p0, suff.stats, c(4,0))

plot.exp.fam(x.grid, p0, suff.stats, c(-2,0))

By making \(\eta_2\) positive or negative we can tilt to the outside or inside, respectively:

## Outside / inside
plot.exp.fam(x.grid, p0, suff.stats, c(0,-2))

plot.exp.fam(x.grid, p0, suff.stats, c(0,4))

plot.exp.fam(x.grid, p0, suff.stats, c(.5,2))

\(X\) and \(X^2\) are two natural examples of sufficient statistics but we can try something more exotic, such as a “wiggly” function like \(T_3(X) = \cos(100X)\)

## add a "wiggly" natural parameter
suff.stats <- cbind(x.grid, x.grid^2, cos(100*X))
plot.exp.fam(x.grid, p0, suff.stats, c(-1,2,.1))

LS0tCnRpdGxlOiAiU3RhdCAyMTBBOiBFeHBvbmVudGlhbCBUaWx0aW5nIERlbW8iCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KClRoaXMgbm90ZWJvb2sgaWxsdXN0cmF0ZXMgd2hhdCBpdCBtZWFucyB0byAiZXhwb25lbnRpYWxseSB0aWx0IiBhIGNhcnJpZXIgbWVhc3VyZSAkaCh4KSQgdG93YXJkIGEgbGluZWFyIGNvbWJpbmF0aW9uIG9mIHN1ZmZpY2llbnQgc3RhdGlzdGljcyAkVCh4KSBcaW4gXG1hdGhiYntSfV5zJC4KCldlIHdpbGwgc3RhcnQgb2ZmIHdpdGggdGhlIGNhcnJpZXIgZGVuc2l0eSAkaCh4KSA9IDEgLSB8eHwkIG9uIHRoZSBzZXQgJFxtYXRoY2Fse1h9ID0gWy0xLCAxXSQgKHdoaWNoIHdlIHdpbGwgbnVtZXJpY2FsbHkgYXBwcm94aW1hdGUgd2l0aCBhIGZpbmUgZ3JpZCBvZiBlcXVhbGx5IHNwYWNlZCBwb2ludHMpLiBOb3RlIHRoYXQgJGgoeCkkIGlzIGEgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBzbyB3ZSBjYW4gd3JpdGUgJHBfMCh4KSA9IGgoeCkkLgoKYGBge3J9CiMjIElucHV0czogCiMjICAgcDA6ICAgICAgICAgIGNhcnJpZXIgZGVuc2l0eSwgZXZhbHVhdGVkIGF0IGEgZmluZSBncmlkIG9mIHBvaW50cyAobi12ZWN0b3IpCiMjICAgc3VmZi5zdGF0czogIHN1ZmZpY2llbnQgc3RhdGlzdGljcywgZXZhbHVhdGVkIGF0IHRoZSBzYW1lIHBvaW50cyAobiB4IHMgbWF0cml4KQojIyAgIG5hdC5wYXJhbXM6ICBuYXR1cmFsIHBhcmFtZXRlcnMKIyMgT3V0cHV0OgojIyAgIHBfZXRhLCBldmFsdWF0ZWQgYXQgdGhlIHNhbWUgcG9pbnRzCmV4cC5mYW0gPC0gZnVuY3Rpb24ocDAsIHN1ZmYuc3RhdHMsIG5hdC5wYXJhbXMpIHsKICBwIDwtIGV4cChzdWZmLnN0YXRzICUqJSBuYXQucGFyYW1zKSAqIHAwCiAgbm9ybS5jb25zdCA8LSBzdW0ocCkvc3VtKHAwKSAgICAgIyMgQXNzdW1lcyBwMCBpcyBhIHByb2JhYmlsaXR5IGRlbnNpdHkKICBwIC8gbm9ybS5jb25zdAp9CgojIyBJbnB1dHM6CiMjICAgeC5ncmlkOiAgZ3JpZCBvZiBwb2ludHMgYXQgd2hpY2ggdG8gcGxvdCBkZW5zaXRpZXMKIyMgICByZXN0IHNhbWUgYXMgYWJvdmUKIyMgT3V0cHV0OgojIyAgIGNyZWF0ZXMgcGxvdCBzaG93aW5nIHAwIGFuZCBpdHMgZXhwb25lbnRpYWwgdGlsdCBwX2V0YQpwbG90LmV4cC5mYW0gPC0gZnVuY3Rpb24oeC5ncmlkLCBwMCwgc3VmZi5zdGF0cywgbmF0LnBhcmFtcykgewogIHAuZXRhIDwtIGV4cC5mYW0ocDAsIHN1ZmYuc3RhdHMsIG5hdC5wYXJhbXMpCiAgcGxvdCh4LmdyaWQsIHAwLCB0eXBlPSJsIix5bGltPWMoMCwxLjAxKm1heChjKHAwLHAuZXRhKSkpLAogICAgICAgbHR5PTIseWxhYj0iZGVuc2l0eSIseGxhYj0ieCIseWF4cz0iaSIseGF4cz0iaSIsCiAgICAgICBtYWluPWJxdW90ZSgiRXhwb25lbnRpYWwgdGlsdDoifmV0YSA9PSAiKCJ+LihwYXN0ZShuYXQucGFyYW1zLCBjb2xsYXBzZT0iLCAiKSl+IikiKQogICAgICAgKQogIGxpbmVzKHguZ3JpZCwgcC5ldGEpCiAgbGVnZW5kKCJ0b3ByaWdodCIsIGJ0eT0ibiIsIGx0eT1jKDIsMSksCiAgICAgICAgIGxlZ2VuZD1jKGV4cHJlc3Npb24ocFswXSh4KSxwW2V0YV0oeCkpKSkKfQoKIyMgVHJpYW5nbGUgZGVuc2l0eQp4LmdyaWQgPC0gc2VxKC0xLDEsYnk9LjAwMSkKcDAgPC0gMS1hYnMoeC5ncmlkKQpgYGAKCldlIGJlZ2luIGJ5IHVzaW5nIHRoZSBzdWZmaWNpZW50IHN0YXRpc3RpY3MgJFRfMSh4KSA9IHgkIGFuZCAkVF8yKHgpID0geF4yJC4KCmBgYHtyfQojIyBYLCBYXjIgfn4+IG5hdHVyYWwgcGFyYW1ldGVycyBzaGlmdCBmaXJzdCB0d28gbW9tZW50cwpzdWZmLnN0YXRzIDwtIGNiaW5kKHguZ3JpZCwgeC5ncmlkXjIpCmBgYAoKQnkgbGVhdmluZyAkXGV0YV8yID0gMCQgYW5kIHRha2luZyAkXGV0YV8xJCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSwgd2UgdGlsdCB0byB0aGUgcmlnaHQgb3IgbGVmdCByZXNwZWN0aXZlbHkuCgpgYGB7cn0KIyMgVGlsdCB0byB0aGUgcmlnaHQgb3IgbGVmdApwbG90LmV4cC5mYW0oeC5ncmlkLCBwMCwgc3VmZi5zdGF0cywgYyguNSwwKSkKcGxvdC5leHAuZmFtKHguZ3JpZCwgcDAsIHN1ZmYuc3RhdHMsIGMoNCwwKSkKcGxvdC5leHAuZmFtKHguZ3JpZCwgcDAsIHN1ZmYuc3RhdHMsIGMoLTIsMCkpCmBgYAoKQnkgbWFraW5nICRcZXRhXzIkIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIHdlIGNhbiB0aWx0IHRvIHRoZSBvdXRzaWRlIG9yIGluc2lkZSwgcmVzcGVjdGl2ZWx5OgoKYGBge3J9CiMjIE91dHNpZGUgLyBpbnNpZGUKcGxvdC5leHAuZmFtKHguZ3JpZCwgcDAsIHN1ZmYuc3RhdHMsIGMoMCwtMikpCnBsb3QuZXhwLmZhbSh4LmdyaWQsIHAwLCBzdWZmLnN0YXRzLCBjKDAsNCkpCnBsb3QuZXhwLmZhbSh4LmdyaWQsIHAwLCBzdWZmLnN0YXRzLCBjKC41LDIpKQpgYGAKCiRYJCBhbmQgJFheMiQgYXJlIHR3byBuYXR1cmFsIGV4YW1wbGVzIG9mIHN1ZmZpY2llbnQgc3RhdGlzdGljcyBidXQgd2UgY2FuIHRyeSBzb21ldGhpbmcgbW9yZSBleG90aWMsIHN1Y2ggYXMgYSAid2lnZ2x5IiBmdW5jdGlvbiBsaWtlICRUXzMoWCkgPSBcY29zKDEwMFgpJAoKYGBge3J9CiMjIGFkZCBhICJ3aWdnbHkiIG5hdHVyYWwgcGFyYW1ldGVyCnN1ZmYuc3RhdHMgPC0gY2JpbmQoeC5ncmlkLCB4LmdyaWReMiwgY29zKDEwMCpYKSkKCnBsb3QuZXhwLmZhbSh4LmdyaWQsIHAwLCBzdWZmLnN0YXRzLCBjKC0xLDIsLjEpKQpgYGAKCgoK