如何从logit模型(glmer)获得两组之间成功概率差异的概况置信区间?

时间:2017-02-20 13:26:22

标签: r logistic-regression lme4 confidence-interval

我正在努力将从logit模型获得的对数优势比概况置信区间转换为概率。我想知道如何计算两组之间差异的置信区间。

如果p值> 0.05,差异的95%CI应从低于零到高于零。但是,我不知道当对数比率必须被取幂时如何获得负值。因此,我试图计算其中一组(B)的CI,看看CI的下端和上端与A组的估计值之间的差异是什么。我认为这不是计算差异CI的正确方法,因为A的估计也是不确定的。

如果有人能帮助我,我会很高兴。

library(lme4)    
# Example data: 
set.seed(11)
treatment = c(rep("A",30), rep("B", 40))
site = rep(1:14, each = 5)
presence = c(rbinom(30, 1, 0.6),rbinom(40, 1, 0.8))
df = data.frame(presence, treatment, site)

# Likelihood ratio test 
M0 = glmer(presence ~ 1 + (1|site), family = "binomial", data = df)
M1 = glmer(presence ~ treatment + (1|site), family = "binomial", data = df)
anova(M1, M0)

# Calculating confidence intervals
cc <- confint(M1, parm = "beta_")
ctab <- cbind(est = fixef(M1), cc)
cdat = as.data.frame(ctab)

# Function to back-transform to probability (0-1)
unlogit = function(y){
    y_retransfromed = exp(y)/(1+exp(y))
    y_retransfromed
}

# Getting estimates
A_est = unlogit(cdat$est[1]) 
B_est = unlogit(cdat$est[1] + cdat$est[2])
B_lwr = unlogit(cdat$est[1] + cdat[2,2])
B_upr = unlogit(cdat$est[1] + cdat[2,3])

Difference_est = B_est - A_est

# This is how I tried to calculate the CI of the difference
Difference_lwr = B_lwr - A_est
Difference_upr = B_upr - A_est

# However, I believe this is wrong because A_est is also “uncertain” 

如何获得存在概率差异的置信区间?

1 个答案:

答案 0 :(得分:1)

我们可以通过以下方式计算平均治疗效果。从原始数据中,创建两个新数据集,一个是所有单位都接受治疗A,另一个是所有单位接受治疗B.现在,根据您的模型估计(在您的情况下,M1),我们计算预测这两个数据集中每个单位的结果。然后,我们计算两个数据集之间结果的平均差异,以获得我们估计的平均治疗效果。在这里,我们可以编写一个函数,它接受glmer个对象并计算平均处理效果:

ate <- function(.) {
  treat_A <- treat_B <- df
  treat_A$treatment <- "A"
  treat_B$treatment <- "B"
  c("ate" = mean(predict(., newdata = treat_B, type = "response") -
    predict(., newdata = treat_A, type = "response")))
}
ate(M1)
#        ate 
# 0.09478276 

我们如何获得不确定性区间?我们可以使用自举,即使用原始数据中随机生成的样本多次重新估计模型,每次计算平均治疗效果。然后我们可以使用自举平均治疗效果的分布来计算我们的不确定区间。在这里,我们使用bootMer函数

生成100个模拟
out <- bootMer(M1, ate, seed = 1234, nsim = 100)

并检查效果的分布:

quantile(out$t, c(0.025, 0.5, 0.975))
#        2.5%         50%       97.5% 
# -0.06761338  0.10508751  0.26907504