mgcv:在给定新​​数据的情况下获得响应的预测分布(负二项式示例)

时间:2017-06-21 20:51:22

标签: r statistics regression gam mgcv

在GAM(和GLM,就此而言)中,我们重新拟合条件似然模型。因此,在拟合模型后,对于新输入x和响应y,我应该能够计算y给定x的特定值的预测概率或密度。例如,我可能想要比较各种模型在验证数据上的拟合。在mgcv中使用合适的GAM有一种方便的方法吗?否则,我如何计算出使用的密度的确切形式,以便我可以适当地插入参数?

作为一个具体的例子,考虑负二项GAM:

## From ?negbin
library(mgcv)
set.seed(3)
n<-400
dat <- gamSim(1,n=n)
g <- exp(dat$f/5)

## negative binomial data... 
dat$y <- rnbinom(g,size=3,mu=g)

## fit with theta estimation...
b <- gam(y~s(x0)+s(x1)+s(x2)+s(x3),family=nb(),data=dat) 

现在我想计算y=7给定x=(.1,.2,.3,.4)的预测概率。

1 个答案:

答案 0 :(得分:1)

是。 mgcv正在进行(经验)贝叶斯估计,因此您可以获得预测分布。对于你的例子,这是如何。

# prediction on the link (with standard error)
l <- predict(b, newdata = data.frame(x0 = 0.1, x1 = 0.2, x2 = 0.3, x3 = 0.4), se.fit = TRUE)

# Under central limit theory in GLM theory, link value is normally distributed
# for negative binomial with `log` link, the response is log-normal
p.mu <- function (mu) dlnorm(mu, l[[1]], l[[2]])

# joint density of `y` and `mu`
p.y.mu <- function (y, mu) dnbinom(y, size = 3, mu = mu) * p.mu(mu)

# marginal probability (not density as negative binomial is discrete) of `y` (integrating out `mu`)
# I have carefully written this function so it can take vector input
p.y <- function (y) {
  scalar.p.y <- function (scalar.y) integrate(p.y.mu, lower = 0, upper = Inf, y = scalar.y)[[1]]
  sapply(y, scalar.p.y)
  }

现在,由于您希望y = 7的概率,以指定的新数据为条件,请使用

p.y(7)
# 0.07810065

一般来说,这种通过数值积分的方法并不容易。例如,如果其他链接函数(如sqrt())用于负二项式,则响应的分布不是那么简单(尽管也不难推导)。

现在我提供基于抽样的方法或蒙特卡罗方法。这与贝叶斯程序最相似。

N <- 1000  # samples size

set.seed(0)

## draw N samples from posterior of `mu`
sample.mu <- b$family$linkinv(rnorm(N, l[[1]], l[[2]]))

## draw N samples from likelihood `Pr(y|mu)`
sample.y <- rnbinom(1000, size = 3, mu = sample.mu)

## Monte Carlo estimation for `Pr(y = 7)`
mean(sample.y == 7)
# 0.076

备注1

请注意,作为经验贝叶斯,所有上述方法都以估计的平滑参数为条件。如果您需要类似&#34;完整贝叶斯&#34;之类的内容,请在unconditional = TRUE中设置predict()

备注2

也许有些人认为解决方案就像这样简单:

mu <- predict(b, newdata = data.frame(x0 = 0.1, x1 = 0.2, x2 = 0.3, x3 = 0.4), type = "response")
dnbinom(7, size = 3, mu = mu)

这样的结果取决于回归系数(假设没有不确定性固定),因此mu变得固定而不是随机的。这是预测分布。预测分布将整合模型估计的不确定性。