如何使用彩色置信区间带将回归绘制回原始比例?
How to plot regression transformed back on original scale with colored confidence interval bands?
我想绘制线性模型的直线和 95% 置信区间,其中响应已对数转换回数据的原始比例。因此,结果应该是一条曲线,包括原始尺度上的置信区间,而在 Logit 变换尺度上它将是一条直线。见代码:
# Data
dat <- data.frame(c(45,75,14,45,45,55,65,15,3,85),
c(.37, .45, .24, .16, .46, .89, .16, .24, .23, .49))
colnames(dat) <- c("age", "bil.")
# Logit transformation
dat$bb_logit <- log(dat$bil./(1-dat$bil.))
# Model
modelbb <- lm(bb_logit ~ age + I(age^2), data=dat)
summary(modelbb)
# Backtranform
dat$bb_back <- exp(predict.lm(modelbb))/ (1 + exp(predict.lm(modelbb)))
# Plot
plot(dat$age, dat$bb_back)
abline(modelbb)
我在这里尝试的是绘制曲线回归线并添加置信区间。 ggplot2
中有 geom_smooth
函数,可以在其中指定线性模型,但我找不到从 predict.lm(my model)
.
中绘制预测的方法
我还想知道如何添加代表置信区间的彩色多边形,如下图所示。我知道我必须使用函数 polygon
和坐标,但我不知道如何使用。
您可以在年龄范围内使用 predict
,例如 1:100
,为 CI 指定 interval=
选项。使用 type="l"
绘图将平滑一条漂亮的曲线。然后可以使用 lines
.
添加置信区间
p <- predict(modelbb, data.frame(age=1:100), interval="confidence")
# Backtransform
p.tr <- exp(p) / (1 + exp(p))
plot(1:100, p.tr[,1], type="l", ylim=range(p.tr), xlab="age", ylab="bil.")
sapply(2:3, function(i) lines(1:100, p.tr[,i], lty=2))
legend("topleft", legend=c("fit", "95%-CI"), lty=1:2)
产量
编辑
要获得阴影置信带,请使用 polygon
。由于您需要两个置信水平,因此您可能需要为每个置信水平制作一个 predict
ion。该行将被 polygon
覆盖,因此最好先使用 type="n"
创建一个空的 plot
,然后在最后绘制 lines
。 (请注意,我还将向您展示一些自定义轴标签的提示。)polygons
的技巧是使用 rev
.
来回表达值
p.95 <- predict(modelbb, data.frame(age=1:100), interval="confidence", level=.95)
p.99 <- predict(modelbb, data.frame(age=1:100), interval="confidence", level=.99)
# Backtransform
p.95.tr <- exp(p.95) / (1 + exp(p.95))
p.99.tr <- exp(p.99) / (1 + exp(p.99))
plot(1:100, p.99.tr[,1], type="n", ylim=range(p.99.tr), xlab="Age", ylab="",
main="", yaxt="n")
mtext("Tree biomass production", 3, .5)
mtext("a", 2, 2, at=1.17, xpd=TRUE, las=2, cex=3)
axis(2, (1:5)*.2, labels=FALSE)
mtext((1:5)*2, 2, 1, at=(1:5)*.2, las=2)
mtext(bquote(Production ~(kg~m^-2~year^-1)), 2, 2)
# CIs
polygon(c(1:100, 100:1), c(p.99.tr[,2], rev(p.99.tr[,3])), col=rgb(.5, 1, .2),
border=NA)
polygon(c(1:100, 100:1), c(p.95.tr[,2], rev(p.95.tr[,3])), col=rgb(0, .8, .5),
border=NA)
# fit
lines(1:100, p.99.tr[,1], ylim=range(p.99.tr), lwd=2)
#legend
legend("topleft", legend=c("fit", "99%-CI", "95%-CI"), lty=c(1, NA, NA), lwd=2,
pch=c(NA, 15, 15), bty="n",
col=c("#000000", rgb(.5, 1, .2), rgb(0, .8, .5)))
产量
我想绘制线性模型的直线和 95% 置信区间,其中响应已对数转换回数据的原始比例。因此,结果应该是一条曲线,包括原始尺度上的置信区间,而在 Logit 变换尺度上它将是一条直线。见代码:
# Data
dat <- data.frame(c(45,75,14,45,45,55,65,15,3,85),
c(.37, .45, .24, .16, .46, .89, .16, .24, .23, .49))
colnames(dat) <- c("age", "bil.")
# Logit transformation
dat$bb_logit <- log(dat$bil./(1-dat$bil.))
# Model
modelbb <- lm(bb_logit ~ age + I(age^2), data=dat)
summary(modelbb)
# Backtranform
dat$bb_back <- exp(predict.lm(modelbb))/ (1 + exp(predict.lm(modelbb)))
# Plot
plot(dat$age, dat$bb_back)
abline(modelbb)
我在这里尝试的是绘制曲线回归线并添加置信区间。 ggplot2
中有 geom_smooth
函数,可以在其中指定线性模型,但我找不到从 predict.lm(my model)
.
我还想知道如何添加代表置信区间的彩色多边形,如下图所示。我知道我必须使用函数 polygon
和坐标,但我不知道如何使用。
您可以在年龄范围内使用 predict
,例如 1:100
,为 CI 指定 interval=
选项。使用 type="l"
绘图将平滑一条漂亮的曲线。然后可以使用 lines
.
p <- predict(modelbb, data.frame(age=1:100), interval="confidence")
# Backtransform
p.tr <- exp(p) / (1 + exp(p))
plot(1:100, p.tr[,1], type="l", ylim=range(p.tr), xlab="age", ylab="bil.")
sapply(2:3, function(i) lines(1:100, p.tr[,i], lty=2))
legend("topleft", legend=c("fit", "95%-CI"), lty=1:2)
产量
编辑
要获得阴影置信带,请使用 polygon
。由于您需要两个置信水平,因此您可能需要为每个置信水平制作一个 predict
ion。该行将被 polygon
覆盖,因此最好先使用 type="n"
创建一个空的 plot
,然后在最后绘制 lines
。 (请注意,我还将向您展示一些自定义轴标签的提示。)polygons
的技巧是使用 rev
.
p.95 <- predict(modelbb, data.frame(age=1:100), interval="confidence", level=.95)
p.99 <- predict(modelbb, data.frame(age=1:100), interval="confidence", level=.99)
# Backtransform
p.95.tr <- exp(p.95) / (1 + exp(p.95))
p.99.tr <- exp(p.99) / (1 + exp(p.99))
plot(1:100, p.99.tr[,1], type="n", ylim=range(p.99.tr), xlab="Age", ylab="",
main="", yaxt="n")
mtext("Tree biomass production", 3, .5)
mtext("a", 2, 2, at=1.17, xpd=TRUE, las=2, cex=3)
axis(2, (1:5)*.2, labels=FALSE)
mtext((1:5)*2, 2, 1, at=(1:5)*.2, las=2)
mtext(bquote(Production ~(kg~m^-2~year^-1)), 2, 2)
# CIs
polygon(c(1:100, 100:1), c(p.99.tr[,2], rev(p.99.tr[,3])), col=rgb(.5, 1, .2),
border=NA)
polygon(c(1:100, 100:1), c(p.95.tr[,2], rev(p.95.tr[,3])), col=rgb(0, .8, .5),
border=NA)
# fit
lines(1:100, p.99.tr[,1], ylim=range(p.99.tr), lwd=2)
#legend
legend("topleft", legend=c("fit", "99%-CI", "95%-CI"), lty=c(1, NA, NA), lwd=2,
pch=c(NA, 15, 15), bty="n",
col=c("#000000", rgb(.5, 1, .2), rgb(0, .8, .5)))