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

R中模型与原始数据同图可视化、验证及二阶响应面拟合咨询

析因实验模型拟合相关问题解答

背景说明

我是R语言新手,仅掌握基础统计学知识,正在学习析因实验及模型拟合,参考《Design and Analysis of Experiments》(Montgomery 2013,ISBN:9781118097939)中的例5.3完成了如下操作:

  1. 构建数据集:
bottel_vul_data <- data.frame(A = rep(c(10, 12, 14), each = 2),
                              B = rep(c(25, 30), each = 12),
                              C = rep(c(200, 250), each = 6),        
                              vul = c(-3, -1, 0, 1, 5, 4,
                                      -1,  0, 2, 1, 7, 6,   
                                      -1,  0, 2, 3, 7, 9,
                                       1,  1, 6, 5, 10, 11))
  1. 执行ANOVA分析:
bottel_anova <- aov(vul ~ factor(A) * B * C, data = bottel_vul_data)
summary(bottel_anova)

结果与教材一致,随后对比了4个线性回归模型,通过模型间ANOVA确定**Model4(包含A、B、C及A:B交互项)**为合适模型。现针对提出的技术问题逐一解答:


1. 如何在R中将拟合模型与原始数据绘制在同一张图上进行可视化?

可以用ggplot2或基础绘图系统实现,先拟合Model4并生成预测值,再将原始数据与预测结果合并展示:

步骤1:拟合模型并生成预测值

model4 <- lm(vul ~ A + B + C + A:B, data = bottel_vul_data)
bottel_vul_data$pred_vul <- predict(model4)

步骤2:用ggplot2绘图(推荐)

以A为横轴,按B、C的水平区分数据,同时展示原始点与拟合线:

library(ggplot2)

ggplot(bottel_vul_data, aes(x = A, y = vul, color = factor(B))) +
  geom_point(size = 3, alpha = 0.7) +  # 原始数据点
  geom_line(aes(y = pred_vul), linewidth = 1) +  # 模型拟合线
  facet_wrap(~factor(C)) +  # 按C的水平分面展示
  labs(title = "原始数据与Model4拟合结果对比",
       x = "因子A", y = "响应vul", color = "因子B") +
  theme_minimal()

步骤3:用基础绘图系统实现

par(mfrow = c(1,2))  # 分两列展示C的两个水平
for (c_val in unique(bottel_vul_data$C)) {
  sub_data <- subset(bottel_vul_data, C == c_val)
  plot(sub_data$A, sub_data$vul, col = sub_data$B, pch = 16,
       main = paste("C =", c_val), xlab = "A", ylab = "vul")
  # 按B的水平绘制拟合线
  for (b_val in unique(sub_data$B)) {
    fit_line <- subset(sub_data, B == b_val)
    lines(fit_line$A, fit_line$pred_vul, col = b_val, lwd = 2)
  }
  legend("topleft", legend = unique(sub_data$B), col = unique(sub_data$B), lwd = 2, pch = 16)
}
par(mfrow = c(1,1))

2. 如何验证该模型是否能准确代表数据?

从残差分析、拟合优度、显著性检验、预测精度四个维度验证:

(1) 残差分析

通过残差诊断图判断模型假设(线性、方差齐性、正态性)是否成立:

bottel_vul_data$residuals <- resid(model4)

# 生成标准残差诊断图
par(mfrow = c(2,2))
plot(model4)
par(mfrow = c(1,1))
  • 残差vs拟合值:点随机分布在0线附近说明方差齐性,无遗漏非线性关系;
  • 正态Q-Q图:点接近直线说明残差符合正态分布;
  • 尺度-位置图:点分布均匀说明方差稳定;
  • 残差vs杠杆值:识别Cook距离大的异常点。

(2) 拟合优度

查看$R2$和调整$R2$,值越接近1拟合效果越好:

summary(model4)$r.squared
summary(model4)$adj.r.squared

(3) 显著性检验

验证整体模型及各变量的显著性:

anova(model4)  # 整体模型及变量的F检验
summary(model4)  # 各系数的t检验

(4) 预测精度验证

用留一交叉验证评估模型预测能力:

library(boot)
cv.err <- cv.glm(bottel_vul_data, model4)$delta[1]
cat("留一交叉验证均方误差:", cv.err, "\n")

均方误差越小,模型预测精度越高。


3. 如何在R中拟合二阶模型以生成响应面,是否有类似lm()的可用函数?

可以直接用lm()拟合二阶模型,也可以用专门的rsm包简化操作:

(1) 用lm()拟合二阶模型

二阶模型包含线性项、平方项和所有二阶交互项,公式中用I()表示数学运算:

rs_model <- lm(vul ~ A + B + C + I(A^2) + I(B^2) + I(C^2) + A:B + A:C + B:C, data = bottel_vul_data)
summary(rs_model)

(2) 用rsm包拟合并生成响应面

rsm包专为响应面分析设计,语法更简洁,绘图更便捷:

install.packages("rsm")
library(rsm)

# 拟合二阶模型,SO()表示包含所有二阶项
rs_model_rsm <- rsm(vul ~ SO(A, B, C), data = bottel_vul_data)
summary(rs_model_rsm)

# 绘制等高线图和3D响应面图(固定C为均值)
contour(rs_model_rsm, ~ A + B, at = list(C = mean(bottel_vul_data$C)))
persp(rs_model_rsm, ~ A + B, at = list(C = mean(bottel_vul_data$C)), theta = 30, phi = 30)

内容的提问来源于stack exchange,提问作者Philip de Bruin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:45:43