【问题标题】:Getting wrong betas when doing OLS regression in R在 R 中进行 OLS 回归时得到错误的 beta
【发布时间】:2019-11-21 03:12:48
【问题描述】:

我在这里的第一个问题。这个问题已经从我的生活中偷走了很多天。我知道,这并不重要,但同时:我需要知道!我知道有很多很好的回归公式。但是当我尝试使用古老的算术来掌握它的窍门时,我在测试版上得到了荒谬的答案。

Beta 向量应该是 (X'X)^(-1)X'y(其中 X 是回归矩阵,y 是答案向量)。我举一个例子(它不适合 OLS 是无关紧要的 - 我只想要 b:s 这里):

X <- matrix(1:10)
y <- matrix(2:11)
b <- (t(X) %*% X)^(-1) %*% t(X) %*% y

这给出 b = 1.142857,而 summary(lm(y~X)) 给出 beta = 1 和截距 1。我向 X 添加一个常数以获得截距:X

【问题讨论】:

  • 正确的语法是b &lt;- solve(t(X) %*% X) %*% t(X) %*% y,因为solve给出了矩阵的逆矩阵t(X)%*%X

标签: r regression


【解决方案1】:

这里有两个问题。首先是符号问题。公式中-1的幂实际上表示矩阵逆。这是用 R 中的 solve 计算的,而不是用 ^-1 计算的,它表示元素的倒数。

然后,您需要创建一个实际包含截距的设计矩阵。

X <- matrix(1:10)
y <- matrix(2:11)^2
coef(lm(y~X))
#(Intercept)           X 
#        -21          13 

X <- cbind(1, X)
solve(t(X) %*% X) %*% t(X) %*% y
#     [,1]
#[1,]  -21
#[2,]   13

显然,您实际上不应该在现实世界的应用程序中进行这种矩阵求逆(而 R 的 lm 不会这样做)。

【讨论】:

    【解决方案2】:

    问题在于使用 ^(-1) 进行反向操作。它不适用于矩阵。 solve 用于获取矩阵的逆:https://www.statmethods.net/advstats/matrix.html

    # use solve 
    b <- solve(t(X) %*% X) %*% t(X) %*% y
    
    # fit model without intercept
    m <- lm(y~-1+X)
    summary(m)
    
    # same coefficients
    b
    m$coefficients
    
    
    # with intercept
    X2 <- cbind(rep(1, 10), X)
    
    b2 <- solve(t(X2) %*% X2) %*% t(X2) %*% y
    m2 <- lm(y~+X)
    summary(m2)
    
    b2
    m2$coefficients
    

    【讨论】:

      【解决方案3】:
       X <- cbind(1, matrix(1:10))
       b<-solve(t(X)%*%X)%*%t(X)%*%y
      

      https://www.rdocumentation.org/packages/Matrix/versions/0.3-26/topics/solve.Matrix

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-29
        • 2017-09-04
        • 2018-05-20
        • 1970-01-01
        • 2019-03-06
        • 2020-04-30
        • 2019-05-11
        相关资源
        最近更新 更多