截尾最小二乘法(LTS)与剔除观测值的OLS对比
关于截尾最小二乘法(LTS)的理解纠正
嘿,我来帮你理清这个困惑~你的理解其实只对了一半,LTS的核心逻辑和你手动实现的流程完全不一样,这就是为什么结果和ltsReg输出不一致的原因!
你的误区:把LTS当成了「OLS后截尾」
你目前的做法是:
- 先做全样本普通最小二乘法(OLS)
- 按OLS残差排序,剔除残差大的观测,再用剩余子集做OLS
但这其实是截尾OLS(Truncated OLS),和真正的截尾最小二乘法(LTS)不是一回事!
LTS的正确流程
LTS的核心是直接在所有可能的大小为h(通常取floor(n/2)+1,或者用户指定的k)的观测子集中,找到能让残差平方和最小的那个子集,然后用这个子集拟合OLS得到估计量。
它完全不依赖全样本OLS的结果——因为全样本OLS会被 outliers 干扰,拟合线会偏向异常值,这时候OLS的残差排序根本无法反映哪些观测是真正的“正常点”(甚至可能出现正常点残差大、异常点残差小的反直觉情况)。
为什么ltsReg的结果和你的手动实现不同?
robustbase包中的ltsReg用的是FAST-LTS算法,这是一种高效的搜索最优子集的方法,它会通过随机抽样+迭代优化的方式找到全局(或近似全局)最优的h个观测,而不是基于全样本OLS的残差筛选。
你可以做个简单验证:
- 运行LTS回归并提取它选中的子集:
library(robustbase) fit_lts <- ltsReg(y ~ x) selected_indices <- fit_lts$subset - 用这个子集手动拟合OLS:
fit_manual <- lm(y ~ x, data = your_data[selected_indices, ]) - 对比
fit_lts$coefficients和fit_manual$coefficients,你会发现它们完全一致——这就说明LTS的本质是找到最优子集后做OLS,而不是先全样本OLS再截尾。
总结
你的核心误解是把LTS的流程搞反了:它不是先做OLS再截尾,而是先找到最优的h个观测子集,再在这个子集上做OLS。这也是它能抵抗异常值的关键——因为它从一开始就避开了被异常值污染的全样本拟合。
内容的提问来源于stack exchange,提问作者chris12
相关产品推荐
相关产品推荐

