1. 线性模型拟合

(1) 第一条线(R2Y相关)

lm.r <- lm(I(R2Y - y1) ~ I(sim - x1) + 0, data = plotdata)
  • 模型公式:I(R2Y - y1) ~ I(sim - x1) + 0
    • I(R2Y - y1):因变量,表示 R2Y 与某个基准值 y1 的差值。
    • I(sim - x1):自变量,表示 sim 与基准值 x1 的差值。
    • + 0:强制截距为0(即直线通过原点)。
  • 目的:拟合一条通过 (x1, y1) 的直线,描述 sim 和 R2Y 的线性关系。

(1) 第一条线的截距

int.R <- predict(lm.r, newdata = list(sim = 0)) + y1
  • predict(lm.r, newdata = list(sim = 0)):预测当 sim - x1 = 0(即 sim = x1)时 R2Y - y1 的值。
    • 由于模型强制截距为0,预测值应为 0。
  • + y1:将基准值 y1 加回,得到实际截距(即直线在 sim = 0 时的 R2Y 值)。

3. 绘制直线

(1) 第一条线(R2Y)

abline(int.R, coef(lm.r), lty = 2, col = "grey30")
  • abline(a, b):绘制斜率为 b、截距为 a 的直线。
    • int.R:截距(调整后的 y1)。
    • coef(lm.r):斜率(来自模型 lm.r)。
  • lty = 2:虚线样式。
  • col = "grey30":颜色为深灰色。

注意事项

  • 强制截距为0:+ 0 表示假设直线必须通过 (x1, y1) 或 (x1, y2),需确保这一假设合理。
  • 坐标平移:I(sim - x1) 和 I(R2Y - y1) 的本质是将原点临时移至 (x1, y1),拟合后再平移回来。

1. 直接通过两点计算截距

假设已知两点 和 ,直接计算斜率和截距:

  • 斜率():
  • 截距():
  • 直线方程:

特点:

  • 完全依赖两个点的位置,忽略其他数据点。
  • 如果数据存在噪声或非线性趋势,结果可能不鲁棒。

2. 通过模型间接生成截距(如你的代码)

你的代码通过线性模型拟合所有数据点,间接推导截距:

  1. 模型拟合:
    • 拟合直线 (强制通过 )。
    • 斜率 由最小二乘法估计,利用所有数据点。
  2. 截距调整:
    • 截距 (与直接计算一致,但斜率 来自模型)。

特点:

  • 利用全部数据:斜率 是所有数据点的全局最优解(最小化残差平方和)。
  • 更鲁棒:对噪声或离群点有一定的容忍性。
  • 强制通过特定点:模型假设直线必须通过 (通过 + 0 实现)。

3. 核心差异总结

维度直接两点计算模型间接生成
数据使用仅用两个点利用所有数据点
斜率计算两点间的局部斜率全局最优斜率(最小二乘估计)
截距意义精确通过 强制通过 ,但斜率更鲁棒
抗噪声能力对噪声敏感更稳定(受离群点影响较小)
适用场景已知两点关系明确且无噪声数据存在波动或需要全局趋势拟合

4. 直观对比示例

假设数据:

  • 点1:
  • 点2:
  • 其他数据点:

(1) 直接计算


直线方程:

(2) 模型间接计算

  • 拟合模型 lm(I(y-2) ~ I(x-1) + 0),得到斜率 (利用所有点优化)。
  • 截距 。
    直线方程:

差异:模型斜率(1.53)与直接计算(1.5)不同,因模型试图平衡所有数据点。


5. 如何选择方法?

  • 用直接计算:
    • 数据绝对干净,且两点能代表真实趋势。
    • 需要快速计算,无需复杂统计。
  • 用模型拟合:
    • 数据存在噪声或需要全局趋势。
    • 需强制直线通过特定点(如理论基准点)。

6. 你的代码的特殊性

  • 强制通过 :
    通过 I(R2Y - y1) ~ I(sim - x1) + 0 确保直线必须经过 ,但斜率由数据全局决定。
  • 截距平移:
    predict(lm.r, newdata=list(sim=0)) + y1 本质是计算 ,与直接公式一致,但斜率 更可靠。

结论

  • 若数据理想:两种方法截距几乎相同。
  • 若数据有噪声:模型间接生成的截距更鲁棒,因斜率基于全局数据优化。
  • 关键区别:模型方法通过统计优化利用了更多信息,而非依赖两点局部关系。