更改色散参数后快速计算置信区间的方法

时间:2019-04-19 20:22:46

标签: r glm poisson

我正在R中教授建模课。学生都是SAS用户,并且我必须创建与SAS输出完全匹配(如果可能)的课程资料。我正在研究Poisson回归部分,并尝试将PROC GENMOD与“ dscale”选项进行匹配,该选项会修改色散指数,从而使deviance / df == 1。

做起来很容易,但是我需要置信区间。我想向学生们展示如何做到这一点而无需手工计算。类似confint_default()confint()

数据

skin_cancer <- data.frame(CASES=c(1,16,30,71,102,130,133,40,4,38,
                              119,221,259,310,226,65),
                      CITY=c(rep(0,8),rep(1,8)),
                      N=c(172875, 123065,96216,92051,72159,54722,
                          32185,8328,181343,146207,121374,111353,
                          83004,55932,29007,7583),
                      agegp=c(1:8,1:8))
skin_cancer$ln_n = log(skin_cancer$N)

模型

fit <- glm(CASES ~ CITY, family="poisson", offset=ln_n, data=skin_cancer)

更改分散指数

summary(fit, dispersion= deviance(fit) / df.residual(fit)))

这使我得到“正确的”标准错误(根据SAS正确...)。但是显然我不能在confint()对象上运行summary()

有什么想法吗?奖励积分是,如果您可以告诉我如何更改模型中的分散指数,则不必在summary()调用中进行。

谢谢。

1 个答案:

答案 0 :(得分:0)

这是一个有趣的问题,比看起来要深一些。

最简单的可能答案是使用family="quasipoisson"代替泊松:

fitQ <- update(fit, family="quasipoisson")
confint(fitQ)

但是,这不能让您将色散调整为所需的值。它专门将色散更改为R在summary.glm中计算出的估算值,该估算值是基于Pearson卡方(Pearson残差平方的总和)而不是偏差,即

sum((object$weights * object$residuals^2)[object$weights > 0])/df.r

您应该意识到stats:::confint.glm()(实际上使用MASS:::confint.glm)是计算配置文件的置信区间,而不是Wald的置信区间(即,这不仅仅是调整标准差的问题)。

如果您对Wald置信区间(通常不太准确)感到满意,则可以按以下步骤破解stats::confint.default()请注意dispersion标题有点具有误导性,因为此函数基本上假定模型的原始离散度固定为1:如果使用估计离​​散度的模型,这将无法正常工作。

confint_wald_glm <- function(object, parm, level=0.95, dispersion=NULL) {
    cf <- coef(object)
    pnames <- names(cf)
    if (missing(parm)) 
      parm <- pnames
    else if (is.numeric(parm)) 
      parm <- pnames[parm]
    a <- (1 - level)/2
    a <- c(a, 1 - a)
    pct <- stats:::format.perc(a, 3)
    fac <- qnorm(a)
    ci <- array(NA, dim = c(length(parm), 2L), dimnames = list(parm, 
                                                               pct))
    ses <- sqrt(diag(vcov(object)))[parm]
    if (!is.null(dispersion)) ses <- sqrt(dispersion)*ses
    ci[] <- cf[parm] + ses %o% fac
    ci
}

confint_wald_glm(fit)
confint_wald_glm(fit,dispersion=2)