繁体   English   中英

R 用稳健的线性回归模型 (rlm) 绘制置信区间线

[英]R plot confidence interval lines with a robust linear regression model (rlm)

我需要为稳健的线性回归 (rlm) 模型绘制带有置信区间的散点图,我发现的所有示例仅适用于 LM。

这是我的代码:

model1 <- rlm(weightsE$brain ~ weightsE$body)
newx <- seq(min(weightsE$body), max(weightsE$body), length.out=70)
newx<-as.data.frame(newx)
colnames(newx)<-"brain"
conf_interval  <- predict(model1, newdata = data.frame(x=newx), interval = 'confidence',
                          level=0.95)

#create scatterplot of values with regression line 
plot(weightsE$body, weightsE$body)
abline(model1)

#add dashed lines (lty=2) for the 95% confidence interval
lines(newx, conf_interval[,2], col="blue", lty=2)
lines(newx, conf_interval[,3], col="blue", lty=2)

但是predict的结果并没有为上下层产生一条直线,它们更像是随机预测。

你有几个问题需要在这里解决。

  1. 生成模型时,不要使用rlm(weightsE$brain ~ weightsE$body) ,而是使用rlm(brain ~ body, data = weightsE) 否则,模型无法获取新数据进行预测。 您获得的任何预测都将由原始weightsE$body值产生,而不是由您传递给predict的新数据产生
  2. 您正在尝试使用名为“brain”的列创建预测数据框,但您正在尝试预测“brain”的值,因此您需要一个名为“body”的列
  3. newx已经是一个数据框,但由于某种原因,当您执行newdata = data.frame(x=newx)时,您将其包装在另一个数据框中。 只需通过newx
  4. 你正在用plot(weightsE$body, weightsE$body)绘图,它应该是plot(weightsE$body, weightsE$brain)

将所有这些放在一起,并使用与您自己的名称相同的虚拟数据集(见下文),我们得到:

library(MASS)

model1 <- rlm(brain ~ body, data = weightsE)

newx <- data.frame(body = seq(min(weightsE$body), 
                              max(weightsE$body), length.out=70))

conf_interval  <- predict(model1, newdata = data.frame(x=newx), 
                          interval = 'confidence',
                          level=0.95)

#create scatterplot of values with regression line 
plot(weightsE$body, weightsE$brain)
abline(model1)

#add dashed lines (lty=2) for the 95% confidence interval
lines(newx$body, conf_interval[, 2], col = "blue", lty = 2)
lines(newx$body, conf_interval[, 3], col = "blue", lty = 2)

在此处输入图像描述

顺便说一句,您可以用更少的代码在 ggplot 中完成所有工作:

library(ggplot2)

ggplot(weightsE, aes(body, brain)) + 
  geom_point() + 
  geom_smooth(method = MASS::rlm)

在此处输入图像描述

可重现的虚拟数据

data(mtcars)
weightsE <- setNames(mtcars[c(1, 6)], c("brain", "body"))
weightsE$body <- 10 - weightsE$body

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM