[英]Confidence intervals for predictions from logistic regression
在 R 中, predict.lm 根據線性回歸的結果計算預測,並提供計算這些預測的置信區間。 根據手冊,這些區間是基於擬合的誤差方差,而不是基於系數的誤差區間。
另一方面,根據邏輯和泊松回歸(以及其他一些)計算預測的 predict.glm 沒有置信區間的選項。 我什至很難想象如何計算這樣的置信區間來為泊松和邏輯回歸提供有意義的見解。
是否存在為此類預測提供置信區間有意義的情況? 如何解釋它們? 這些情況下的假設是什么?
通常的方法是在線性預測器的尺度上計算置信區間,其中事情會更正常(高斯),然后應用鏈接函數的倒數將置信區間從線性預測器尺度映射到響應尺度。
為此,您需要做兩件事;
type = "link"
調用predict()
,以及se.fit = TRUE
調用predict()
。第一個在線性預測器的尺度上生成預測,第二個返回預測的標准誤差。 在偽代碼中
## foo <- mtcars[,c("mpg","vs")]; names(foo) <- c("x","y") ## Working example data
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)
preds
然后是一個包含組件fit
和se.fit
的列表。
那么線性預測器的置信區間是
critval <- 1.96 ## approx 95% CI
upr <- preds$fit + (critval * preds$se.fit)
lwr <- preds$fit - (critval * preds$se.fit)
fit <- preds$fit
critval
是根據需要從t或z (正態)分布中選擇的(我現在確切地忘記了用於哪種類型的 GLM 以及屬性是什么)以及所需的覆蓋率。 1.96
是高斯分布的值,覆蓋率為 95%:
> qnorm(0.975) ## 0.975 as this is upper tail, 2.5% also in lower tail
[1] 1.959964
現在對於fit
, upr
和lwr
我們需要對它們應用鏈接函數的逆函數。
fit2 <- mod$family$linkinv(fit)
upr2 <- mod$family$linkinv(upr)
lwr2 <- mod$family$linkinv(lwr)
現在您可以繪制所有三個和數據。
preddata$lwr <- lwr2
preddata$upr <- upr2
ggplot(data=foo, mapping=aes(x=x,y=y)) + geom_point() +
stat_smooth(method="glm", method.args=list(family=binomial)) +
geom_line(data=preddata, mapping=aes(x=x, y=upr), col="red") +
geom_line(data=preddata, mapping=aes(x=x, y=lwr), col="red")
我偶然發現了劉文穗的方法,該方法使用引導或模擬方法來解決泊松估計的問題。
作者的例子
pkgs <- c('doParallel', 'foreach')
lapply(pkgs, require, character.only = T)
registerDoParallel(cores = 4)
data(AutoCollision, package = "insuranceData")
df <- rbind(AutoCollision, AutoCollision)
mdl <- glm(Claim_Count ~ Age + Vehicle_Use, data = df, family = poisson(link = "log"))
new_fake <- df[1:5, 1:2]
boot_pi <- function(model, pdata, n, p) {
odata <- model$data
lp <- (1 - p) / 2
up <- 1 - lp
set.seed(2016)
seeds <- round(runif(n, 1, 1000), 0)
boot_y <- foreach(i = 1:n, .combine = rbind) %dopar% {
set.seed(seeds[i])
bdata <- odata[sample(seq(nrow(odata)), size = nrow(odata), replace = TRUE), ]
bpred <- predict(update(model, data = bdata), type = "response", newdata = pdata)
rpois(length(bpred), lambda = bpred)
}
boot_ci <- t(apply(boot_y, 2, quantile, c(lp, up)))
return(data.frame(pred = predict(model, newdata = pdata, type = "response"), lower = boot_ci[, 1], upper = boot_ci[, 2]))
}
boot_pi(mdl, new_fake, 1000, 0.95)
sim_pi <- function(model, pdata, n, p) {
odata <- model$data
yhat <- predict(model, type = "response")
lp <- (1 - p) / 2
up <- 1 - lp
set.seed(2016)
seeds <- round(runif(n, 1, 1000), 0)
sim_y <- foreach(i = 1:n, .combine = rbind) %dopar% {
set.seed(seeds[i])
sim_y <- rpois(length(yhat), lambda = yhat)
sdata <- data.frame(y = sim_y, odata[names(model$x)])
refit <- glm(y ~ ., data = sdata, family = poisson)
bpred <- predict(refit, type = "response", newdata = pdata)
rpois(length(bpred),lambda = bpred)
}
sim_ci <- t(apply(sim_y, 2, quantile, c(lp, up)))
return(data.frame(pred = predict(model, newdata = pdata, type = "response"), lower = sim_ci[, 1], upper = sim_ci[, 2]))
}
sim_pi(mdl, new_fake, 1000, 0.95)
是否可以針對特定值的Fit(2)-Curve獲得95%的CI,以便使人知道例如Fit值為24,CI為21-26?
我嘗試對實時PCR結果進行這種回歸,以找到檢測極限並獲得該值的CI。
謝謝你的幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.