QR-Zerlegung in lm und biglm unterschiedlich?

Ich versuche, die R-Matrix aus der in Biglm verwendeten QR-Zerlegung wiederherzustellen. Dafür benutze ich einen Teil des Codes in vcov.biglm und stelle ihn in eine Funktion wie folgt:

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)
}

Insbesondere versuche ich, dasselbe Ergebnis wie mit qr.R aus dem Basispaket zu erhalten, das für QR-Zerlegungen der Klasse "qr" verwendet wird, wie sie in der Klasse lm (lm $ qr) enthalten sind. Der Code für die Basisfunktion lautet wie folgt:

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
}

Es gelingt mir, das gleiche Ergebnis für eine Stichprobenregression zu erzielen, mit Ausnahme der Anzeichen.

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)

Vergleicht man beide, so ist klar, dass die absoluten Werte übereinstimmen, aber nicht die Vorzeichen.

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

Ich kann nicht genau herausfinden, warum das so ist. Ich möchte in der Lage sein, das gleiche Ergebnis für die R-Matrix wie ich von biglm zu erhalten.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage