obs <- 20
X1 <- matrix(rnorm(obs))
X2 <- matrix(rnorm(obs))
alpha <- 10
beta.1 <- 3
beta.2 <- 2
Y <- alpha + beta.1*X1 + beta.2*X2 + rnorm(obs)
model.1 <- lm(Y ~ X1 + X2)
summary(model.1)
constant <- matrix(rep(1, obs))
X <- matrix(c(X1, X2, constant), ncol=3)
X.transposed <- t(X)
X.transposed.times.X <- X.transposed %*% X
X.transposed.times.X.inverse <- solve(X.transposed.times.X)
X.transposed.times.Y <- X.transposed %*% Y
B <- X.transposed.times.X.inverse %*% X.transposed.times.Y
B
B <- solve(t(X) %*% X ) %*% (t(X) %*% Y)
B
df <- obs - (ncol(cbind(X, Y)) - 1)
Y.fitted <- X %*% B
Errors <- Y - Y.fitted
RSS <- t(Errors) %*% Errors
S2 <- RSS/df
S2
V <- S2 kronecker(S2, X.transposed.times.X.inverse)
V <- S2 %x% X.transposed.times.X.inverse
V
SE <- sqrt(t(diag(V)))
SE <- t(SE)
SE
SE <- sqrt(t(diag(kronecker( (t(Y-(X %*% B)) %*% (Y-(X %*% B))) /
(obs - (ncol(cbind(X, Y)) - 1)),
solve(t(X) %*% X )))) )
t.stat <- B / SE
prob.t <- pt(t.stat, df=df, lower.tail=F)*2
results <- data.frame(var=c("alpha", "beta.1", "beta.2"),
coef=round(B, 2),
std.err=SE,
t.val=t.stat,
sign=prob.t)
results