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

R语言lm函数输出异常值:两段代码结果不一致原因问询

问题描述

在R语言中使用lm()函数时遇到异常:第一段完整代码中调用ajuste3和ajuste4得到了异常输出;但将对应变量x、y、x2、y2的数值提取出来,单独编写第二段代码运行后,得到了预期的正确结果。请问为何第一段代码中的ajuste3和ajuste4会出现异常值?

第一段代码

#Dados parte I gráfico 1
g <- c(9.80)
t <- c(26.87,24.81,22.75,17.59,11.47)
t.1oscilação <- c(t/10)
l <- c(180,156,131,75.5,32.9)
l.cm <- c(l/100)
l.cm
t.1oscilação
ajuste=lm(t.1oscilação~l)
ajuste
#Ajuste da escla para o papel milimetrado(feito por regra de 3)
l2 <- c(l.cm/0.011)
t2 <- c(t.1oscilação/0.011)
l2
t2
ajuste2=lm(t2~l2)
ajuste2
#mudança de variável para linearizar a equação
a.1<- c(2*pi)
a.2 <- c(sqrt(9.8))
a <- c(a.1/a.2)
x <- c(sqrt(l.cm))
a
x
y <- c(x*a)
y
ajuste3=lm(y~x)
ajuste3
#Ajuste da equação linearizada para dimensões do papel milimetrado
x2 <- c(x/0.0083)
y2 <- c(y/0.01)
x2
y2
ajuste4=lm(y2~x2)
ajuste4

第二段代码

x <- c(1.341,1.248,1.144,0.868,0.573)
y <- c (2.692,2.506,2.297,1.743,1.151)  
ajuste=lm(y~x)
ajuste
x2 <- c(161.56627, 150.36145, 137.83133 ,104.57831,69.03614)
y2 <- c(269.2,250.6,229.7,174.3,115.1)
ajuste2=lm(y2~x2)
ajuste2
问题原因与解决方法

核心原因

第一段代码中,y是通过y = x * a严格计算得到的(a是固定标量),y与x是完全线性相关的关系,不存在任何随机误差。此时用lm(y ~ x)拟合带截距的线性模型(y = β₀ + β₁x),由于所有数据点都严格落在直线y = a*x上,模型的残差为0,导致R的lm()函数无法估计系数的标准误,甚至会因浮点计算精度问题出现截距项的异常小值,最终输出异常结果。

而第二段代码中的x和y是手动四舍五入后的近似值,不再是严格的线性关系,存在微小误差,lm()可以正常拟合出接近真实斜率a、截距接近0的结果,符合预期。

解决方法

如果要拟合这种完全线性的关系,应该直接指定模型无截距项,将代码中的:

ajuste3=lm(y~x)
ajuste4=lm(y2~x2)

修改为:

ajuste3=lm(y~x - 1)
ajuste4=lm(y2~x2 - 1)

这样模型会直接拟合y = β₁x的形式,得到精确的斜率a(或对应缩放后的斜率),输出结果完全符合预期,不会出现异常值。

内容的提问来源于stack exchange,提问作者Lucas Xavier Nardelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:20:28