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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:55:35