당신은 도로에서 ... 특이 값 분해 정상 매트릭스 X'X
보다는 매트릭스 X
모델에 적용되어 있습니다. 다음은 올바른 절차 : 그래서

에 R 기능을 쓸 때, 우리는
svdOLS <- function (X, y) {
SVD <- svd(X)
V <- SVD$v
U <- SVD$u
D <- SVD$d
## regression coefficients `b`
## use `crossprod` for `U'y`
## use recycling rule for row rescaling of `U'y` by `D` inverse
## use `as.numeric` to return vector instead of matrix
b <- as.numeric(V %*% (crossprod(U, y)/D))
## residuals
r <- as.numeric(y - X %*% b)
## R-squared
RSS <- crossprod(r)[1]
TSS <- crossprod(y - mean(y))[1]
R2 <- 1 - RSS/TSS
## multiple return via a list
list(coefficients = b, residuals = r, R2 = R2)
}
가의 반면에 테스트
## toy data
set.seed(0)
x1 <- rnorm(50); x2 <- rnorm(50); x3 <- rnorm(50); y <- rnorm(50)
X <- model.matrix(~ x1 + x2 + x3)
## fitting linear regression: y ~ x1 + x2 + x3
svdfit <- svdOLS(X, y)
#$coefficients
#[1] 0.14203754 -0.05699557 -0.01256007 0.09776255
#
#$residuals
# [1] 1.327108410 -1.400843739 -0.071885339 2.285661880 0.882041795
# [6] -0.535230752 -0.927750996 0.262674650 -0.133878558 -0.559783412
#[11] 0.264204296 -0.581468657 2.436913000 1.517601798 0.774515419
#[16] 0.447774149 -0.578988327 0.664690723 -0.511052627 -1.233302697
#[21] 1.740216739 -1.065592673 -0.332307898 -0.634125164 -0.975142054
#[26] 0.344995480 -1.748393187 -0.414763742 -0.680473508 -1.547232557
#[31] -0.383685601 -0.541602452 -0.827267878 0.894525453 0.359062906
#[36] -0.078656943 0.203938750 -0.813745178 -0.171993018 1.041370294
#[41] -0.114742717 0.034045040 1.888673004 -0.797999080 0.859074345
#[46] 1.664278354 -1.189408794 0.003618466 -0.527764821 -0.517902581
#
#$R2
#[1] 0.008276773
보자해야 우리 .lm.fit
을 사용하여 정확성을 확인할 수 있습니다.
정확히 계수 및 잔차에서 동일
:
all.equal(svdfit$coefficients, qrfit$coefficients)
# [1] TRUE
all.equal(svdfit$residuals, qrfit$residuals)
# [1] TRUE
케이스 문제는 -'x'와'X'는 다르다. 함수의 첫 번째 행은'A'를 사용하지만'A'는 입력되지 않습니다. 그거 어디서 났어? 나는 또한'레이블'이 무엇인지 모르겠다 - 당신이 쓴이 코드가 아닌가? 그것은 무엇을해야 하는가? – Gregor
대부분이 웹 사이트에서 찾은 코드입니다. 그들은'라벨 '을 사용했다. 예, 죄송합니다. A는 테스트 매트릭스였습니다. 하지만 내 질문에 이미 아래에, 어쨌든 답변했다! – Rilja