首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基于QR分解的R中的多元回归分析

基于QR分解的R中的多元回归分析
EN

Stack Overflow用户
提问于 2016-10-25 14:20:22
回答 1查看 2.2K关注 0票数 8

我试图用QR分解来编写一个求解多元回归的函数。输入:y向量和X矩阵;输出: b,e,R^2。到目前为止,我已经得到了这一点,而且我陷入了困境;我认为我把一切都弄得太复杂了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
QR.regression <- function(y, X) {
X <- as.matrix(X)
y <- as.vector(y)
p <- as.integer(ncol(X))
if (is.na(p)) stop("ncol(X) is invalid")
n <- as.integer(nrow(X))
if (is.na(n)) stop("nrow(X) is invalid")
nr <- length(y)
nc <- NCOL(X)

# Householder 
for (j in seq_len(nc)) {
id <- seq.int(j, nr)
sigma <- sum(X[id, j]^2)
s <- sqrt(sigma)
diag_ej <- X[j, j]
gamma <- 1.0 / (sigma + abs(s * diag_ej))
kappa <- if (diag_ej < 0) s else -s
X[j,j] <- X[j, j] - kappa
if (j < nc)
for (k in seq.int(j+1, nc)) {
yPrime <- sum(X[id,j] * X[id,k]) * gamma
X[id,k] <- X[id,k] - X[id,j] * yPrime
}
yPrime <- sum(X[id,j] * y[id]) * gamma
y[id] <- y[id] - X[id,j] * yPrime
X[j,j] <- kappa
} # end of Householder transformation

rss <- sum(y[seq.int(nc+1, nr)]^2)  # residuals sum of squares
e <- rss/nr
e <- mean(residuals(QR.regression)^2)
beta <- solve(t(X) %*% X, t(X) %*% y)
for (i in seq_len(ncol(X))) # set zeros in the lower triangular side of X
X[seq.int(i+1, nr),i] <- 0
Rsq <- (X[1:nc,1:nc])^2
return(list(Rsq=Rsq, y = y, beta = beta, e = e))
}


UPDATE:
my.QR <- function(y, X) {
X <- as.matrix(X)
y <- as.vector(y)
p <- as.integer(ncol(X))
if (is.na(p)) stop("ncol(X) is invalid")
n <- as.integer(nrow(X))
if (is.na(n)) stop("nrow(X) is invalid")
qr.X <- qr(X)
b <- solve(t(X) %*% X, t(X) %*% y)
e <- as.vector(y - X %*% beta) #e
R2 <- (X[1:p, 1:p])^2
return(list(b = b, e= e, R2 = R2 ))
}

X <- matrix(c(1,2,3,4,5,6), nrow = 2, ncol = 3)
y <- c(1,2,3,4)
my.QR(X, y)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-25 15:39:10

这一切都取决于R的内置设施的多少,你可以使用它来解决这个问题。我已经知道lm是不允许的,下面是故事的其余部分。

如果允许使用除lm以外的任何其他例程,则为

然后,您可以简单地使用lm.fit.lm.fitlsfit进行基于QR的普通最小二乘求解.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lm.fit(X, y)
.lm.fit(X, y)
lsfit(X, y, intercept = FALSE)

其中,.lm.fit是最轻量级的,而lm.fitlsfit非常相似.下面是我们通过.lm.fit可以做的事情

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f1 <- function (X, y) {
  z <- .lm.fit(X, y)
  RSS <- crossprod(z$residuals)[1]
  TSS <- crossprod(y - mean(y))[1]
  R2 <- 1 - RSS / TSS
  list(coefficients = z$coefficients, residuals = z$residuals, R2 = R2)
  }

在你同学的问题上:Toy R function for solving ordinary least squares by singular value decomposition,我已经用它来检查SVD方法的正确性。

如果不允许使用R的内置QR分解例程qr.default

如果不允许.lm.fit,但qr.default是允许的,那么它也没有那么复杂。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f2 <- function (X, y) {
  ## QR factorization `X = QR`
  QR <- qr.default(X)
  ## After rotation of `X` and `y`, solve upper triangular system `Rb = Q'y` 
  b <- backsolve(QR$qr, qr.qty(QR, y))
  ## residuals
  e <- as.numeric(y - X %*% b)
  ## R-squared
  RSS <- crossprod(e)[1]
  TSS <- crossprod(y - mean(y))[1]
  R2 <- 1 - RSS / TSS
  ## multiple return
  list(coefficients = b, residuals = e, R2 = R2)
  }

