检查模型与观察数据的比较情况(并因此检查数据相对于模型隐含的条件分布是否过度分散)的好方法是通过根图。
我有一个 blog post 显示如何使用 countreg 包为 glm() 模型执行此操作,但这也适用于 GAM。
适用于模型的 GAM 版本的帖子的主要部分是:
library("coenocliner")
library('mgcv')
## parameters for simulating
set.seed(1)
locs <- runif(100, min = 1, max = 10) # environmental locations
A0 <- 90 # maximal abundance
mu <- 3 # position on gradient of optima
alpha <- 1.5 # parameter of beta response
gamma <- 4 # parameter of beta response
r <- 6 # range on gradient species is present
pars <- list(m = mu, r = r, alpha = alpha, gamma = gamma, A0 = A0)
nb.alpha <- 1.5 # overdispersion parameter 1/theta
zprobs <- 0.3 # prob(y == 0) in binomial model
## simulate some negative binomial data from this response model
nb <- coenocline(locs, responseModel = "beta", params = pars,
countModel = "negbin",
countParams = list(alpha = nb.alpha))
df <- setNames(cbind.data.frame(locs, nb), c("x", "yNegBin"))
好的,所以我们有一个从负二项式抽样分布中抽取的数据样本,现在我们将用两个模型拟合这些数据:
- 泊松 GAM
m_pois <- gam(yNegBin ~ s(x), data = df, family = poisson())
- 负二项式 GAM
m_nb <- gam(yNegBin ~ s(x), data = df, family = nb())
countreg 包尚未在 CRAN 上,但可以从 R-Forge 安装:
install.packages("countreg", repos="http://R-Forge.R-project.org")
然后加载包并绘制根图:
library("countreg")
library("ggplot2")
root_pois <- rootogram(m_pois, style = "hanging", plot = FALSE)
root_nb <- rootogram(m_nb, style = "hanging", plot = FALSE)
现在绘制每个模型的根图:
autoplot(root_pois)
autoplot(root_nb)
这就是我们得到的(在使用cowplot::plot_grid() 将两个根图排列在同一个图上之后)
我们可以看到,对于这些数据,负二项式模型在这里比 Poisson GAM 做得更好——在观察到的计数范围内,条形的底部更接近于零。
countreg 包详细介绍了如何在零线周围添加不确定带作为拟合优度测试的一种形式。
您还可以使用每个模型的 Pearson 残差计算分散参数的 Pearson 估计值:
r$> sum(residuals(m_pois, type = "pearson")^2) / df.residual(m_pois)
[1] 28.61546
r$> sum(residuals(m_nb, type = "pearson")^2) / df.residual(m_nb)
[1] 0.5918471
在这两种情况下,这些都应该是 1;我们看到 Poisson GAM 中存在显着的过度分散,而负二项式 GAM 中存在一些欠分散。