Ale*_*lex 4 statistics regression r confidence-interval glm
在执行逻辑回归后,我将使模型适合这个出色示例中提供的数据,该示例如何计算响应的95%置信区间:
foo <- mtcars[,c("mpg","vs")]; names(foo) <- c("x","y")
mod <- glm(y ~ x, data = foo, family = binomial)
preddata <- with(foo, data.frame(x = seq(min(x), max(x), length = 100)))
preds <- predict(mod, newdata = preddata, type = "link", se.fit = TRUE)
critval <- 1.96 ## approx 95% CI
upr <- preds$fit + (critval * preds$se.fit)
lwr <- preds$fit - (critval * preds$se.fit)
fit <- preds$fit
fit2 <- mod$family$linkinv(fit)
upr2 <- mod$family$linkinv(upr)
lwr2 <- mod$family$linkinv(lwr)
Run Code Online (Sandbox Code Playgroud)
现在,我的问题来自这样一个事实,即您可以直接通过以下方式直接获得响应
predict(..., type = 'response', se.fit = TRUE)
Run Code Online (Sandbox Code Playgroud)
没有改变
predict(..., type = 'link', se.fit = TRUE)
Run Code Online (Sandbox Code Playgroud)
但是,这会产生不同的标准误差。这些误差是什么?它们可以直接用于计算拟合响应值的置信区间吗?
相关的代码predict.glm是这样的:
switch(type, response = {
se.fit <- se.fit * abs(family(object)$mu.eta(fit))
fit <- family(object)$linkinv(fit)
}, link = , terms = )
Run Code Online (Sandbox Code Playgroud)
并比较输出:
preds_2 <- predict(mod, newdata = preddata, type = "response", se.fit = TRUE)
> head(preds_2$fit)
1 2 3 4 5 6
0.01265744 0.01399994 0.01548261 0.01711957 0.01892627 0.02091959
> head(preds_2$se.fit)
1 2 3 4 5 6
0.01944681 0.02098841 0.02263473 0.02439022 0.02625902 0.02824491
Run Code Online (Sandbox Code Playgroud)
从上述内容转到以下内容似乎不太明显:
> head(fit2)
1 2 3 4 5 6
0.01265744 0.01399994 0.01548261 0.01711957 0.01892627 0.02091959
> head(upr2)
1 2 3 4 5 6
0.2130169 0.2184891 0.2240952 0.2298393 0.2357256 0.2417589
> head(lwr2)
1 2 3 4 5 6
0.0006067975 0.0007205942 0.0008555502 0.0010155472 0.0012051633 0.0014297930
Run Code Online (Sandbox Code Playgroud)
如果您看一下?family,您将看到它$mu.eta是muover 的导数eta(即,反向链接函数的导数)。因此,se.fit = TRUE对于type = "response"给出真实标准误差的一阶近似值。这称为“增量法”。
当然,由于反向链接函数通常是非线性的,因此置信区间在拟合值附近不是对称的。因此,获得链路规模上的置信区间,然后将其映射回响应规模是正确的方法。