首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加权最小二乘回归QR分解的hat矩阵

加权最小二乘回归QR分解的hat矩阵
EN

Stack Overflow用户
提问于 2013-12-13 08:33:46
回答 1查看 2.7K关注 0票数 4

我试图扩展包McSptialMcSptial函数,它适用于非参数估计的回归。在lwr()函数的核心部分,它用solve()代替QR分解来反演矩阵,导致数值不稳定。我想改变它,但不知道如何从QR分解得到帽子矩阵(或其他导数)。

有数据:

代码语言:javascript
复制
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()函数如下:

代码语言:javascript
复制
xmat2 <- w * xmat
xx <- solve(crossprod(xmat, xmat2))
xmat1 <- tcrossprod(xx, xmat2)
vmat <- tcrossprod(xmat1)

我需要的价值,例如:

代码语言:javascript
复制
sum((xmat[1,] %*% xmat1)^2)
sqrt(diag(vmat))

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-04 05:12:43

这个老问题是我刚才回答的另一个老问题的延续:Compute projection / hat matrix via QR factorization, SVD (and Cholesky factorization?)。这个答案讨论了计算普通最小二乘问题的帽子矩阵的三个选项,而这个问题是在加权最小二乘的背景下进行的。但答案的结果和方法将是我在这里回答的基础。具体来说,我将只演示QR方法。

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

在我继续之前,我需要指出OP的代码不是在做他想做的事情, xmat1不是帽子矩阵,相反,xmat %*% xmat1是。vmat不是帽子矩阵,虽然我不知道它是什么。那我就不明白这些是什么

代码语言:javascript
复制
sum((xmat[1,] %*% xmat1)^2)
sqrt(diag(vmat))

第二个看起来像hat矩阵的对角线,但正如我所说的,vmat不是hat矩阵。无论如何,我将继续对hat矩阵进行正确的计算,并说明如何得到它的对角线和跟踪。

考虑一个玩具模型矩阵X和一些一致的、正的权重w

代码语言:javascript
复制
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

我们首先通过对X1 (在乳胶段中的X_tilde)行重新标度来获得X

代码语言:javascript
复制
X1 <- rw * X

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

代码语言:javascript
复制
QR <- qr.default(X1, LAPACK = TRUE)
Q <- qr.qy(QR, diag(1, nrow = nrow(QR$qr), ncol = QR$rank))

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

代码语言:javascript
复制
Q1 <- (1 / rw) * Q
Q2 <- rw * Q

如果只想得到hat矩阵的对角线和迹,就不需要做矩阵乘法就能得到完整的hat矩阵。我们可以用

代码语言:javascript
复制
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是我们所需要的。在罕见的情况下,我们想要一个完整的帽子矩阵。为了得到它,我们需要一个昂贵的矩阵乘法:

代码语言:javascript
复制
H <- tcrossprod(Q1, Q2)

Hat矩阵在帮助我们理解模型是否是局部的/稀疏的非。让我们绘制这个矩阵(有关如何以正确的方向绘制矩阵的详细信息和示例,请参阅?image ):

代码语言:javascript
复制
image(t(H)[ncol(H):1,])

我们看到这个矩阵是完全稠密的。这意味着,对每个数据的预测取决于所有数据,即预测不是局部的。与核回归、黄土、P样条(惩罚B样条回归)、小波等非参数预测方法进行比较,发现稀疏帽子矩阵。因此,这些方法被称为局部拟合。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20562177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档