用奇异值分解法求解普通最小二乘的toyr函数
我正在尝试使用矩阵的奇异值分解编写多元回归分析函数(用奇异值分解法求解普通最小二乘的toyr函数,r,matrix,regression,linear-regression,svd,R,Matrix,Regression,Linear Regression,Svd,我正在尝试使用矩阵的奇异值分解编写多元回归分析函数(y=Xb+e)y和X必须是输入和回归系数向量b,剩余向量e和方差R2作为输出。下面是我到目前为止所拥有的,我完全被卡住了。重量的标签部分也给了我一个错误。这是什么标签零件?有人能给我一些提示来帮助我继续吗 Test <- function(X, y) { x <- t(A) %*% A duv <- svd(x) x.inv <- duv$v %*% diag(1/duv$d) %*% t(duv$u)
y=Xb+e
)y
和X
必须是输入和回归系数向量b
,剩余向量e
和方差R2
作为输出。下面是我到目前为止所拥有的,我完全被卡住了。重量的标签
部分也给了我一个错误。这是什么标签
零件?有人能给我一些提示来帮助我继续吗
Test <- function(X, y) {
x <- t(A) %*% A
duv <- svd(x)
x.inv <- duv$v %*% diag(1/duv$d) %*% t(duv$u)
x.pseudo.inv <- x.inv %*% t(A)
w <- x.pseudo.inv %*% labels
return(b, e, R2)
}
Test你不在路上了。。。奇异值分解应用于模型矩阵X
,而不是标准矩阵X'X
。以下是正确的程序:
因此,在编写R函数时,我们应该
svdOLS <- function (X, y) {
SVD <- svd(X)
V <- SVD$v
U <- SVD$u
D <- SVD$d
## regression coefficients `b`
## use `crossprod` for `U'y`
## use recycling rule for row rescaling of `U'y` by `D` inverse
## use `as.numeric` to return vector instead of matrix
b <- as.numeric(V %*% (crossprod(U, y) / D))
## residuals
r <- as.numeric(y - X %*% b)
## R-squared
RSS <- crossprod(r)[1]
TSS <- crossprod(y - mean(y))[1]
R2 <- 1 - RSS / TSS
## multiple return via a list
list(coefficients = b, residuals = r, R2 = R2)
}
这与系数和残差完全相同:
all.equal(svdfit$coefficients, qrfit$coefficients)
# [1] TRUE
all.equal(svdfit$residuals, qrfit$residuals)
# [1] TRUE
案例事项-x
和x
是不同的。函数的第一行使用A
,但A
不是输入。它来自哪里?我也不确定什么是标签
——这不是你写的代码吗?它应该做什么?它主要是我在这个网站上找到的代码。他们使用了标签
。是的,对不起,A是一个测试矩阵。但我的问题已经在下面得到了回答,谢谢!好吧,我明白你的意思了。谢谢但是我怎样才能从中得到b,e和R^2呢?非常感谢!你救了我的命。如果你愿意,你能看看我和我的同学遇到的类似问题吗?
qrfit <- .lm.fit(X, y)
all.equal(svdfit$coefficients, qrfit$coefficients)
# [1] TRUE
all.equal(svdfit$residuals, qrfit$residuals)
# [1] TRUE