如果进一步想要估计系数的方差协方差,请遵循How to calculate variance of least squares estimator using QR decomposition in R?

如果您甚至不被允许使用qr.default,则为

那么我们必须自己写QR分解。Writing a Householder QR factorization function in R code给了这个。

使用函数myqr,我们可以编写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
f3 <- function (X, y) {
  ## our own QR factorization
  ## complete Q factor is not required
  QR <- myqr(X, complete = FALSE)
  Q <- QR$Q
  R <- QR$R
  ## rotation of `y`
  Qty <- as.numeric(crossprod(Q, y))
  ## solving upper triangular system
  b <- backsolve(R, Qty)
  ## residuals
  e <- as.numeric(y - X %*% b)
  ## R-squared
  RSS <- crossprod(e)[1]
  TSS <- crossprod(y - mean(y))[1]
  R2 <- 1 - RSS / TSS
  ## multiple return
  list(coefficients = b, residuals = e, R2 = R2)
  }

f3并不是非常高效,因为我们已经显式地形成了Q,尽管它是瘦Q因素。原则上,我们应该把yX的QR分解一起旋转,这样Q就不需要形成了。

如果要修复现有代码,则为。

这需要一些调试工作,因此需要一些时间。我稍后会再回答这个问题。

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

https://stackoverflow.com/questions/40250691

