Ортогонализация по проекциям против остатков линейной регрессии на предыдущих столбцах - PullRequest
0 голосов
/ 05 ноября 2019

Согласно этому примеру, ортогонализация по проекциям аналогична принятию остатков линейных регрессий на предыдущих столбцах. Однако, когда я пробую их пример, я не получаю ожидаемого результата. Что здесь происходит? Почему я не получаю TRUE для последних трех строк кода?

library(matlib)
data(class)

class$male <- as.numeric(class$sex=="M")   
X <- as.matrix(class[,c(3,4,2,5)])

Z <- cbind(X[,1], 0, 0, 0)
Z[,2] <- X[,2] - Proj(X[,2], Z[,1])
Z[,3] <- X[,3] - Proj(X[,3], Z[,1]) - Proj(X[,3], Z[,2]) 
Z[,4] <- X[,4] - Proj(X[,4], Z[,1]) - Proj(X[,4], Z[,2]) - Proj(X[,4], Z[,3])

z2 <- residuals(lm(X[,2] ~ X[,1]), type="response")
z3 <- residuals(lm(X[,3] ~ X[,1:2]), type="response")
z4 <- residuals(lm(X[,4] ~ X[,1:3]), type="response")

Я ожидал получить Z[,2] = z2, Z[,3] = z3 и Z[,4] = z4, но это не так.

> all(Z[,2]==z2) [1] FALSE
> all(Z[,3]==z3) [1] FALSE
> all(Z[,4]==z4) [1] FALSE

1 Ответ

0 голосов
/ 06 ноября 2019

Это потому, что lm автоматически добавляет «перехват». Удалите его (0 + ...) и получите равенство:

z2 <- residuals(lm(X[,2] ~ 0 + X[,1]), type="response")
z3 <- residuals(lm(X[,3] ~ 0 + X[,1:2]), type="response")
z4 <- residuals(lm(X[,4] ~ 0 + X[,1:3]), type="response")

all.equal(z2, Z[,2])
# TRUE
all.equal(z3, Z[,3])
# TRUE
all.equal(z4, Z[,4])
# TRUE
...