R语言lm函数舍入误差问题?聚类回归致显著性误判
R语言回归中的舍入误差问题解析
问题现象
在两组理论上完全不相关的数据中,使用lm()函数做单向回归时检测到极小的非零系数,而使用miceadds包的lm.cluster()函数时,这种舍入误差会被放大,呈现出接近显著的结果。理论上三次回归的系数都应为0,但实际第二次回归和聚类回归得到了量级为1e-16的系数。
复现代码
## 问题复现代码 ## library(miceadds) id = c(1, 1, 1, 1, 2, 2, 2, 2) a <- c(5, 5, 5, 5, 1, 1, 1, 1) b <- c(-0.5, 0.5, -0.5, 0.5, -0.5, 0.5, -0.5, 0.5) df <- data.frame(id, a, b) df # 回归1:b ~ a reg <- lm(data = df, b ~ a) summary(reg) # 回归2:a ~ b reg <- lm(data = df, a ~ b) summary(reg) # 聚类回归:a ~ b,按id聚类 cluster_reg <- lm.cluster(data = df, a ~ b, cluster = "id") summary(cluster_reg) ## 出现接近显著的结果?
问题解答
1. 是否仅存在于本地环境?
不是,这是二进制浮点数运算的普遍特性,任何基于标准浮点计算的编程环境(包括R、Python、Java等)都会出现此类误差,并非本地环境独有。
2. 引发原因
- 浮点数精度限制:计算机用二进制存储小数,部分十进制小数无法精确表示,且在矩阵求逆、求和等回归计算步骤中,微小的误差会累积。当变量间理论上完全无关时,计算出的系数本应为0,但浮点运算的偏差会产生极小的非零值(量级通常为1e-16左右,对应双精度浮点数的精度极限)。
- 单向回归的数值稳定性差异:
b~a和a~b的回归计算过程中,矩阵求逆的顺序和数值条件不同。本例中a在每个聚类组内完全恒定,b在组内对称分布,回归a~b时的计算过程更容易累积可见的误差,而反向回归的误差被变量尺度稀释,表现更不明显。 - 聚类回归的标准误调整:
lm.cluster()会针对聚类结构调整标准误,当系数本身是极小的舍入误差时,调整后的标准误可能更小,导致t统计量被放大,看起来接近显著,但这完全是误差带来的假象。
3. 规避方法
- 先做变量结构分析:通过描述性统计(如
table(df$a, df$b)、by(df$b, df$id, mean))识别变量的组内特征,本例中a组内恒定、b组内均值为0,可直接判断两者无相关性,无需进行回归。 - 设置精度阈值:对回归系数设置合理的阈值(如绝对值小于1e-10),将此类极小值视为0,忽略浮点误差带来的无意义结果。
- 手动验证理论关系:计算变量的协方差或相关系数,本例中
cov(df$a, df$b)理论为0,实际计算得到的极小值可直接判定为舍入误差。 - 谨慎使用聚类回归:在聚类回归前,先确认变量在聚类内的变异情况,若自变量在聚类内无变异或对称分布,此类回归本身无统计意义,应避免执行。
内容的提问来源于stack exchange,提问作者Carter Allen
相关产品推荐
相关产品推荐

