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

如何在ggplot2中识别geom_abline上下点并用data.table拆分数据

问题背景

你拥有包含150个唯一ID的面板数据集,已经通过plm()函数拟合了固定效应模型,数据集示例如下:

data <- data.frame(ID = c(1,1,1,1,2,2,3,3,3),
                   year = c(1,2,3,4,1,2,1,2,3),
                   progenyMean = c(90,78,92,69,86,73,82,85,91),
                   damMean = c(89,89,72,98,95,92,94,87,89))

你拟合固定效应模型的代码如下:

# plm固定效应模型拟合
fixed <- plm(progenyMean ~ damMean, data, model= "within", index = c("ID","year"))

你已经通过如下代码绘制了响应变量progenyMean与damMean的散点图,叠加了斜率为fixed模型系数、截距为fixef(fixed)均值71.09的geom_abline:

plotFunction <- function(aggData, year){
  
  ggplot(aggData, aes(x=damMeanCentered, y=progenyMean3Y)) + 
    geom_point() + 
    geom_abline(slope=fixed$coefficients, intercept=71.09, colour='dodgerblue1', size=1)
# 截距71.09由fixef(fixed)取均值计算得到
  
}

plotFunction(data, '(2005 - 2012)')

生成的可视化结果如下:
散点图与拟合线

问题

是否可以识别出ggplot中位于geom_abline上下方的对应数据点,并且使用data.table将这两类数据拆分,生成新的数据表?

解答

可以实现,核心逻辑是先根据拟合线的斜率、截距计算每个x对应的拟合y值,再对比实际y值和拟合y值的大小即可区分点位,data.table处理这类运算效率很高,具体实现代码如下:

# 加载所需包
library(data.table)
library(plm)

# 1. 将数据集转为data.table格式
dt <- as.data.table(data)

# 2. 提取模型参数
slope <- fixed$coefficients[[1]]
intercept <- 71.09

# 3. 计算拟合值、给点位打标签,注意x、y变量要和你绘图时用的变量名一致
dt[, `:=`(
  fitted_y = intercept + slope * damMeanCentered,
  point_pos = fifelse(progenyMean3Y > fitted_y, "线上方", "线下方")
)]

# 4. 拆分生成两个新表
## 方法1:生成独立的两个数据表
dt_above <- dt[point_pos == "线上方"]
dt_below <- dt[point_pos == "线下方"]

## 方法2:直接生成包含两个子表的列表,调用更方便
split_dt <- split(dt, by = "point_pos")
# 后续可以通过split_dt$线上方、split_dt$线下方调用对应数据表

如果需要验证拆分结果是否正确,可以用标签给散点上色后和拟合线对比:

ggplot(dt, aes(x=damMeanCentered, y=progenyMean3Y, color = point_pos)) +
  geom_point() +
  geom_abline(slope = slope, intercept = intercept, colour='dodgerblue1', size=1) +
  scale_color_manual(values = c("线上方" = "red", "线下方" = "green"))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:09:03