在R中执行OLS回归时得到错误的Beta

时间:2018-11-19 15:36:32

标签: r regression b

我的第一个问题在这里。这个问题从我一生中就被偷走了。我知道,这并不重要,但同时:我需要知道!我知道有很多好的回归公式。但是,当我尝试使用古老的算法来解决这个问题时,我在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 <-cbind(X,1)和我得到的结果是b =(2.324675,14.5),这根本没有意义。我在这里做什么错了?

3 个答案:

答案 0 :(得分:2)

这里有两个问题。首先是符号问题。公式中的-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则不这样做)。

答案 1 :(得分:1)

问题在于将^(-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

答案 2 :(得分:0)

header("HTTP/1.0 200 OK");
header("Content-Type: image/png"); // Or /jpg, /gif, etc
header("Content-Length: " . (string) filesize($filename));
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: inline");
header("Location: /" . $filename);

// Then:

$fileHandle = fopen($filename, 'rb');
fpassthru($fileHandle);

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