2016-08-05 41 views
2

下面是一组虚构的概率数据,我将其转换为二项式,其中threshold of 0.5。我对离散数据运行了一个glm()模型,以测试从glm()返回的间隔是'平均预测间隔'(“置信区间”)还是'点预测间隔'(“预测间隔”)。从下面的图看来,返回的区间是后者 - “点预测区间”;注意,在95%的置信度下,这个样本中2/20点落在线外。Logistic回归的预测和置信区间

如果确实如此,那么如何使用glm()函数为0和1绑定的二项数据集生成R中的'平均预测间隔'(即“置信区间”)?请用适合线,给定概率,“置信区间”和“预测区间”来显示您的代码和绘图。

# Fictitious data 
xVal <- c(15,15,17,18,32,33,41,42,47,50, 
     53,55,62,63,64,65,66,68,70,79, 
     94,94,94,95,98) 
randRatio <- c(.01,.03,.05,.04,.01,.2,.1,.08,.88,.2, 
       .2,.99,.49,.88,.2,.88,.66,.87,.66,.90, 
       .98,.88,.95,.95,.95) 
# Converted to binomial 
randBinom <- ifelse(randRatio < .5, 0, 1) 

# Data frame for model 
binomData <- data.frame(
    randBinom = randBinom, 
    xVal = xVal 
) 

# Model 
mode1 <- glm(randBinom~ xVal, data = binomData, family = binomial(link = "logit")) 

# Predict all points in xVal range 
frame <- data.frame(xVal=(0:100)) 
predAll <- predict(mode1, newdata = frame,type = "link", se.fit=TRUE) 

# Params for intervals and plot 
confidence <- .95 
score <- qnorm((confidence/2) + .5) 
frame <- data.frame(xVal=(0:100)) 

#Plot 
with(binomData, plot(xVal, randBinom, type="n", ylim=c(0, 1), 
       ylab = "Probability", xlab="xVal")) 
lines(frame$xVal, plogis(predAll$fit), col = "red", lty = 1) 
lines(frame$xVal, plogis(predAll$fit + score * predAll$se.fit), col = "red", lty = 3) 
lines(frame$xVal, plogis(predAll$fit - score * predAll$se.fit), col = "red", lty = 3) 
points(xVal, randRatio, col = "red") # Original probabilities 
points(xVal, randBinom, col = "black", lwd = 3) # Binomial Points used in glm 

这里的情节,推测可能与“点预测的间隔”(即“​​预测区间”)的红色虚线,且平均配合在固体红色。黑点表示从初始概率离散二项数据randRatio

enter image description here

+0

我认为你的前提是不正确的。我认为你没有看到你所称的“点预测间隔”,而大多数人只是简单地称之为“预测间隔”。你所说的“平均预测间隔”(可能)是大多数人称之为“置信区间”的东西,并且它们适用于估计参数的合理位置。 –

+0

@ 42-我编辑了一些措辞,以更好地与您的评论保持一致。 –

+0

@ZheyuanLi请参阅修改后的问题。我很想看到你的解决方案,更有甚者,如果有一种方法使用glm()。在lm()上用“confidence”或“prediction”预测()似乎不是glm()的一个选项。请参阅:http://stackoverflow.com/questions/12544090/predict-lm-in-r-how-to-get-nonconstant-prediction-bands-around-fitted-values –

回答

1

我不知道,如果你所要求的直线上升预测区间,但如果你是,你可以简单地计算。

可以提取模型传统的置信区间为这样:

confint(model) 

,然后一旦你运行的预测,你可以根据预测,像这样计算的预测区间:

upper = predAll$fit + 1.96 * predAll$se.fit 
lower = predAll$fit - 1.96 * predAll$se.fit 

您只是简单地进行预测(如果您使用一组预测变量,则在任何给定的点)并加上和减去标准误差的1.96 *绝对值。 (1.96se包括正态分布的97.5%,并且代表正态分布中标准偏差的95%区间)

这与用于传统置信区间的公式相同,除了使用标准误差(与标准偏差相对)使得间隔更宽以说明预测本身的不确定性。

更新:

Method for plotting prediction invervals courtesy of Rstudio!

按照要求......虽然不是我做的!

+0

感谢您的方法。我会恳求你用“置信区间”和“预测间隔”以及完整的代码创建一个情节。 –

+0

为什么重新发明轮子...这里用ggplot2做这个简洁明智的方法: – sconfluentus

+0

这些也可以和GLM一起使用。 – sconfluentus