我将提供三个过程,每个过程都是边际随机截距模型(MRIM)。这些MRIM具有边际逻辑解释的系数,并且比GEE的系数小:
| Model | (Intercept) | power | LogL |
|-------|-------------|--------|--------|
| `L_N` | -1.050| 0.00267| -270.1|
| `LLB` | -0.668| 0.00343| -273.8|
| `LPN` | -1.178| 0.00569| -266.4|
相对于不考虑任何相关性的glm,以供参考:
| Model | (Intercept) | power | LogL |
|-------|-------------|--------|--------|
| strt | -0.207| 0.00216| -317.1|
一个边缘化的随机截距模型(MRIM)值得探索,因为您需要具有可交换相关结构的边缘模型来处理聚类数据,而这是MRIM所展示的结构类型。
代码(尤其是
带有注释的R脚本)和文献的PDF文件在
GITHUB仓库中。我将在下面详细介绍代码和文献。
MRIM的概念自1999年以来就存在了,在
GITHUB仓库中有一些背景阅读材料。我建议首先阅读
Swihart et al 2014,因为它回顾了其他论文。
按时间顺序--
L_N
Heagerty (1999): 该方法使用一个正态分布的随机截距逻辑回归模型。关键在于,随机截距模型中的预测器非线性参数化,并带有边际系数,以使得所得到的边际模型具有边际逻辑解释。其代码是lnMLE
R软件包(不在CRAN上,但可以在Patrick Heagerty的网站这里找到)。该方法在代码中被标记为L_N
,表示边际上的logit(L),在条件比例尺上没有解释(_),且随机截距服从正态分布(N)。
LLB
Wang & Louis (2003): 该方法使用一个桥式分布的随机截距逻辑回归模型。与Heagerty 1999不同的是,这个技巧是一种特殊的随机效应分布(桥式分布),它允许随机截距模型和所得到的边际模型都具有逻辑解释。其代码是使用gnlmix4MMM.R
(在repo中),该代码使用rmutil
和repeated
R软件包实现。该方法在代码中被标记为LLB
,表示边际上的logit(L),在条件比例尺上也是logit(L),且随机截距服从桥式分布(B)。
LPN
Caffo and Griswold (2006): 该方法使用一个正态分布的随机截距probit模型,而Heagerty 1999使用了一个logit随机截距模型。这种替换使计算变得更容易,并仍然产生一个边际logit模型。其代码是使用gnlmix4MMM.R
(在repo中),该代码使用rmutil
和repeated
R软件包实现。该方法在代码中被标记为LPN
,表示边际上的logit(L),在条件比例尺上是probit(P),且随机截距服从正态分布(N)。
Griswold et al (2013): 另一篇评论/实用介绍。
Swihart et al 2014: 这是一篇关于Heagerty 1999和Wang & Louis 2003以及其他人的评论文章,它推广了MRIM方法。最有趣的推广之一是允许边际和条件模型中的logistic CDF(等效地,logit link)改为近似于logistic CDF的稳定分布。其代码是使用gnlmix4MMM.R
(在repo中),该代码使用rmutil
和repeated
R软件包实现。我在带注释的R脚本中用SSS
表示这个方法,表示边际上是稳定的(S),在条件比例尺上也是稳定的(S),且随机截距服从稳定分布(S)。它包含在R脚本中,但在SO的这篇文章中没有详细介绍。
准备
require(geepack)
d = read.csv(url("http://folk.uio.no/mariujon/data.csv"))
fit = geeglm(moden ~ 1 + power, id = defacto, data=d, corstr = "exchangeable", family=binomial)
summary(fit)
plot(moden ~ power, data=d)
x = 0:2500
y = predict(fit, newdata=data.frame(power = x), type="response" )
lines(x,y)
strt <- coef(glm(moden ~ power, family = binomial, data=d))
strt
attach(d)
L_N
Heagerty(1999年)
library(lnMLE)
L_N <- logit.normal.mle(meanmodel = moden ~ power,
logSigma= ~1,
id=defacto,
model="marginal",
data=d,
beta=strt,
r=10)
print.logit.normal.mle(L_N)
准备 LLB
和 LPN
library("gnlm")
library("repeated")
source("gnlmix4MMM.R")
y <- cbind(d$moden,(1-d$moden))
LLB
Wang和Louis(2003年)
LLB <- gnlmix4MMM(y = y,
distribution = "binomial",
mixture = "normal",
random = "rand",
nest = defacto,
mu = ~ 1/(1+exp(-(a0 + a1*power)*sqrt(1+3/pi/pi*exp(pmix)) - sqrt(1+3/pi/pi*exp(pmix))*log(sin(pi*pnorm(rand/sqrt(exp(pmix)))/sqrt(1+3/pi/pi*exp(pmix)))/sin(pi*(1-pnorm(rand/sqrt(exp(pmix))))/sqrt(1+3/pi/pi*exp(pmix)))))),
pmu = c(strt, log(1)),
pmix = log(1))
print("code: 1 -best 2-ok 3,4,5 - problem")
LLB$code
print("coefficients")
LLB$coeff
print("se")
LLB$se
LPN
Caffo和Griswold(2006年)
LPN <- gnlmix4MMM(y = y,
distribution = "binomial",
mixture = "normal",
random = "rand",
nest = defacto,
mu = ~pnorm(qnorm(1/(1+exp(-a0 - a1*power)))*sqrt(1+exp(pmix)) + rand),
pmu = c(strt, log(1)),
pmix = log(1))
print("code: 1 -best 2-ok 3,4,5 - problem")
LPN$code
print("coefficients")
LPN$coeff
print("se")
LPN$se
三种方法得出的系数:
rbind("L_N"=L_N$beta, "LLB" = LLB$coefficients[1:2], "LPN"=LPN$coefficients[1:2])
3个模型的最大对数似然:
rbind("L_N"=L_N$logL, "LLB" = -LLB$maxlike, "LPN"=-LPN$maxlike)
MCMCglmm
或blme
软件包),但它将拟合条件模型而不是边际模型...我不知道如何在GEE框架中实现收缩,或者是否已经有人做过这个。 - Ben Bolker(Intercept)
的系数为-0.664,power
的系数为0.003。是否有兴趣写出来? - swihart