使用正规方程计算多元线性回归中的系数

机器算法验证 r 线性模型 回归系数
2022-04-08 17:26:47

我试图了解如何获得多元线性回归的系数。

公式为:

b=(XX)1(X)Y

我试着计算b没有包和lmR 里面有包。

这样做,我得到了不同的结果。

我想知道为什么。我做错了吗?还是lm因为截距而导致包裹的计算方式不同?

> y <-  c(1,2,3,4,5)
> x1 <- c(1,2,3,4,5)
> x2 <- c(1,4,5,7,9)
> Y <- as.matrix(y)
> X <- as.matrix(cbind(x1,x2))
> beta = solve(t(X) %*% X) %*% (t(X) %*% Y) ; beta
            [,1]
x1  1.000000e+00
x2 -1.421085e-14
> model <- lm(y~x1+x2) ; model$coefficients
 (Intercept)           x1           x2 
1.191616e-15 1.000000e+00 1.192934e-15 

3d

更新

正如亚历克斯和其他人告诉我的,这是一个舍入误差的问题。因此,我决定从安德森等人的《商业和经济学基本统计》一书中获取另一个数据。在这种情况下,lm函数和我自己的矩阵中的系数是相同的。

> y <- c(9.3, 4.8, 8.9, 6.5, 4.2, 6.2, 7.4, 6, 7.6, 6.1)
> x0 <- c(1,1,1,1,1,1,1,1,1,1) 
> x1 <-  c(100,50,100,100,50,80,75,65,90,90)
> x2 <- c(4,3,4,2,2,2,3,4,3,2)
> Y <- as.matrix(y)
> X <- as.matrix(cbind(x0,x1,x2))

> beta = solve(t(X) %*% X) %*% (t(X) %*% Y);beta
         [,1]
x0 -0.8687015
x1  0.0611346
x2  0.9234254
> model <- lm(y~+x1+x2) ; model$coefficients
(Intercept)          x1          x2 
 -0.8687015   0.0611346   0.9234254 
1个回答

@MichaelMayer 说得对。尝试以下操作:

> y <-  c(1,2,3,4,5)
> x0 <- c(1,1,1,1,1)   # vector of ones representing the intercept
> x1 <- c(1,2,3,4,5)
> x2 <- c(1,4,5,7,9)
> Y <- as.matrix(y)
> X <- as.matrix(cbind(x0,x1,x2))
> beta = solve(t(X) %*% X) %*% (t(X) %*% Y) ;

更新:lm即使进行了上述更改,由于舍入误差,您在使用时仍会得到略有不同的结果。如果 x2 的估计截距和系数不为零,则不再可见。

x1 <- c(1,2,3,4,5)
x2 <- c(1,4,5,7,9)
y <-  x1 + x2 + rnorm(5,mean=0,sd=0.3);
Y <- as.matrix(y);
X <- as.matrix(cbind(1,x1,x2));
beta = solve(t(X) %*% X) %*% (t(X) %*% Y) ; beta
model <- lm(y~1+x1+x2) ; model$coefficients

输出是:

         [,1]
   -0.2948504
x1  0.8081534
x2  1.1741777
(Intercept)          x1          x2 
 -0.2948504   0.8081534   1.1741777 

有关详细信息,请参阅:https ://en.wikipedia.org/wiki/Machine_epsilon