QR分解LM和biglm不同?(QR decomposition different in lm a

2019-07-03 14:26发布

我试图恢复从biglm使用QR分解的R矩阵。 为此,我正在使用vcov.biglm代码的一部分,并把它变成像这样的功能:

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从基础包,这是在类“QR”的QR分解,例如那些包含在流明级(LM $ 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

我不能完全弄清楚这是为什么。 我希望能够得到相同的结果为R矩阵从biglm流明。

Answer 1:

两个R矩阵之间的区别是,biglm显然执行其旋转,使R的对角线元素都为正,而LM(或者,真的,它调用程序)并没有规定这种限制。 (应该没有数量上的优势,以一个战略或其他的,所以不同的只是惯例之一,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


文章来源: QR decomposition different in lm and biglm?