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

在含LM、GAM散点图的GGally::ggpairs图中添加R²与P值的问题

解决方案

你需要修改自定义面板函数,在拟合模型后提取R²与P值,再将统计文本标注到面板上,修正后的完整代码如下:

library(tidyverse)
library(mgcv)
library(GGally)

# 数据准备部分保留原有逻辑
sel1<-select(rekap,c('Total_Ni', 'Total_Mg', 'Total_Fe', 'CEC', 'pH','SWC'))

# 自定义下三角面板:LM模型 + 统计值标注
lm_panel <- function(data, mapping, ...){
  # 提取x、y变量名
  x_var <- as_name(mapping$x)
  y_var <- as_name(mapping$y)
  
  # 拟合LM模型
  fit <- lm(formula = paste(y_var, "~", x_var), data = data)
  # 提取R²和P值
  r2 <- summary(fit)$r.squared |> round(3)
  p_val <- summary(fit)$coefficients[2,4] |> round(4)
  # 格式化统计文本,P值小于0.0001时可自行调整为P<0.0001的显示逻辑
  stat_label <- paste0("R² = ", r2, "\nP = ", p_val)
  
  p <- ggplot(data = data, mapping = mapping) + 
    geom_point(size = 0.8) + 
    geom_smooth(method = "lm", colour = "orangered2", se = TRUE, linewidth = 0.8) +
    # 左上角标注统计值,字号、位置可根据需求调整
    annotate("text", x = Inf, y = Inf, label = stat_label, 
             hjust = 1.1, vjust = 1.1, size = 2.5, colour = "orangered2")
  return(p)
}

# 自定义上三角面板:GAM模型 + 统计值标注
gam_panel <- function(data, mapping, ...){
  x_var <- as_name(mapping$x)
  y_var <- as_name(mapping$y)
  
  # 拟合GAM模型,默认用s()平滑项,自由度可根据需求调整
  fit <- gam(formula = paste(y_var, "~ s(", x_var, ")"), data = data)
  # 提取GAM的调整R²和显著性P值
  r2 <- summary(fit)$r.sq |> round(3)
  p_val <- summary(fit)$s.table[4] |> round(4)
  stat_label <- paste0("R² = ", r2, "\nP = ", p_val)
  
  p <- ggplot(data = data, mapping = mapping) + 
    geom_point(size = 0.8) + 
    geom_smooth(method = "gam", colour = "blue", se = TRUE, linewidth = 0.8, formula = y ~ s(x)) +
    annotate("text", x = Inf, y = Inf, label = stat_label, 
             hjust = 1.1, vjust = 1.1, size = 2.5, colour = "blue")
  return(p)
}

# 绘制配对图
p1 <- ggpairs(sel1, 
              columnLabels = c("Total Ni", "Total Mg", "Total Fe", "CEC", "pH","SWC"),
              upper = list(continuous = gam_panel),
              lower = list(continuous = lm_panel),
              # 调整对角面板密度图样式,不需要可删除
              diag = list(continuous = wrap("densityDiag", fill = "grey80", alpha = 0.5)))+ 
  theme_bw() + 
  theme(axis.text.x = element_text(size=rel(0.7), angle=0),
        axis.text.y = element_text(size=rel(0.7), angle=0), 
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(), 
        panel.border = element_rect(fill = NA,colour = "grey35"),
        strip.background = element_rect(fill = "grey90"))

# 输出结果
print(p1)

关键修正说明

  • 自定义函数内使用传入的data参数而非全局变量sel1,避免面板数据匹配异常
  • 拟合模型后直接提取对应统计值,标注位置、字号、颜色可根据展示需求灵活调整
  • GAM默认使用单变量平滑项s(x),如果需要调整平滑自由度或模型形式,可修改gam函数的formula参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:36:03