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))