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

求助:在R语言中统计非线性回归线(坐标点序列形式)上方、下方及右侧的点总数

解决方法:基于插值匹配回归线与数据点

针对你的需求,我们可以通过插值法把离散的回归线坐标转换成连续的函数,然后将数据点的坐标与回归线对应位置的y值进行比较,最后按Freq列统计总数。下面是具体的步骤和代码(以R语言为例,适配你的数据结构):

步骤1:为回归线创建插值函数

因为你的回归线是一系列离散点而非公式,我们需要用插值生成一个能计算任意x对应y值的函数。如果回归线是折线型,用线性插值;如果是平滑曲线,用样条插值更合适:

# 假设回归线数据框名为line
# 线性插值(折线适配),平滑曲线可替换为splinefun
line_interp <- approxfun(line$x, line$y, method = "linear")

步骤2:为数据框匹配回归线的对应y值

把每个数据点的x代入插值函数,得到该位置回归线的y值,同时处理x超出回归线范围的情况(避免出现NA):

# 为df添加回归线对应y值列
df$y_line <- line_interp(df$x)

# 处理x超出回归线x范围的情况
min_line_x <- min(line$x)
max_line_x <- max(line$x)
min_line_y <- line$y[line$x == min_line_x]
max_line_y <- line$y[line$x == max_line_x]

df$y_line <- ifelse(df$x < min_line_x, min_line_y,
                    ifelse(df$x > max_line_x, max_line_y,
                           df$y_line))

步骤3:统计三类点的总数

现在可以直接通过坐标比较,按Freq累加得到结果:

# 统计线上方的点总数
total_above <- sum(df$Freq[df$y > df$y_line], na.rm = TRUE)

# 统计线下方的点总数
total_below <- sum(df$Freq[df$y < df$y_line], na.rm = TRUE)

# 统计线右侧的点总数(定义为x大于回归线最大x值的点)
total_right <- sum(df$Freq[df$x > max_line_x], na.rm = TRUE)

补充说明

  • 如果你的回归线是平滑非线性曲线,建议将approxfun替换为splinefun,插值结果会更贴合原曲线;
  • 若你对"线右侧"的定义不是x超出回归线范围,而是点在曲线的右侧(比如同y值下x更大),可以再调整判断逻辑;
  • 对于正好落在回归线上的点(df$y == df$y_line),你可以单独统计:total_on_line <- sum(df$Freq[df$y == df$y_line], na.rm = TRUE),按需决定是否纳入其他分类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:37:43