帮我添加一个模型拟合效果图的代码,并且图中需要有回归方程,还有点的图例,让他像sci文章里的回归方程图一样,### 1. 加载包与检查环境 if (!require("mgcv")) install.packages("mgcv") # 确保mgcv包已安装 library(mgcv) ### 2. 数据读取与预处理 # 读取数据(注意文件路径和编码) tryCatch( { data <- read.csv("C:/Users/Administrator/Desktop/08102710001.csv", header = TRUE, fileEncoding = "UTF-8") cat("数据读取成功!\n") }, error = function(e) { stop("文件读取失败,请检查路径或文件名是否为0810.csv") } ) # 检查关键变量是否存在 required_vars <- c("LST_0810", "TEM", "BD", "water", "green", "RD", "JZ", "road_DIST", "NDVI", "water_DIST", "Green_DIST") if (!all(required_vars %in% colnames(data))) { stop("数据列名缺失或与TEM/BD/RD不匹配") } # 删除缺失值(按需替换为插补方法) data_clean <- na.omit(data) cat("删除缺失值后剩余", nrow(data_clean), "条有效数据\n") library(ggplot2) ggplot(data, aes(x=LST_0810)) + geom_histogram(bins=30, fill="skyblue") + theme_bw() ### 3. 构建GAM模型 # 全变量平滑模型(默认自由度) model <- gam( TEM ~ s(LST_0810) + s(BD) + s(road_DIST) + s(water_DIST) + s(NDVI) + s(RD) + s(green) + s(JZ) + s(water) + s(Green_DIST), # 所有自变量施加平滑 data = data_clean, method = "REML", # 推荐参数估计方法 family = gaussian() # 适用于连续型因变量 ) ### 4. 模型诊断与解读 # 模型摘要(关注显著性和解释力) cat("----- 模型摘要 -----\n") print(summary(model)) # 诊断残差与模型假设(需观察图形是否合理) cat("\n----- 模型诊断 -----\n") gam.check(model) ### 5. 可视化效应曲线 # 生成各变量的平滑效应图(含残差) cat("\n----- 效应可视化 -----\n") par(mfrow = c(2, 2)) # 设置2x2画布 plot(model, pages = 1, residuals = TRUE, all.terms = TRUE) par(mfrow = c(1, 1)) # 恢复默认画布
时间: 2025-03-17 16:11:09 浏览: 111
<think>嗯,用户希望在他们现有的R代码中添加一个模型拟合效果图,要求图中包含回归方程和点的图例,并且要符合SCI文章的样式。我需要仔细看看他们提供的代码,理解现有的结构,然后找到合适的位置插入绘图代码。
首先,用户已经使用了mgcv包构建了GAM模型,模型对象是model。他们可能想展示模型预测值与实际观测值的关系,也就是拟合效果图。通常这种图会用散点图表示实际值,用预测值做回归线,再加上方程和R²等统计量。
接下来,用户提到要像SCI文章里的图,这意味着需要调整图的样式,比如使用白色背景、清晰的图例、合适的字体大小,以及正确的统计信息标注。可能需要用ggplot2来绘制,因为用户已经加载了ggplot2并画了直方图。
在现有代码中,第5部分是可视化效应曲线,使用的是基础的plot函数。用户可能需要将新的效果图添加在这里,或者单独作为一个部分。需要确定在模型诊断和效应曲线之后添加比较合适。
然后,如何提取模型的预测值呢?可以使用predict函数获取模型的拟合值。实际值就是data_clean中的TEM变量。需要确保data_clean中没有缺失值,因为模型是用data_clean构建的。
接下来,绘制散点图,x轴是实际值,y轴是预测值,或者反过来?通常,在回归分析中,实际值作为y,预测值作为x,或者两者都作为同一轴,视情况而定。可能需要确认哪种方式更合适。不过常见的是预测值 vs 实际值,或者实际值 vs 预测值,两者都可以,但需要保持一致。
然后,添加回归方程和R²。这里可能需要用lm拟合预测值和实际值之间的线性关系,因为GAM本身的方程可能比较复杂,无法直接显示。所以,在拟合效果图中,通常会做一个线性回归线,并显示方程和R²,来评估预测值和实际值之间的一致性。
图例方面,用户希望有“点”的图例,可能是指数据点的图例说明,比如不同类别的点,但数据中可能没有分类变量。需要确认用户的需求。或者,可能是指图例的位置和样式需要符合SCI标准,比如放在图内适当位置,字体清晰。
另外,需要注意代码的正确性,比如使用ggplot2时,数据框是否正确,是否处理了NA值。因为data_clean是经过na.omit处理的,而model是用data_clean构建的,所以预测值和实际值都应该是完整的。
现在,整理步骤:
1. 提取预测值:pred <- predict(model)
2. 创建数据框:plot_data <- data.frame(Actual = data_clean$TEM, Predicted = pred)
3. 使用ggplot2绘制散点图,添加平滑线(如geom_smooth方法为lm)
4. 计算R²和回归方程,通常用lm拟合Actual ~ Predicted,得到斜率和截距
5. 将方程和R²添加到图中,使用annotate或geom_text
6. 调整主题,使用theme_bw(),调整字体大小,图例位置等
7. 确保图片导出格式符合SCI要求,比如DPI和尺寸,但用户可能只需要代码,不需要导出部分
可能的代码结构如下:
library(ggplot2)
plot_data <- data.frame(Actual = data_clean$TEM, Predicted = predict(model))
lm_fit <- lm(Actual ~ Predicted, data = plot_data)
r_sq <- summary(lm_fit)$r.squared
eq <- sprintf("y = %.2fx + %.2f\nR² = %.2f", coef(lm_fit)[2], coef(lm_fit)[1], r_sq)
ggplot(plot_data, aes(x = Actual, y = Predicted)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, color = "red") +
geom_abline(intercept = 0, slope = 1, linetype = "dashed") +
annotate("text", x = min(plot_data$Actual), y = max(plot_data$Predicted),
label = eq, hjust = 0, vjust = 1, size = 4) +
labs(x = "Actual TEM", y = "Predicted TEM") +
theme_bw() +
theme(panel.grid = element_blank(),
legend.position = "top")
但需要检查用户的数据中TEM是连续变量,且预测值和实际值的范围是否合适。另外,图例可能需要添加,比如如果有不同的分组,但用户的数据中可能没有,所以可能需要省略图例,或者用户提到的“点的图例”可能是指数据点的说明,此时可能需要明确。如果只是散点,可能不需要图例,但用户要求有图例,可能需要确认。
或者,用户可能指的是回归线的图例,比如显示拟合线、1:1线等。这时需要用不同的颜色或线型,并在图例中说明。比如,红色线为回归拟合,黑色虚线为1:1线,并在图例中标明。
所以,调整代码:
在geom_smooth和geom_abline中添加colour和linetype参数,并在scale中设置图例标签:
ggplot(plot_data, aes(x = Actual, y = Predicted)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, aes(color = "Regression Line")) +
geom_abline(aes(intercept = 0, slope = 1, linetype = "1:1 Line"), color = "black") +
scale_color_manual(values = c("Regression Line" = "red")) +
scale_linetype_manual(values = c("1:1 Line" = "dashed")) +
labs(x = "Actual TEM", y = "Predicted TEM", color = NULL, linetype = NULL) +
theme_bw() +
theme(panel.grid = element_blank(),
legend.position = c(0.8, 0.2),
legend.background = element_blank()) +
annotate("text", x = min(plot_data$Actual), y = max(plot_data$Predicted),
label = eq, hjust = 0, vjust = 1, size = 4)
这样,图例会显示回归线和1:1线,颜色和线型对应。同时,方程和R²显示在左上角。
但需要测试这段代码是否正确,尤其是aes和scale_manual的使用是否正确。另外,用户可能需要将图例放置在合适的位置,如右上角或其他位置,符合SCI格式。
最后,需要将这段代码整合到用户的原有流程中,可能放在模型诊断之后,作为第5或6部分。并确保所有必要的包已加载,比如ggplot2已经加载,因为用户之前已经用了ggplot画直方图。
综上所述,添加的代码部分可能如下:
### 6. 模型拟合效果图
# 创建预测值与实际值数据框
plot_data <- data.frame(Actual = data_clean$TEM, Predicted = predict(model))
# 计算回归方程与R²
lm_fit <- lm(Actual ~ Predicted, data = plot_data)
r_squared <- summary(lm_fit)$r.squared
equation <- sprintf("y = %.2fx + %.2f", coef(lm_fit)[2], coef(lm_fit)[1])
# 绘制拟合效果图
library(ggplot2)
ggplot(plot_data, aes(x = Actual, y = Predicted)) +
geom_point(alpha = 0.6, aes(color = "观测点")) + # 添加图例标签
geom_smooth(method = "lm", se = FALSE, aes(color = "回归线")) +
geom_abline(intercept = 0, slope = 1, linetype = "dashed", aes(color = "1:1线")) +
scale_color_manual(values = c("观测点" = "black", "回归线" = "red", "1:1线" = "blue")) +
labs(x = "实际温度 (°C)", y = "预测温度 (°C)", color = "") +
annotate("text", x = min(plot_data$Actual), y = max(plot_data$Predicted),
label = paste(equation, "\nR² = ", round(r_squared, 2)),
hjust = 0, vjust = 1, size = 5) +
theme_bw() +
theme(
panel.grid = element_blank(),
legend.position = c(0.05, 0.95),
legend.justification = c(0, 1),
legend.background = element_blank(),
text = element_text(size = 12)
)
不过需要测试颜色和图例是否正确。可能将观测点作为点的颜色,回归线和1:1线作为不同颜色,并正确映射到图例。但原来的geom_point的color在aes中设置为"观测点",而scale_color_manual分配颜色,这可能有效。或者,可能需要将颜色和线型分开处理,因为点和线的图例可能需要不同的美学映射。不过,上述代码可能有效,但需要调整。
另一种方式,使用不同的aes参数,例如:
geom_point(aes(color = "观测点")) +
geom_smooth(aes(color = "回归线"), ...) +
geom_abline(aes(color = "1:1线", linetype = "1:1线"), ...) +
scale_color_manual(values = c("观测点" = "black", "回归线" = "red", "1:1线" = "blue")) +
scale_linetype_manual(values = c("1:1线" = "dashed")) +
这样,颜色和线型分开处理,可能更清晰。但需要注意图例合并的问题。可能需要将linetype和color的图例合并。
或者,将1:1线用linetype,而回归线用颜色,这样图例会有两个部分:颜色(观测点、回归线)和线型(1:1线)。但用户可能希望图例简洁,可能需要调整。
不过,用户要求的是“点的图例”,可能是指观测点的图例,而回归方程线和1:1线也需要图例。这时候,可能需要将所有图例项统一管理。
可能更简单的方式是将点和线分开处理:
ggplot(plot_data, aes(x = Actual, y = Predicted)) +
geom_point(aes(color = "观测值"), alpha = 0.6) +
geom_smooth(method = "lm", se = FALSE, aes(color = "回归拟合")) +
geom_abline(aes(intercept = 0, slope = 1, linetype = "1:1线"), color = "gray40") +
scale_color_manual(values = c("观测值" = "black", "回归拟合" = "red")) +
scale_linetype_manual(values = c("1:1线" = "dashed")) +
labs(x = "实际温度 (°C)", y = "预测温度 (°C)", color = "", linetype = "") +
... # 其他主题设置
这样,颜色图例包含观测值和回归拟合,线型图例包含1:1线。这样图例可能更清晰。同时,方程和R²用annotate添加在角落。
现在,关于回归方程,用户可能希望显示的是预测值与实际值之间的线性回归方程,而不是GAM模型的方程,因为GAM的方程比较复杂,无法简单表示。所以这里的方程是y = ax + b,其中y是预测值,x是实际值,或者反过来,需要确认。通常,在预测vs实际图中,x轴是实际值,y轴是预测值,所以回归线是 Predicted = a*Actual + b,所以方程应该是这样。
在代码中,lm_fit是lm(Actual ~ Predicted),即实际值作为因变量,预测值作为自变量,这可能不太直观。或者应该用lm(Predicted ~ Actual),这样得到的是预测值 = a*Actual + b,这更符合图中的x和y轴。需要检查。
比如,图中x是Actual,y是Predicted,所以拟合的线性模型应该是 Predicted ~ Actual,即 y ~ x。所以正确的lm应该是:
lm_fit <- lm(Predicted ~ Actual, data = plot_data)
这样,斜率和截距对应图中的回归线。这时候,方程应该是y = a*x + b,对应图中的x和y轴。而R²是这个线性模型的R平方,表示预测值与实际值的线性相关程度。
因此,需要调整lm_fit的公式:
lm_fit <- lm(Predicted ~ Actual, data = plot_data)
这样,coef(lm_fit)[2]是斜率,coef(lm_fit)[1]是截距,方程应为y = slope*x + intercept。
但用户可能希望方程显示在图上,例如:“Predicted = a * Actual + b”,所以需要用这个公式。
现在,将这些调整到代码中:
# 计算回归方程与R²(注意模型方向)
lm_fit <- lm(Predicted ~ Actual, data = plot_data)
r_squared <- summary(lm_fit)$r.squared
intercept <- coef(lm_fit)[1]
slope <- coef(lm_fit)[2]
equation <- sprintf("Predicted = %.2f + %.2f × Actual", intercept, slope)
或者,更符合数学格式:
equation <- sprintf("italic(y) == %.2f + %.2f * italic(x)", intercept, slope)
r2_label <- sprintf("italic(R)^2 == %.2f", r_squared)
然后在annotate中使用parse=TRUE以正确显示斜体:
annotate("text", x = x_pos, y = y_pos,
label = paste(equation, r2_label, sep = "\n"), parse = TRUE, ...)
这样,方程和R²会以斜体数学符号显示,更符合SCI格式。
所以,调整后的代码:
# 计算回归方程与R²
lm_fit <- lm(Predicted ~ Actual, data = plot_data)
r_squared <- summary(lm_fit)$r.squared
intercept <- coef(lm_fit)[1] %>% round(2)
slope <- coef(lm_fit)[2] %>% round(2)
# 创建公式标签
equation <- paste0("italic(y) == ", intercept, " + ", slope, " * italic(x)")
r2_label <- paste0("italic(R)^2 == ", round(r_squared, 2))
# 在ggplot中使用
annotate("text", x = min(plot_data$Actual), y = max(plot_data$Predicted),
label = paste(equation, r2_label, sep = "~\n"), parse = TRUE, hjust = 0, vjust = 1, size = 4)
这里,parse=TRUE使得标签中的表达式被解析为数学公式,注意使用==和*。同时,用~\n来分隔两行,确保换行正确。
此外,可能需要调整标签的位置,使其位于图的左上角或右上角,避免遮挡数据点。比如,x使用min或max,根据坐标轴的范围。
最后,整合所有调整后的代码,确保正确性,并添加到用户的代码流程中。可能还需要检查数据是否正确,比如data_clean是否包含TEM,以及预测值的正确性。
综上,最终的添加代码部分应该是:
### 6. 模型拟合效果图
# 提取预测值与实际值
plot_data <- data.frame(
Actual = data_clean$TEM,
Predicted = predict(model)
)
# 计算回归方程与R²
lm_fit <- lm(Predicted ~ Actual, data = plot_data)
r_squared <- summary(lm_fit)$r.squared
intercept <- round(coef(lm_fit)[1], 2)
slope <- round(coef(lm_fit)[2], 2)
# 创建公式标签(使用plotmath语法)
equation_label <- sprintf("italic(y) == %.2f + %.2f~italic(x)", intercept, slope)
r2_label <- sprintf("italic(R)^2 == %.2f", r_squared)
# 绘制拟合效果图
library(ggplot2)
ggplot(plot_data, aes(x = Actual, y = Predicted)) +
geom_point(aes(color = "观测值"), alpha = 0.6, size = 2) +
geom_smooth(method = "lm", se = FALSE, aes(color = "回归线"), linewidth = 0.8) +
geom_abline(aes(intercept = 0, slope = 1, linetype = "1:1线"), color = "gray40", linewidth = 0.8) +
scale_color_manual(values = c("观测值" = "black", "回归线" = "red")) +
scale_linetype_manual(values = c("1:1线" = "dashed")) +
labs(x = "实际温度 (°C)", y = "预测温度 (°C)", color = NULL, linetype = NULL) +
annotate("text", x = min(plot_data$Actual), y = max(plot_data$Predicted),
label = paste(equation_label, r2_label, sep = "\n"),
parse = TRUE, hjust = 0, vjust = 1, size = 4) +
theme_bw() +
theme(
panel.grid = element_blank(),
legend.position = c(0.05, 0.95),
legend.justification = c(0, 1),
legend.background = element_blank(),
legend.key = element_blank(),
text = element_text(size = 12),
axis.title = element_text(face = "bold")
)
这样,该图包括观测值的散点,回归线(红色),1:1的虚线,图例在左上角,方程和R²以斜体数学格式显示在图的左上角。颜色和图例清晰,符合SCI图表要求。
需要提醒用户检查文件路径和数据列名是否正确,以及确保所有必要的包已安装。此外,可能需要调整图像尺寸和保存参数,比如使用ggsave导出高分辨率图片,但用户可能只需要绘图代码。</think>### 6. 模型拟合效果图
以下是添加的模型拟合可视化代码,包含回归方程、图例和SCI期刊风格设置:
```r
### 6. 模型拟合效果可视化
# 生成预测值与实际值数据框
plot_data <- data.frame(
Actual = data_clean$TEM,
Predicted = predict(model)
)
# 计算线性回归参数
library(ggplot2)
fit <- lm(Predicted ~ Actual, data = plot_data)
eq <- substitute(
italic(y) == a + b %.% italic(x)*","~~italic(R)^2~"="~r2,
list(
a = sprintf("%.2f", coef(fit)[1]),
b = sprintf("%.2f", coef(fit)[2]),
r2 = sprintf("%.2f", summary(fit)$r.squared)
)
)
# 绘制SCI风格拟合图
ggplot(plot_data, aes(x = Actual, y = Predicted)) +
geom_point(aes(color = "观测值"), alpha = 0.6, size = 2.5) + # 散点图层
geom_smooth(method = "lm", se = FALSE,
aes(color = "回归线"), linewidth = 1.2) + # 回归线
geom_abline(intercept = 0, slope = 1,
aes(linetype = "1:1参考线"), color = "gray40") + # 1:1参考线
scale_color_manual(values = c("观测值" = "#2c7bb6",
"回归线" = "#d7191c")) + # 颜色映射
scale_linetype_manual(values = "dashed") + # 线型映射
labs(x = "实际温度 (°C)", y = "预测温度 (°C)") +
annotate("text", x = min(plot_data$Actual),
y = max(plot_data$Predicted)*0.95,
label = as.character(as.expression(eq)),
parse = TRUE, hjust = 0, vjust = 1,
size = 5, color = "black") + # 方程标注
theme_bw(base_size = 14) + # 基础主题
theme(
panel.grid = element_blank(), # 去除网格线
legend.position = c(0.12, 0.88), # 图例位置
legend.title = element_blank(), # 去除图例标题
legend.background = element_rect(fill = alpha("white", 0.8)), # 图例背景
axis.title = element_text(face = "bold"), # 坐标轴标题加粗
legend.spacing = unit(0.1, "cm") # 图例间距
) +
guides(
color = guide_legend(order = 1), # 颜色图例顺序
linetype = guide_legend(order = 2) # 线型图例顺序
)
```
### 代码说明:
1. **数据准备**
- 创建包含实际温度(`Actual`)和预测温度(`Predicted`)的数据框
2. **统计参数计算**
- 使用线性回归计算拟合方程参数和R²值
- 使用`substitute()`生成符合数学公式格式的标签
3. **可视化要素**
- **散点图**:蓝色观测点展示实际值与预测值的对应关系
- **回归线**:红色实线表示最佳拟合直线
- **1:1参考线**:灰色虚线作为理想拟合的参考基准
- **方程标注**:自动计算并显示回归方程和R²值
4. **SCI风格设置**
- 无网格线、加粗坐标轴标题
- 半透明图例背景、合理的图例排序
- 专业配色方案(采用ColorBrewer的蓝-红配色)
### 输出效果:
该图将显示:
- 实际温度与预测温度的散点分布
- 红色回归线及其方程
- 灰色虚线1:1参考线
- 清晰的图例系统
- 符合期刊要求的字体大小和元素比例
建议使用`ggsave("figure.png", width=15, height=12, units="cm", dpi=600)`导出高分辨率图片用于投稿。
阅读全文
相关推荐














