从 QR 分解中获取帽子矩阵以进行加权最小二乘回归

2023-12-11

我正在尝试延长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

The 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 方法。

enter image description here

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


在继续之前,我需要指出OP的代码并没有按照他的想法行事。 xmat1不是帽子矩阵;反而,xmat %*% xmat1 is. 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

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

X1 <- rw * X

然后我们执行 QR 分解X1。正如我的链接答案中所讨论的,我们可以在有或没有列旋转的情况下进行分解。lm.fit or lm.wfit hence lm并没有进行旋转,但这里我将使用旋转分解作为演示。

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

注意我们没有继续计算tcrossprod(Q)正如链接的答案中所示,因为那是针对普通最小二乘法的。对于加权最小二乘,我们想要Q1 and Q2:

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 列,并且不存在秩缺陷。

Usually d and edf这就是我们所需要的。在极少数情况下,我们需要一个全帽矩阵。为了得到它,我们需要一个昂贵的矩阵乘法:

H <- tcrossprod(Q1, Q2)

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

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

enter image description here

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 QR 分解中获取帽子矩阵以进行加权最小二乘回归 的相关文章

随机推荐

  • 在 Objective c 中公开/综合 iVar 属性

    我有一个类 它本质上充当另一个类的轻量级包装类 它将另一个类保存为 iVar 我希望能够公开 iVar 的某些属性 实际上相当多 但要做到这一点 我必须像这样写出每个属性访问器 void setProperty Class value iV
  • 特定的一个表头颜色 java swing

    I want to change the background color of particular table header In my appliaction I have to set header color Red on the
  • 如何显示 wget 的对话框量表?

    我想显示进度wget使用对话框 gauge 我找到了一个解决方案在这个网站上但它的显示率并未达到 100 90 后 对话框冻结 停止并且代码退出 有没有办法显示 wget 的对话框量表 URL http upload wikimedia o
  • 在 clickhouse 中将日期转换为 Jalal 日期

    我使用clickhouse版本22 3 15 33 在我的表中 日期的格式如下 2023 01 15 我想计算表中每个 Jalal 月份变量的总和 所以首先我需要将此日期转换为 Jalal 日期 然后获取月份 然后使用group by基于月
  • 将图像和文本共享到 Facebook Messenger,但 UIActivityViewController 失败

    Question 必须对以下代码进行哪些更改才能确保 Messenger 正常运行 很好地与UIActivityViewController并分享图像和 文本 或者至少是图像 背景 我在用UIActivityViewController分享
  • 在哪里可以找到“SDL_Window”的定义

    我刚刚开始在 Linux 中学习 SDL2 我正在阅读 LazyFoo 的第一个教程 我看到有该代码 The window we ll be rendering to SDL Window window NULL 在哪里可以找到的定义SDL
  • 具有返回 char* 函数的内存管理

    今天 我没有多想 就根据给定枚举值的 switch 语句编写了一个返回 char 的简单函数 然而 这让我想知道如何释放那段记忆 我所做的是这样的 char func char retval new char 20 Switch blah
  • 如何在同一个图表上合并一条线和散点图?

    使用 Rplotly 包创建时 从 data frame 创建的两个单独的图表可以正常工作 然而 我不知道如何将它们组合成一个 大概是使用 add trace 函数 df lt data frame season c 2000 2000 2
  • 如何访问框架内的页面内容?

    我在主窗口内有一个框架 里面有一个带有面板和各种内容的页面 主窗口决定加载哪个页面 然后必须与其内容交互 这就是问题所在 我已经尝试了很多解决方案 最好的是这个 但返回 pageLogin 作为空对象 mainFrame Source ne
  • 在源代码树而不是包中运行所有测试

    我的单元测试与集成测试位于单独的目录树中 但具有相同的包结构 我的集成测试需要可用的外部资源 例如服务器 但我的单元测试完全独立于彼此和环境 在 IntelliJ IDEA v7 中 我定义了一个 JUnit 运行 调试配置来运行顶级包中的
  • 理解这个removeAll java方法和arrayList

    此方法的职责是删除所有出现的值toRemove来自数组列表 剩余的元素应该只是向列表的开头移动 大小不会改变 末尾的所有 额外 元素 但是多次出现toRemove位于列表中 应该只用 0 填充 该方法没有返回值 如果列表没有元素 那么它应该
  • 考虑到记录的大小,在网格视图中实现分页的最佳程序是什么?

    我在 sq server db 中有一个表有超过 100 万行 我需要在 gridview 中显示这些数据 并在 asp net 页面中分页 由于记录量较大 我需要提高页面显示数据的性能 实现分页 我应该遵循什么程序来实现分页 请帮忙 有多
  • Python - getattr 和串联

    因此 在我的代码中使用 getattr 时 我发现了以下内容 myVariable foo A bar 有效 但是是这样的 B A myVariable getattr foo B bar 返回错误 指出 foo 不包含属性 A bar 我
  • 如何在 pygtk 中更改 gtk.TreeView 的交替背景行颜色?

    我正在尝试更改树视图的交替背景颜色 我知道这通常应该由主题决定 但我想重写以测试 gtk 样式功能 根据树形视图文档here 我了解到 TreeView 有几个只读的样式选项 包括 偶数行颜色 奇数行颜色 和 允许规则 根据文档 允许绘制偶
  • php: file_get_contents() 可与 CLI 配合使用,但在服务器上调用时不起作用(在页面中)

    我有点困惑 我正在使用 bit ly PHP API 来缩短一些网址 这在本地主机上运行良好 但是当我在我的服务器上尝试它时 在 Apache 中运行的 php file get contents 返回一个空字符串 我检查了 apache
  • 列插入或更新与先前的 CREATE RULE 语句强加的规则冲突

    我正在开发一款在线游戏 我在向表插入新数据时遇到一些问题 我越来越 2010 4 8 2 14 37000 513 微软 ODBC SQL Server 驱动程序 SQL Server 列插入或 更新与强加的规则冲突 通过先前的 CREAT
  • 带图像的角度选择

    情况 我需要在语言选择中插入标志 我在 Google 和 StackOverflow 中进行了搜索 但找到的解决方案对我不起作用 代码 在控制器中 scope language list name english url https raw
  • 为什么这个简单的移动表单在使用播放器时没有关闭

    我使用关闭按钮创建了这个简单的示例表单 不使用 Interop WMPLib dll 时 一切都按预期工作 我见过其他应用程序使用它没有问题 但为什么当我添加以下行时表单进程没有关闭 SoundPlayer myPlayer new Sou
  • jQuery 绑定事件根本不起作用

    我尽了一切努力去实现它 但没有成功 问题是我在运行时创建一个元素 然后将一个函数绑定到该元素 如下代码所示 document ready function rem click function body append a href runt
  • 从 QR 分解中获取帽子矩阵以进行加权最小二乘回归

    我正在尝试延长lwr 包的功能McSptial 它适合作为非参数估计的加权回归 在核心lwr 函数 它使用以下方式反转矩阵solve 而不是 QR 分解 导致数值不稳定 我想改变它 但不知道如何从 QR 分解中获取帽子矩阵 或其他导数 有数