使带有gamm的“可交换”类型的GEE模型适合

时间:2019-09-23 07:01:28

标签: r spline confidence-interval mgcv gee

我想在R中的“可交换”类型的边际模型中估计某些协变量N的平滑效果,其中聚类变量为S。据我发现,这应该可以实现:

geeglm(..., id = S, corstr = "exchangeable")

以及:

gamm(..., correlation = corCompSymm(form = ~1|S))

下面您可以找到一个示例,其中的两个估算值非常接近,结果看起来不错。但是,如果我使用项目所涉及的真实数据,则估计的平滑效果往往会大不相同。我不能在这里发布它,但是也许有人仍然可以在代码中发现一些问题。例如(见下文),gamm对象说Number of Groups: 1,这让我很担心,因为显然有多个集群...

(是的,这是通过构造实现的随机效应模型,但是在给出答案here的情况下,这应该可以得到所需的模型。)

########
## Packages
########
library(ggplot2)
library(mgcv)
library(dplyr)
library(geepack)
library(splines)

########
## Data Simulation
########
f        <- function(N) {return((-200+(N-25)^2)/100)}

N        <- sort(sample(1:50, 10, replace = T))
S        <- as.character(1:10)
S_Effect <- rnorm(length(S),0,1)
S_Effect <- rep(S_Effect,N)
S        <- rep(S,N)
N        <- rep(N,N)
E        <- runif(length(N))

data     <- data.frame(O        = rep(0,length(N)),
                       E        = E,
                       N        = N,
                       S        = as.factor(S),
                       S_Effect = S_Effect)

for (i in 1:length(N)) {
  data$O[i] <- rbinom(1, 1, plogis(f(N[i]) + qlogis(E[i]) + S_Effect[i]))}

data <- data %>% mutate(E = qlogis(E))



########
## Fitting
########
formula_gamm   <- as.formula("O ~ 1 + offset(E) + s(N, bs = 'bs')")
model_gamm     <- gamm(formula_gamm, family = binomial(), correlation = corCompSymm(form=~1|S), data = data)
model_gamm

formula_geeglm <- as.formula("O ~ 1 + offset(E) + bs(N)")
model_geeglm   <- geeglm(formula_geeglm, family = binomial(), corstr = "exchangeable", id = S, data = data)



########
## Plot
########
pred_gamm      <- plot.gam(model_gamm$gam, select = 1)
x <- pred_gamm[[1]]$x
pred_geeglm  <- predict(model_geeglm, type = "terms", newdata = data.frame(E = rep(0,length(x)), N = x))

z                 <- qnorm(0.9)

tmp               <- data.frame(x = x,
                               y = pred_gamm[[1]]$fit,
                               group = rep("estimate gamm",length(x)))
tmp2               <- data.frame(x = x,
                                y = as.numeric(pred_geeglm),
                                group = rep("estimate geeglm",length(x)))
tmp3              <- data.frame(x = x,
                               y = f(x),
                               group = rep("actual function",length(x)))

data_pred = bind_rows(tmp,tmp2,tmp3) %>% mutate(group = as.factor(group))

p <- ggplot(data = data_pred, aes(x = x, y = y, color = group)) +
     geom_line(size = 2) +
     xlab("N") +
     ylab("f(N)")
p   

另一个问题:gamm对象包含足够的信息以围绕估计函数绘制置信带,但是对于geeglm估计,我该如何做呢?如果您使用simulate(model_geeglm, ...)并按方向使用mean,您会得到看起来合理的东西,依此类推,但这并不能真正满足我的需求,因为(1)simulate上的文档没有提到边际模型和(2)这是非常原始的...

1 个答案:

答案 0 :(得分:0)

GAMM使用惩罚样条曲线,因此所得样条曲线(平滑)所使用的自由度可能会比所要求的基础尺寸(即10)小一些。GEE拟合了无惩罚模型。在所有其他条件相同的情况下,无惩罚模型将比惩罚模型更加摇摆不定。

要在一个通用的基础上比较这些方法,您需要确保bs()s(x, bs = 'bs')都产生相同数量的基函数(s()版本可以产生更少的基函数它将消除截距项的缺乏可识别性,而您将省略bs()版本中的截距)。

确保自己拥有相同的基本尺寸,然后可以通过在公式中的fx = TRUE项中添加s(...)来使GAMM拟合未惩罚的样条线。

这样做,两个模型都应该估计相似的平滑效果。

但是,我建议您使用惩罚;对于GAMM模型,请使用fx = FALSE,然后估算模型运行量gam.check(model$gam)(用适合的模型对象替换model),然后查看是否通过了平滑度的基本尺寸检查。 / p>