复制
相关文章
PKS中的RS触发器和SR触发器
上大学时,学习《数字电子技术》这门课,第一次接触到RS触发器的概念,当时学了个囫囵吞枣,只知道有个置位端,还有个复位端,当置位端为ON时,RS触发器的输出为ON,当复位端为ON时,RS触发器的输出为OFF,至于置位端和复位端都为ON,或者都为OFF,触发器的输出会怎样,什么情况下需要使用RS触发器,当时根本就没有考虑,看来教学和应用还是有点脱节的。
剑指工控
2022/11/14
1.5K0
PKS中的RS触发器和SR触发器
WPF中的触发器(Trigger)
这节来讲一下WPF中的触发器——Trigger。触发器,是指在既定条件或者特殊场景下被触发,从而去执行一个操作。在WPF中,触发器可以分为以下几类:基本触发器(Trigger);事件触发器(EventTrigger);数据触发器(DataTrigger);多条件触发器(MultiTrigger,MultiDataTrigger)。下面我们来通过代码一一了解。
宿春磊Charles
2022/01/04
3.2K0
WPF中的触发器(Trigger)
MySQL中触发器的使用
如遇到触发器报错“Not allowed to return a result set from a trigger”;请划到最后看详解;
xbhog
2020/12/10
3.3K0
Zabbix 随笔:事件通知浅析(触发器篇)
每天都会发生不同的事件,在软件的世界也不例外,Zabbix 里所发生的一切也称为事件。Zabbix 的事件类型有如下几种
IT小白Kasar
2022/04/08
2K1
Zabbix 随笔:事件通知浅析(触发器篇)
创建 SpreadJS Blazor 组件
数据(包括股票、天气和体育比分)在不断更新为新信息时最为有用。比较通用的 JavaScript 电子表格组件,可以轻松地使用、显示并通过数据绑定提供实时数据更新。
葡萄城控件
2023/05/23
2K0
创建 SpreadJS Blazor 组件
触发器在渗透中的利用
0x01 什么是触发器: 触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。 0x02 问题描述: a)通
逸鹏
2018/04/09
1.5K0
触发器在渗透中的利用
数据库(视图,事件,触发器,函数,存储,变量)
当表格内发生,增,删,改对立面数据有变动时,我们可以给他特定的变动内容,除法某些select语句,以及逻辑判断
小小咸鱼YwY
2019/07/22
1.2K0
mysqldump命令详解 Part 2- 建立触发器 事件
前面说了MySQL Linux平台和Windows平台的安装 下面开始是MySQL的一些学习笔记 前面我们说了如果构造数据 这节开始说MySQL 的备份 环境为MySQL 5.7.25 在解释命令之前
bsbforever
2020/08/19
6280
mysqldump命令详解 Part 2- 建立触发器 事件
selec/poll中的读写事件和epoll中的读写事件
在Linux网络编程中,常常使用select和poll来做事件触发,监听socket的读写状态,然后进行读写操作。现在新的linux内核中,增加了epoll事件触发机制,具有更高的性能和更好的设计理念,可以用它来完全代替select和poll。相比于select,epoll最大的好处在于它不会随监听fd数目的增长而降低效率。因为在内核总的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件中有这样的声明: [cpp] view pl
李海彬
2018/03/22
3.2K0
Spring中的事件
文章目录 1. 简介 2. 事件 2.1. Spring中内置的事件 2.2. 自定义事件 3. 监听器 3.1. 实现ApplicationListener接口 3.2. 使用@EventListener注解 4. 事件发布 4.1. Spring的事件发布类 4.2. 直接注入 4.3. 使用ApplicationEventPublisherAware注入 5. 事件多播器 6. 异步事件 6.1. 使用@Async实现异步 6.2. 自定义事件多播器 7. 源码解析 简介 学过编程语言的肯定知道事
爱撒谎的男孩
2019/12/31
1.3K0
Oracle 触发器中修改字段值
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/53909715
用户1148526
2019/05/25
1.8K0
后仿中的异步D触发器设置
在PR后仿时,经常会遇到讨厌的红色X(不定态)。而debug不定态的起因又很麻烦,有可能用Verdi调试半天还是没能找到根本的原因。
ExASIC
2020/07/15
3.3K0
后仿中的异步D触发器设置
Svelte框架结合SpreadJS实现表格协同文档
SpreadJS是葡萄城结合 40 余年专业控件技术和在电子表格应用领域的经验而推出的纯前端表格控件。作为一个类Excel控件,SpreadJS如何实现当前比较流行的表格协同呢?本篇文章将简单介绍一下。 首先,从框架搭建上,本篇示例采用当下流行的前后端分离的开发方式,前端使用npm作为脚手架搭建Svelte框架。 后端使用Java的SpringBoot作为后端框架。前端使用SpreadJS V15.2.5以及SpreadJS在线表格编辑器Designer为前端操作的平台后端使用GCExcel作为文档的终端处理,随时提供备份与恢复。 首先,介绍下在前端Svelte框架下搭建SpreadJS在线表格编辑器。 1、在pageage.json文件中引入相关SpreadJS资源
葡萄城控件
2023/02/24
1.9K0
Svelte框架结合SpreadJS实现表格协同文档
react中的事件绑定
React中的事件绑定是将事件处理函数与组件的交互操作关联起来的过程。通过事件绑定,我们可以在React组件中响应用户的交互,并进行相应的操作。
堕落飞鸟
2023/05/19
3.1K0
GridView中DropDownList的事件
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { DropDownList drp = sender as DropDownList; GridViewRow row = drp.NamingContainer as GridViewRow; // GridView 中对应的行
全栈程序员站长
2022/10/01
5890
Redis 中的事件驱动
上一篇文章中,我们介绍了编程思想中的 Reactor 与 Proactor 两种设计模式: 程序设计中的两大经典模式 — Reactor & Proactor
用户3147702
2022/06/27
9840
Redis 中的事件驱动
iOS 中的事件响应
iOS 中的事件响应者主要分为两类,分别为UIResponder及UIGestureRecognizer,其中UIControl是一种比较特殊的UIResponder,所以本文将事件响应者分为以下三种类型进行讨论。
CoderStar
2022/08/24
2.8K0
iOS 中的事件响应
js中的事件(event)
我们可以简单的把事件理解为浏览器的感知系统。比如说:他可以感觉到用户是否点击(click)了页面、鼠标是否进入了页面的某个元素上面(mouseover或mouseenter)、鼠标是否离开了网页(mouseout或mouseleave)、浏览器是都加载完了页面上的资源(window.onload)、文档树是否生成(DOMContentLoaded)、键盘上的某个键是否按下(keydown)、鼠标的滚轮是否滚动了等等。
山河木马
2019/03/05
7K0
数据可视化探索之 SpreadJS
1、科学可视化主要关注的是三维现象的可视化,如建筑学、气象学、医学或生物学方面的各种系统。重点在于对体、面以及光源等等的逼真渲染,或许甚至还包括某种动态成分。
政采云前端团队
2021/05/11
2.2K0
数据可视化探索之 SpreadJS
点击加载更多

相似问题

Wijmo SpreadJS中的事件处理

10

SpreadJS SetStyle事件未调用“`undo`”

113

在SpreadJS事件绑定中没有抛出异常

179

使用spreadjs处理电子表格中的事件

12

来自iframe的Spreadjs引用

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文