2012-11-06 1 views
3

biglm에서 사용 된 QR 분해에서 R 행렬을 복구하려고합니다. 이를 위해 내가 vcov.biglm의 코드의 일부를 사용하고 그래서 같은 함수에 넣어 : 구체적lm과 biglm에서 QR 분해가 다릅니 까?

qr.R.biglm <- function (object, ...) { 
    # Return the qr.R matrix from a biglm object 
    object$qr <- .Call("singcheckQR", object$qr) 
    p <- length(object$qr$D) 
    R <- diag(p) 
    R[row(R) > col(R)] <- object$qr$rbar 
    R <- t(R) 
    R <- sqrt(object$qr$D) * R 
    dimnames(R) <- list(object$names, object$names) 
    return(R) 
} 

, 나는 기지에서 qr.R를 사용하는 것과 같은 결과를 얻으려고 패키지는 lm 클래스 (lm $ qr)에 포함 된 것과 같은 클래스 "qr"의 QR 분해에 사용됩니다. 기본 함수에 대한 코드는 다음과 같습니다.

qr.R <- function (qr, complete = FALSE) { 
    if (!is.qr(qr)) 
     stop("argument is not a QR decomposition") 
    R <- qr$qr 
    if (!complete) 
     R <- R[seq.int(min(dim(R))), , drop = FALSE] 
    R[row(R) > col(R)] <- 0 
    R 
} 

표식을 제외하고 표본 회귀와 동일한 결과를 얻을 수 있습니다.

x <- as.data.frame(matrix(rnorm(100 * 10), 100, 10)) 
y <- seq.int(1, 100) 
fit.lm <- lm("y ~ .", data = cbind(y, x)) 
R.lm <- qr.R(fit.lm$qr) 

library(biglm) 
fmla <- as.formula(paste("y ~ ", paste(colnames(x), collapse = "+"))) 
fit.biglm <- biglm(fmla, data = cbind(y, x)) 
R.biglm <- qr.R.biglm(fit.biglm) 

둘 모두를 비교하면 절대 값은 일치하지만 부호는 분명하지 않습니다.

mean(abs(R.lm) - abs(R.biglm) < 1e-6) 
[1] 1 
mean(R.lm - R.biglm < 1e-6) 
[1] 0.9338843 

나는 이것이 왜 있는지를 알 수 없다. biglm의 작품과 같은 결과를 R 매트릭스에서 얻을 수 있기를 원합니다.

답변

2

두 개의 R 행렬의 차이는 LM (또는, 정말,이 호출 루틴) 이러한 제약 조건을 부과하지 않습니다 동안 biglm 분명히, R의 대각 요소가 모두 긍정적이되도록 그 회전을 수행하는 것입니다. (차이가, AFAIKT 대회의 하나에 불과하므로, 하나 개의 전략 또는 다른 어떤 수치 장점이 없어야합니다.)

당신은 추가 있음을 부과함으로써 LM의 결과와 동일로 biglm 년대를 만들 수 있습니다 너 자신을 제한하라. 대각선 요소가 모두 양의 값을 갖도록 1 또는 -1로 열을 곱하는 반사 행렬을 사용합니다.

## Apply the necessary reflections 
R.lm2 <- diag(sign(diag(R.lm))) %*% R.lm 

## Show that they did the job 
mean(R.lm2 - R.biglm < 1e-6) 
# [1] 1 
+0

감사합니다. Josh. 유용합니다. 그러나, 나는 반대 문제를 해결하기 위해 노력하고 있습니다 : 어떻게하면 biglm R 행렬을 lm R 행렬과 일치시킬 수 있습니까? 그것이 가능하다면. – J4y

+0

@ user3327 - 확인 나는 너의 포스트의 마지막 문장을 오해 한 것 같다. 나는 더 이상 도울 수 없지만, 다른 누군가가 관심이있는 경우를 대비하여 이것을 남겨 둘 것입니다 ... 호기심 때문에, 왜 두 개의 R 행렬의 기둥의 표식이 일치하는지 신경 써야합니까? –

+0

고마워요 조쉬. 조금 더 많은 배경을 제공하기 위해 : 기존의 코드에서'biglm '을'lm'으로 대체하려고합니다. 회귀를 수행하려는 큰 데이터 세트가 있고'lm'을 사용할 수 없으므로 . 내 프로그램에서는이 R 행렬을 사용하여 행렬을 더 아래쪽으로 사용합니다. 새 행렬을 사용하지 않고 동일한 행렬을 간단하게 추출 할 수 있다면 좋을 것입니다. 그것이 그렇게된다면, 그렇게 되십시오 :-) 나는 단지 처음에 주위를 물어볼 것이라고 생각했습니다. – J4y