我正在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()
调用中进行。
谢谢。
答案 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)