计算预测间隔以进行逻辑回归


20

我想了解如何为逻辑回归估计生成预测间隔

建议我遵循Collett的Modeling Binary Data,第二版,第98-99页中的步骤。在实现了此过程并将其与R进行比较之后predict.glm,我实际上认为这本书展示的是计算置信区间而非预测区间的过程。

与相比predict.glm,Collett实施了该程序,如下所示。

我想知道:如何从这里开始产生预测间隔而不是置信区间?

#Derived from Collett 'Modelling Binary Data' 2nd Edition p.98-99
#Need reproducible "random" numbers.
seed <- 67

num.students <- 1000
which.student <- 1

#Generate data frame with made-up data from students:
set.seed(seed) #reset seed
v1 <- rbinom(num.students,1,0.7)
v2 <- rnorm(length(v1),0.7,0.3)
v3 <- rpois(length(v1),1)

#Create df representing students
students <- data.frame(
    intercept = rep(1,length(v1)),
    outcome = v1,
    score1 = v2,
    score2 = v3
)
print(head(students))

predict.and.append <- function(input){
    #Create a vanilla logistic model as a function of score1 and score2
    data.model <- glm(outcome ~ score1 + score2, data=input, family=binomial)

    #Calculate predictions and SE.fit with the R package's internal method
    # These are in logits.
    predictions <- as.data.frame(predict(data.model, se.fit=TRUE, type='link'))

    predictions$actual <- input$outcome
    predictions$lower <- plogis(predictions$fit - 1.96 * predictions$se.fit)
    predictions$prediction <- plogis(predictions$fit)
    predictions$upper <- plogis(predictions$fit + 1.96 * predictions$se.fit)


    return (list(data.model, predictions))
}

output <- predict.and.append(students)

data.model <- output[[1]]

#summary(data.model)

#Export vcov matrix 
model.vcov <- vcov(data.model)

# Now our goal is to reproduce 'predictions' and the se.fit manually using the vcov matrix
this.student.predictors <- as.matrix(students[which.student,c(1,3,4)])

#Prediction:
this.student.prediction <- sum(this.student.predictors * coef(data.model))
square.student <- t(this.student.predictors) %*% this.student.predictors
se.student <- sqrt(sum(model.vcov * square.student))

manual.prediction <- data.frame(lower = plogis(this.student.prediction - 1.96*se.student), 
    prediction = plogis(this.student.prediction), 
    upper = plogis(this.student.prediction + 1.96*se.student))

print("Data preview:")
print(head(students))
print(paste("Point estimate of the outcome probability for student", which.student,"(2.5%, point prediction, 97.5%) by Collett's procedure:"))
manual.prediction
print(paste("Point estimate of the outcome probability for student", which.student,"(2.5%, point prediction, 97.5%) by R's predict.glm:"))    
print(output[[2]][which.student,c('lower','prediction','upper')])

一个基本问题,为什么将sqrt(sum(model.vcov * square.student))假定为标准误差?它不是标准偏差,需要除以sqrt(n)吗?如果是这样,应使用哪个n,用于拟合模型的n或用于预测的新数据框的n?
拉斐尔

Answers:


6

预测间隔可预测实际响应数据值以给定概率下降的位置。由于逻辑模型响应的可能值限制为0和1,因此100%预测间隔为。使用逻辑回归进行预测时,没有其他间隔真正有意义。由于始终是相同的时间间隔,因此通常没有足够的兴趣来生成或讨论。0<=ÿ<=1个


6
我正在寻找在对数奇数空间中的预测的95%预测间隔。后来我将其转换为概率空间。100%的预测间隔对于任何程序都不会是有趣的,对吧?例如,线性回归的100%预测间隔将包括-Inf到Inf ...无论如何,如您在我的代码中所见,预测间隔是在对数赔率空间中计算的,然后将其转换为概率空间。所以我认为我的问题没有意义。
carbocation 2012年

2
可以将对数奇数转换为概率,并且可以计算概率的置信区间(或对数奇数)。但是预测区间位于响应变量0或1上。如果您的结果是生存,即0 =死且1 =存活,那么您可以预测给定的一组协变量存活的概率,并计算出置信区间那个概率。但是结果是0/1,您不能让活着的62%的患者必须是0或1,因此唯一可能的预测间隔是0-0、0-1和1-1(即为什么大多数人会坚持置信区间)。
格雷格·斯诺

8
如果您遇到的响应是二项式的(在相同条件下可能是0-1的合计),那么预测间隔可能很有意义。
Glen_b-恢复莫妮卡2012年

7
Logistic回归是概率的回归,试图将某些事件的概率建模为回归变量的函数。此设置中的预测间隔被视为概率尺度或对数奇数尺度上的间隔,因此具有完美的感觉。
kjetil b halvorsen

2
@Cesar,通过假设Y沿直线正态分布来推导预测间隔公式,但是在逻辑回归中我们没有正态分布,我们有伯努利或二项式。在该页面上应用公式将导致置信区间(已经可以做到)或人为扩大的置信区间,而该区间不符合预测区间的定义(以原始结果量表预测实际结果)。就像提到的Glen_b一样,如果结果确实是二项式的,则预测间隔可能很有意义。
格雷格·斯诺
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.