ggplot绘制线性回归置信区间图报错:找不到heart.disease对象
解决R语言多元回归ggplot绘图报错及嵌套矩阵列访问问题
问题背景
执行以下R代码时遇到两个问题:
- 生成的
plotting.data中predicted.y是嵌套矩阵,无法直接访问fit/lwr/upr子列 - 使用ggplot绘图时,
geom_ribbon报错Error in FUN(X[[i]], ...) : object 'heart.disease' not found
原操作代码:
# 1. 定义数据集 heartData <- structure(list(id = 1:6, biking = c(30.80124571, 65.12921517, 1.959664531, 44.80019562, 69.42845368, 54.40362555), smoking = c(10.89660802, 2.219563176, 17.58833051, 2.802558875, 15.9745046, 29.33317552 ), heart.disease = c(11.76942278, 2.854081478, 17.17780348, 6.816646909, 4.062223522, 9.550045997)), row.names = c(NA, 6L), class = "data.frame") # 2. 构建多元线性回归模型 model.1 <- lm( heart.disease ~ biking + smoking, data = heartData) # 3. 生成绘图用数据集 plotting.data <- expand.grid( biking = seq(min(heartData$biking), max(heartData$biking), length.out = 5), smoking = c(mean(heartData$smoking))) plotting.data$predicted.y <- predict(model.1, newdata = plotting.data, interval = 'confidence') plotting.data$smoking <- round(plotting.data$smoking, digits = 2) plotting.data$smoking <- as.factor(plotting.data$smoking) # 4. ggplot绘图(报错代码) heart.plot <- ggplot(data = heartData, aes(x = biking, y = heart.disease)) + geom_point() + geom_line(data = plotting.data, aes(x = biking, y = predicted.y[,"fit"], color = "red"), size = 1.25) + geom_ribbon(data = plotting.data, aes(ymin = predicted.y[,"lwr"], ymax = predicted.y[,"upr"]), alpha = 0.1) heart.plot
解决步骤
1. 拆解嵌套矩阵,生成独立列
predict(..., interval='confidence')返回的是矩阵,直接赋值给数据框列会形成嵌套结构。我们可以把矩阵转换成数据框后合并到原数据集,生成单独的fit、lwr、upr列:
# 替换原plotting.data的predicted.y赋值步骤 plotting.data <- expand.grid( biking = seq(min(heartData$biking), max(heartData$biking), length.out = 5), smoking = c(mean(heartData$smoking))) # 直接将预测结果合并到数据集,生成独立列 pred_results <- as.data.frame(predict(model.1, newdata = plotting.data, interval = 'confidence')) plotting.data <- cbind(plotting.data, pred_results) plotting.data$smoking <- round(plotting.data$smoking, digits = 2) plotting.data$smoking <- as.factor(plotting.data$smoking)
现在plotting.data会有biking、smoking、fit、lwr、upr这5个独立列,可以直接通过plotting.data$fit访问预测值。
2. 修改ggplot代码解决报错
报错原因是:全局aes设置了y=heart.disease,而geom_ribbon使用的plotting.data中没有这个列,ggplot会尝试继承全局映射导致找不到对象。解决方法有两种:
方法一:设置inherit.aes=FALSE
在geom_ribbon中禁用全局映射继承:
library(ggplot2) heart.plot <- ggplot(data = heartData, aes(x = biking, y = heart.disease)) + geom_point() + geom_line(data = plotting.data, aes(x = biking, y = fit, color = "red"), size = 1.25) + geom_ribbon(data = plotting.data, aes(ymin = lwr, ymax = upr), alpha = 0.1, inherit.aes = FALSE) heart.plot
方法二:明确覆盖x映射
在geom_ribbon的aes中明确指定x轴,避免继承全局的y映射:
heart.plot <- ggplot(data = heartData, aes(x = biking, y = heart.disease)) + geom_point() + geom_line(data = plotting.data, aes(x = biking, y = fit, color = "red"), size = 1.25) + geom_ribbon(data = plotting.data, aes(x = biking, ymin = lwr, ymax = upr), alpha = 0.1) heart.plot
两种方法都能解决报错,同时使用拆解后的独立列让代码更清晰易读。
内容的提问来源于stack exchange,提问作者Farzaneh
相关产品推荐
相关产品推荐

