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"))
代码修正的关键说明
- 原函数的问题:你之前写的
func函数里错误地用lm(intercept, constant)重新拟合模型,完全没必要——我们已经有了训练好的lmout模型,直接用它的截距和斜率计算预测值就够了。 - 核心预测逻辑:线性回归的预测公式就是
y_hat = 截距 + 斜率 * x,函数里直接实现这个逻辑就行。 - 可视化要求:严格按照要求用
o(pch=1)和+(pch=3)分别展示实际值和估计值,加个图例能让图表更易懂。 - 参数提取简化:
lmout$coefficients[[1]]直接就能拿到截距,比你原来写的lmout[1]$coefficients[[1]]更简洁规范。
内容的提问来源于stack exchange,提问作者Pat8




