You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

R语言线性回归线绘制与预测:狗狗数量与抢食量回归分析需求

线性回归任务明确与代码修正

首先明确你需要完成的核心计算任务

根据你的描述和给定数据集,你需要搞定这几件事:

  • 用现有3组数据,建立狗狗数量和每只狗抢食量的线性回归模型
  • 用模型估算10只狗15只狗时,每只狗的抢食量
  • 写一个可复用函数,输入任意狗狗数量的向量x,就能输出对应的抢食量估计值向量
  • 完成可视化:用o点展示实际观测值,用+点展示模型的估计值,同时画出拟合的回归线

修正后的完整代码

# 构建数据集矩阵(保留你原来的数据定义)
rownames = c("1","2","3")
colnames = c("Number of dogs in a room", "Amount of food each dog can grab")
v <- matrix(c(8,12,20,15,10,2), nrow = 3, byrow=TRUE, dimnames = list(rownames,colnames))
print(v)

# 提取自变量(狗狗数量)和因变量(抢食量)向量
x <- c(8,20,10)
y <- c(12,15,2)

# 构建线性回归模型
lmout <- lm(y ~ x)
# 提取模型的截距和斜率(按提示的方式)
intercept <- lmout$coefficients[[1]]
slope <- lmout$coefficients[[2]]
cat("回归模型参数:截距 =", round(intercept,2), ",斜率 =", round(slope,2), "\n")

# 任务1:计算10只和15只狗时的估计值
pred_10 <- intercept + slope * 10
pred_15 <- intercept + slope * 15
cat("10只狗时每只狗抢食量估计值:", round(pred_10,2), "\n")
cat("15只狗时每只狗抢食量估计值:", round(pred_15,2), "\n")

# 任务2:编写计算估计值的函数
predict_food <- function(lm_model, x_vec){
  # 从训练好的模型中提取截距和斜率
  b0 <- lm_model$coefficients[[1]]
  b1 <- lm_model$coefficients[[2]]
  # 用线性回归公式计算预测值
  y_hat <- b0 + b1 * x_vec
  return(y_hat)
}

# 测试函数:计算现有x的估计值,以及10、15的估计值
all_preds <- predict_food(lmout, c(x, 10, 15))
cat("所有测试输入的估计值:", round(all_preds,2), "\n")

# 任务3:可视化实际值、估计值和回归线
# 先画实际值(用o点,对应pch=1)
plot(x, y, pch = 1, col = "black", 
     xlab = "房间内狗狗数量", ylab = "每只狗抢食量",
     main = "狗狗数量与抢食量的线性回归")
# 画估计值(用+点,对应pch=3)
y_hat <- predict_food(lmout, x)
points(x, y_hat, pch = 3, col = "red")
# 画回归线
abline(lmout, lty = "solid", col = "royalblue", lwd = 2)
# 添加图例让图更清晰
legend("topright", legend = c("实际值", "估计值", "回归线"),
       pch = c(1,3,NA), lty = c(NA,NA,"solid"),
       col = c("black","red","royalblue"))

代码修正的关键说明

  1. 原函数的问题:你之前写的func函数里错误地用lm(intercept, constant)重新拟合模型,完全没必要——我们已经有了训练好的lmout模型,直接用它的截距和斜率计算预测值就够了。
  2. 核心预测逻辑:线性回归的预测公式就是y_hat = 截距 + 斜率 * x,函数里直接实现这个逻辑就行。
  3. 可视化要求:严格按照要求用opch=1)和+pch=3)分别展示实际值和估计值,加个图例能让图表更易懂。
  4. 参数提取简化lmout$coefficients[[1]]直接就能拿到截距,比你原来写的lmout[1]$coefficients[[1]]更简洁规范。

内容的提问来源于stack exchange,提问作者Pat8

火山引擎 最新活动