1. 线性模型拟合
(1) 第一条线(R2Y相关)
lm.r <- lm(I(R2Y - y1) ~ I(sim - x1) + 0, data = plotdata)- 模型公式:
I(R2Y - y1) ~ I(sim - x1) + 0I(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)) + y1predict(lm.r, newdata = list(sim = 0)):预测当sim - x1 = 0(即sim = x1)时R2Y - y1的值。- 由于模型强制截距为0,预测值应为
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. 通过模型间接生成截距(如你的代码)
你的代码通过线性模型拟合所有数据点,间接推导截距:
- 模型拟合:
- 拟合直线 (强制通过 )。
- 斜率 由最小二乘法估计,利用所有数据点。
- 截距调整:
- 截距 (与直接计算一致,但斜率 来自模型)。
特点:
- 利用全部数据:斜率 是所有数据点的全局最优解(最小化残差平方和)。
- 更鲁棒:对噪声或离群点有一定的容忍性。
- 强制通过特定点:模型假设直线必须通过 (通过
+ 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本质是计算 ,与直接公式一致,但斜率 更可靠。
结论
- 若数据理想:两种方法截距几乎相同。
- 若数据有噪声:模型间接生成的截距更鲁棒,因斜率基于全局数据优化。
- 关键区别:模型方法通过统计优化利用了更多信息,而非依赖两点局部关系。