如何在ggplot2中获取回归图梯度值及分性别趋势线相关系数?
解决ggplot2回归图梯度值与分组趋势线系数的问题
嗨,我来帮你搞定这两个问题~
1. 从ggplot2回归图中获取梯度值
ggplot里的geom_smooth(method = lm)本质是对每个分组数据单独拟合线性回归,梯度值就是回归直线的斜率。有两种常用方法可以获取:
方法一:手动对分组数据拟合模型(推荐,更直观)
直接按性别分组,分别拟合线性模型,然后提取斜率:
# 加载dplyr和purrr(未安装的话先运行install.packages(c("dplyr", "purrr"))) library(dplyr) library(purrr) # 按Sex分组拟合模型,提取斜率和相关系数 group_stats <- SD_MFC_DATA_LENGTHv6 %>% group_by(Sex) %>% nest() %>% mutate( # 对每组数据拟合BMD~Age的线性模型 lm_model = map(data, ~lm(BMD ~ Age, data = .x)), # 提取Age的斜率(梯度值) slope = map_dbl(lm_model, ~coef(.x)[["Age"]]), # 提取R²(相关系数的平方) r_squared = map_dbl(lm_model, ~summary(.x)$r.squared), # 计算Pearson相关系数(和趋势线的相关系数一致) correlation = map_dbl(data, ~cor(.x$Age, .x$BMD, method = "pearson")) ) %>% select(Sex, slope, correlation, r_squared) # 查看结果 print(group_stats)
方法二:从ggplot对象中提取拟合模型
如果你已经画好了图,可以直接从ggplot的构建数据里提取模型:
# 先保存你的ggplot对象 p <- ggplot(SD_MFC_DATA_LENGTHv6, aes(x = Age, y = BMD, group = Sex, color = Sex, shape = Sex)) + geom_point() + geom_smooth(method = lm, aes(fill = Sex)) # 提取平滑层的数据并拟合模型 smooth_data <- ggplot_build(p)$data[[2]] group_slopes <- smooth_data %>% group_by(group) %>% summarise( slope = coef(lm(y ~ x, data = cur_data()))[["x"]], .groups = "drop" ) # 这里的group对应Sex的分组(可以对照p$data里的Sex编码来匹配) print(group_slopes)
2. 分别获取男女两组的趋势线相关系数
趋势线的相关系数其实就是Age和BMD在各组内的Pearson相关系数,上面的代码里已经包含了计算。另外,如果你想从你原来的多元交互模型(包含Sex*Age等交互项)中推导,也可以这样做:
# 直接计算分组的Pearson相关系数 cor_results <- SD_MFC_DATA_LENGTHv6 %>% group_by(Sex) %>% summarise( correlation = cor(Age, BMD, method = "pearson"), .groups = "drop" ) # 输出结果 print(cor_results)
⚠️ 注意:如果你想让ggplot的趋势线匹配你原来的多元模型(包含Sex + Age + PercentDepth及交互项),需要在geom_smooth里指定完整公式,比如:
ggplot(SD_MFC_DATA_LENGTHv6, aes(x = Age, y = BMD, group = Sex, color = Sex, shape = Sex)) + geom_point() + geom_smooth(method = lm, formula = y ~ x + PercentDepth + Sex:x + Sex:PercentDepth + x:PercentDepth, aes(fill = Sex))
内容的提问来源于stack exchange,提问作者Sammie Davies
相关产品推荐
相关产品推荐

