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
相关产品推荐
相关产品推荐

