You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot绘制线性回归置信区间图报错:找不到heart.disease对象

解决R语言多元回归ggplot绘图报错及嵌套矩阵列访问问题

问题背景

执行以下R代码时遇到两个问题:

  1. 生成的plotting.data中predicted.y是嵌套矩阵,无法直接访问fit/lwr/upr子列
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:55:31