2016-10-25 7 views
1

행렬의 특이 값 분해를 사용하여 다중 회귀 분석 (y = Xb + e) 함수를 작성하려고합니다. yX은 입력이고 회귀 계수 벡터 b이어야하며 잔여 벡터 e이고 차이는 R2의 출력으로 계산되어야합니다. 아래는 내가 지금까지 가지고있는 것이고 나는 완전히 붙어있다. 무게의 일부인 labels도 나에게 오류를 준다. 이 부분은 무엇입니까 labels 부분은 무엇입니까? 아무도 내게 도움이 될 수있는 몇 가지 팁을 줄 수 있습니까?특이 값 분해로 일반 최소 제곱을 푸는 장난감 R 함수

Test <- function(X, y) { 
    x <- t(A) %*% A 
    duv <- svd(x) 
    x.inv <- duv$v %*% diag(1/duv$d) %*% t(duv$u) 
    x.pseudo.inv <- x.inv %*% t(A) 
    w <- x.pseudo.inv %*% labels 
    return(b, e, R2) 
    } 
+0

케이스 문제는 -'x'와'X'는 다르다. 함수의 첫 번째 행은'A'를 사용하지만'A'는 입력되지 않습니다. 그거 어디서 났어? 나는 또한'레이블'이 무엇인지 모르겠다 - 당신이 쓴이 코드가 아닌가? 그것은 무엇을해야 하는가? – Gregor

+0

대부분이 웹 사이트에서 찾은 코드입니다. 그들은'라벨 '을 사용했다. 예, 죄송합니다. A는 테스트 매트릭스였습니다. 하지만 내 질문에 이미 아래에, 어쨌든 답변했다! – Rilja

답변

2

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

svd for ols

에 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 
+0

좋아, 어디로 가는지 알 겠어. 감사! 하지만 어떻게하면 b, e, R^2를 얻을 수 있을까요? – Rilja

+0

정말 고마워요! 너는 나날 밤을 구했다. 만약 당신이 그것을 위해, 당신은 내 동료 학생과 비슷한 문제를 좀 봐 줄래? http://stackoverflow.com/questions/40250691/multiple-regression-analysis-in-r-using-qr-decomposition – Rilja