我想在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)这是非常原始的...
答案 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>