Consider the following code, where lm
is used for the purpose of quickly form a matrix only :
set.seed(1)
n <- 30
X <- rnorm(n, mean = 0, sd = 1)
Z <- rnorm(n, mean = 0, sd = 1)
A <- rnorm(n, mean = 0, sd = 1)
Y <- 1 + 2*X + 3*Z + 5*A + rnorm(n, mean = 0, sd = 1)
W <- 4*X + 8*Z
B <- 6*X + 9*Z + 7*A
model <- lm(Y ~ X + Z + W + B + A)
mat <- model.matrix(model)[,-1]
qr_decomp <- qr(mat)
Q <- qr.Q(qr_decomp)
R <- qr.R(qr_decomp)
print(abs(Q %*% R - mat))
The outcome is, rather surprisingly :
X Z B W A
[1,] 4.440892e-16 0.000000e+00 16.917096254 16.917096254 0.000000e+00
[2,] 0.000000e+00 2.081668e-16 0.010181098 0.010181098 2.040035e-15
[3,] 0.000000e+00 5.551115e-17 3.544589924 3.544589924 4.440892e-16
[4,] 0.000000e+00 1.179612e-16 3.332771675 3.332771675 2.230854e-15
[5,] 5.551115e-17 2.220446e-16 5.920956475 5.920956475 1.332268e-15
[6,] 0.000000e+00 0.000000e+00 0.734385235 0.734385235 0.000000e+00
[7,] 0.000000e+00 0.000000e+00 12.054142251 12.054142251 2.220446e-16
[8,] 0.000000e+00 0.000000e+00 11.676220044 11.676220044 2.220446e-16
[9,] 0.000000e+00 0.000000e+00 3.324361443 3.324361443 2.775558e-17
[10,] 0.000000e+00 1.110223e-16 15.360680667 15.360680667 4.440892e-16
[11,] 0.000000e+00 8.326673e-17 6.187605443 6.187605443 5.551115e-17
[12,] 0.000000e+00 5.551115e-17 4.443300224 4.443300224 1.110223e-16
[13,] 0.000000e+00 0.000000e+00 3.729566689 3.729566689 3.330669e-16
[14,] 0.000000e+00 0.000000e+00 10.411419997 10.411419997 1.110223e-16
[15,] 0.000000e+00 1.110223e-16 7.214327660 7.214327660 0.000000e+00
[16,] 6.938894e-18 0.000000e+00 1.242761274 1.242761274 2.775558e-16
[17,] 0.000000e+00 0.000000e+00 2.770841677 2.770841677 0.000000e+00
[18,] 0.000000e+00 1.110223e-16 2.663942807 2.663942807 5.551115e-17
[19,] 0.000000e+00 5.551115e-17 2.050485447 2.050485447 2.775558e-17
[20,] 0.000000e+00 1.110223e-16 2.057736254 2.057736254 1.110223e-16
[21,] 0.000000e+00 5.551115e-17 1.744620506 1.744620506 2.220446e-16
[22,] 0.000000e+00 1.110223e-16 0.005995902 0.005995902 5.551115e-17
[23,] 0.000000e+00 0.000000e+00 8.736858634 8.736858634 0.000000e+00
[24,] 2.220446e-16 2.220446e-16 15.773034091 15.773034091 2.220446e-16
[25,] 0.000000e+00 2.220446e-16 6.830298511 6.830298511 2.220446e-16
[26,] 0.000000e+00 0.000000e+00 4.198795018 4.198795018 1.110223e-16
[27,] 0.000000e+00 0.000000e+00 6.762886371 6.762886371 2.220446e-16
[28,] 0.000000e+00 0.000000e+00 6.114926860 6.114926860 3.885781e-16
[29,] 0.000000e+00 1.110223e-16 2.203551187 2.203551187 1.110223e-16
[30,] 0.000000e+00 2.775558e-17 2.570520052 2.570520052 1.110223e-16
That is, it does not assure mat == Q %*% R
, which is incorrect. Why is that?