在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)
的预测概率。
答案 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
变得固定而不是随机的。这是不预测分布。预测分布将整合模型估计的不确定性。