R,lm $系数的含义是什么

时间:2018-03-19 13:00:22

标签: r regression lm

我有一些x和y值可以很好地拟合多项式

> mysubx
[1]  0.05  0.10  0.20  0.50  1.00  2.00  5.00
[8]  9.00 12.30 18.30
> mysuby
[1] 1.008 1.019 1.039 1.091 1.165 1.258 1.402
[8] 1.447 1.421 1.278
> mymodel <- lm(mysuby ~ poly(mysubx,5))

可以用图形方式确认拟合。

> plot(mysubx, mysuby)
> lines(mysubx, mymodel$fitted.values, col = "red")

Plot showing original data in black and fitted data in red

当我尝试使用lm返回的系数来确定给定x的y值时,我的问题就出现了。因此,例如,如果我尝试使用mysubx中的第一个值,则应该给mymodel $ fitted.values 1。从图中可以看出,我应该看到一个大约1.01的数字。

> ansx = 0
> for(i in seq_along(mymodel$coefficients)){
+ ansx = ansx + mysubx[1]^(i-1)*mymodel$coefficients[[i]]
+ }
> ansx
[1] 1.229575
> 

哪里

> mysubx[1]
[1] 0.05
> mymodel$coefficients
 (Intercept) poly(mysubx, 5)1 poly(mysubx, 5)2 poly(mysubx, 5)3 
  1.21280000       0.35310369      -0.35739878       0.10989141 
 poly(mysubx, 5)4 poly(mysubx, 5)5 
 -0.04608682       0.02054430 

可以看出,图表上的x值为0.05,不给出1.229575。显然我不明白发生了什么?有人可以解释我如何使用lm函数的输出从任何给定的x值中获取正确的y值吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

事实上,你想要的不是poly(mysubx, 5)而是

poly(mysubx, 5, raw = TRUE)

如果您将raw设为FALSE,则不会使用xx**2x**3等,而是使用正交多项式。

mymodel <- lm(mysuby ~ poly(mysubx, 5, raw = T))

答案 1 :(得分:2)

当您拟合模型时,R首先根据您的数据和公式构建模型矩阵。您可以使用model.matrix函数来掌握它。

> X <- model.matrix(mysuby ~ poly(mysubx,5))

此矩阵在每个输入点都有一行(在您的情况下,您的输入是一维的并保存在mysubx中,但一般来说,您将从数据框中获取它并且它可以是多维的) 。该公式指定在我们拟合模型之前应如何修改输入数据。我们可以仔细看看第一行:

> X[1,]
     (Intercept) poly(mysubx, 5)1 poly(mysubx, 5)2 
       1.0000000       -0.2517616        0.2038351 
poly(mysubx, 5)3 poly(mysubx, 5)4 poly(mysubx, 5)5 
      -0.2264003        0.2355258       -0.2245773 

正如您所看到的,当您拟合多项式时,您将获得截距的值(始终为1,因为截距是模型的常量;它不依赖于x)和变换你做了什么输入。我们称这样一排&#34;功能&#34;你在你的模型中使用

在这种情况下,您具有从输入到要素的1&gt; N维映射。一般来说,它将是M - > N维映射。无论您如何将输入映射到模型矩阵,模型拟合仅关注模型矩阵。该模型构建了一种将此矩阵中的每一行映射到预测的方法。

对于线性模型,从要素到目标变量的映射是内积。您可以获取系数并使用要素计算内积。因此,对于您的第一个数据点,您可以:

> mymodel$coefficients %*% X[1,]
     [,1]
[1,] 1.010704

对于整个数据,您只需为每一行执行此操作:

> predict(mymodel)
       1        2        3        4        5        6        7 
1.010704 1.020083 1.038284 1.088659 1.159883 1.263722 1.400163 
       8        9       10 
1.447700 1.420790 1.278011 
> apply(X, MARGIN = 1, function(features) mymodel$coefficients %*% features)
       1        2        3        4        5        6        7 
1.010704 1.020083 1.038284 1.088659 1.159883 1.263722 1.400163 
       8        9       10 
1.447700 1.420790 1.278011 

此处,X不一定是您训练模型的数据。您可以使用相同的公式从任何其他输入数据构建它。我建议不要在公式中使用全局变量,因为这可能会在以后引起问题。