Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用奇异值分解法求解普通最小二乘的toyr函数_R_Matrix_Regression_Linear Regression_Svd - Fatal编程技术网

用奇异值分解法求解普通最小二乘的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