繁体   English   中英

从QR分解中获取帽子矩阵,用于加权最小二乘回归

[英]Get hat matrix from QR decomposition for weighted least square regression

我试图扩展McSptial软件包的McSptial lwr()函数,它适合作为非参数估计的McSptial回归。 lwr()函数的核心中,它使用solve()而不是QR分解来反转矩阵,从而导致数值不稳定。 我想改变它,但无法弄清楚如何从QR分解中获得帽子矩阵(或其他衍生物)。

有了数据:

set.seed(0); xmat <- matrix(rnorm(500), nrow=50)    ## model matrix
y <- rowSums(rep(2:11,each=50)*xmat)    ## arbitrary values to let `lm.wfit` work
w <- runif(50, 1, 2)    ## weights

lwr()函数如下:

xmat2 <- w * xmat
xx <- solve(crossprod(xmat, xmat2))
xmat1 <- tcrossprod(xx, xmat2)
vmat <- tcrossprod(xmat1)

我需要的价值,例如:

sum((xmat[1,] %*% xmat1)^2)
sqrt(diag(vmat))

目前我使用reg <- lm.wfit(x=xmat, y=y, w=w)但无法找回我认为是帽子矩阵( xmat1 )的东西。

这个老问题是我刚才回答的另一个老问题的延续: 通过QR分解,SVD(和Cholesky分解?)计算投影/帽子矩阵 该答案讨论了计算普通最小二乘问题的帽子矩阵的3个选项,而这个问题是在加权最小二乘的背景下。 但是答案中的结果和方法将成为我答案的基础。 具体来说,我只会演示QR方法。

在此输入图像描述

OP提到我们可以使用lm.wfit来计算QR分解,但是我们可以使用qr.defaultqr.default ,这就是我要展示的方式。


在我继续之前,我需要指出OP的代码没有按照他的想法行事。 xmat1不是帽子矩阵; 相反, xmat %*% xmat1是。 vmat不是帽子矩阵,虽然我不知道它是什么。 然后我不明白这些是什么:

sum((xmat[1,] %*% xmat1)^2)
sqrt(diag(vmat))

第二个看起来像帽子矩阵的对角线,但正如我所说, vmat不是帽子矩阵。 好吧,无论如何, 我将继续正确计算帽子矩阵,并展示如何获得它的对角线和轨迹。


考虑玩具模型矩阵X和一些均匀的正重量w

set.seed(0); X <- matrix(rnorm(500), nrow = 50)
w <- runif(50, 1, 2)    ## weights must be positive
rw <- sqrt(w)    ## square root of weights

我们首先通过行重新缩放到X获得X1 (乳胶段落中的X_tilde):

X1 <- rw * X

然后我们对X1进行QR分解。 正如在我的链接答案中所讨论的,我们可以使用或不使用列旋转来执行此分解。 lm.fitlm.wfit因此lm没有进行旋转,但在这里我将使用旋转分解作为演示。

QR <- qr.default(X1, LAPACK = TRUE)
Q <- qr.qy(QR, diag(1, nrow = nrow(QR$qr), ncol = QR$rank))

注意我们没有像链接的答案那样继续计算tcrossprod(Q) ,因为那是普通的最小二乘法。 对于加权最小二乘法,我们需要Q1Q2

Q1 <- (1 / rw) * Q
Q2 <- rw * Q

如果我们只想要帽子矩阵的对角线和轨迹,则不需要进行矩阵乘法来首先获得完整的帽子矩阵。 我们可以用

d <- rowSums(Q1 * Q2)  ## diagonal
# [1] 0.20597777 0.26700833 0.30503459 0.30633288 0.22246789 0.27171651
# [7] 0.06649743 0.20170817 0.16522568 0.39758645 0.17464352 0.16496177
#[13] 0.34872929 0.20523690 0.22071444 0.24328554 0.32374295 0.17190937
#[19] 0.12124379 0.18590593 0.13227048 0.10935003 0.09495233 0.08295841
#[25] 0.22041164 0.18057077 0.24191875 0.26059064 0.16263735 0.24078776
#[31] 0.29575555 0.16053372 0.11833039 0.08597747 0.14431659 0.21979791
#[37] 0.16392561 0.26856497 0.26675058 0.13254903 0.26514759 0.18343306
#[43] 0.20267675 0.12329997 0.30294287 0.18650840 0.17514183 0.21875637
#[49] 0.05702440 0.13218959

edf <- sum(d)  ## trace, sum of diagonals
# [1] 10

在线性回归中, d是每个数据的影响,它对于产生置信区间(使用sqrt(d) )和标准化残差(使用sqrt(1 - d) )很有用。 跟踪,是模型的有效参数数量或有效自由度(因此我称之为edf )。 我们看到edf = 10 ,因为我们使用了10个参数: X有10列,并且它没有秩缺陷。

通常dedf都是我们需要的。 在极少数情况下,我们需要一个完整的帽子矩阵。 为了得到它,我们需要一个昂贵的矩阵乘法:

H <- tcrossprod(Q1, Q2)

Hat矩阵对于帮助我们了解模型是否为局部/稀疏特别有用。 让我们绘制这个矩阵(读取?image以获取有关如何以正确方向绘制矩阵的详细信息和示例):

image(t(H)[ncol(H):1,])

在此输入图像描述

我们看到这个矩阵是完全密集的 这意味着,每个数据的预测取决于所有数据,即预测不是本地的。 如果我们与其他非参数预测方法比较,如核回归,黄土,P样条(惩罚B样条回归)和小波,我们将观察稀疏的帽子矩阵。 因此,这些方法称为局部拟合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM