如何绘制 lm(y~x1+x2) 的 95% 置信区间
How to plot a 95% confidence interval for lm(y~x1+x2)
我遵循了 Max 的 但似乎不明白如何将 Alejandro 给出的解决方案应用于具有 lm(y~x1+x2) 形式的不同回归方程。
下面是你重现的数据和我做的。
y=c(139.31449, 105.17776, 105.38411, 99.27608, 92.29064, 91.55114, 84.44251, 78.40453, 74.66656, 73.33242, 72.42429, 77.08666)
x1=c(0.04, 0.00, 0.00, 0.00, 0.00, 0.00, 0.04, 0.00, 0.00, 0.00, 0.00, 0.00)
x2=c(0.00, 0.08, 0.10, 0.12, 0.15, 0.20, 0.00, 0.08, 0.10, 0.12, 0.15, 0.20)
lm1 <- lm(y ~ x1+x2)
newx = seq(min(x1+x2),max(x1+x2),by = 0.05)
conf_interval <- predict(lm1, newdata=data.frame(x=newx), interval="confidence",
level = 0.95)
plot(x1+x2, y, xlab="x", ylab="y")
abline(lm1, col="lightblue")
matlines(newx, conf_interval[,2:3], col = "blue", lty=2)
我不确定我是否为 newx 做了正确的事情。
我在添加回归线时遇到了问题,或者我不应该使用 abline? R 也不 运行 conf_interval 正确。
我尝试寻找与我的相似的主题,但很难找到。有人可以帮忙吗?谢谢
你的模型y~x1+x2
不是简单的线性回归(SLR),所以它的置信区间(CI)不能像SLR那样可视化。
有几种绘制此模型的方法 CI。
首先,使用predict3d::ggPredict()
,固定x2
,
ggPredict(lm1, digits = 1, se = TRUE)
其次,通过使用 plotly::plot_ly
和其他一些方法来绘制 3 维置信平面 (?)。
xgrid <- seq(0,0.04 , length.out = 30)
ygrid <- seq(0, 0.15, length.out = 30)
newdat <- expand.grid(xgrid, ygrid)
colnames(newdat) <- c("x1", "x2")
predicted <- predict(lm1, newdat, se = TRUE)
ymin <- predicted$fit - 1.96 * predicted$se.fit
ymax <- predicted$fit + 1.96 * predicted$se.fit
fitt <- predicted$fit
z <- matrix(fitt, length(xgrid))
ci.low <- matrix(ymin, length(xgrid))
ci.up <- matrix(ymax, length(xgrid))
library(plotly)
plot_ly(x = xgrid, y = ygrid) %>%
add_surface(z = z, colorscale = list(c(0,1), c("red", "blue"))) %>%
add_surface(z = ci.low, opacity = 0.5, showscale = FALSE, colorscale = list(c(0,1),c("grey","grey"))) %>%
add_surface(z = ci.up, opacity = 0.5, showscale = FALSE, colorscale = list(c(0,1),c("grey","grey")))
请注意,x
和 y
是您数据的 x1
和 x2
,z
是预测值 y
。
我遵循了 Max 的
下面是你重现的数据和我做的。
y=c(139.31449, 105.17776, 105.38411, 99.27608, 92.29064, 91.55114, 84.44251, 78.40453, 74.66656, 73.33242, 72.42429, 77.08666)
x1=c(0.04, 0.00, 0.00, 0.00, 0.00, 0.00, 0.04, 0.00, 0.00, 0.00, 0.00, 0.00)
x2=c(0.00, 0.08, 0.10, 0.12, 0.15, 0.20, 0.00, 0.08, 0.10, 0.12, 0.15, 0.20)
lm1 <- lm(y ~ x1+x2)
newx = seq(min(x1+x2),max(x1+x2),by = 0.05)
conf_interval <- predict(lm1, newdata=data.frame(x=newx), interval="confidence",
level = 0.95)
plot(x1+x2, y, xlab="x", ylab="y")
abline(lm1, col="lightblue")
matlines(newx, conf_interval[,2:3], col = "blue", lty=2)
我不确定我是否为 newx 做了正确的事情。 我在添加回归线时遇到了问题,或者我不应该使用 abline? R 也不 运行 conf_interval 正确。
我尝试寻找与我的相似的主题,但很难找到。有人可以帮忙吗?谢谢
你的模型y~x1+x2
不是简单的线性回归(SLR),所以它的置信区间(CI)不能像SLR那样可视化。
有几种绘制此模型的方法 CI。
首先,使用predict3d::ggPredict()
,固定x2
,
ggPredict(lm1, digits = 1, se = TRUE)
其次,通过使用 plotly::plot_ly
和其他一些方法来绘制 3 维置信平面 (?)。
xgrid <- seq(0,0.04 , length.out = 30)
ygrid <- seq(0, 0.15, length.out = 30)
newdat <- expand.grid(xgrid, ygrid)
colnames(newdat) <- c("x1", "x2")
predicted <- predict(lm1, newdat, se = TRUE)
ymin <- predicted$fit - 1.96 * predicted$se.fit
ymax <- predicted$fit + 1.96 * predicted$se.fit
fitt <- predicted$fit
z <- matrix(fitt, length(xgrid))
ci.low <- matrix(ymin, length(xgrid))
ci.up <- matrix(ymax, length(xgrid))
library(plotly)
plot_ly(x = xgrid, y = ygrid) %>%
add_surface(z = z, colorscale = list(c(0,1), c("red", "blue"))) %>%
add_surface(z = ci.low, opacity = 0.5, showscale = FALSE, colorscale = list(c(0,1),c("grey","grey"))) %>%
add_surface(z = ci.up, opacity = 0.5, showscale = FALSE, colorscale = list(c(0,1),c("grey","grey")))
请注意,x
和 y
是您数据的 x1
和 x2
,z
是预测值 y
。