我想使用随机矩阵重新创建以下计算:
我从以下内容开始,给出了结果:
kmin1 <- cbind(1:10,1:10,6:15,1:10,1:10,6:15,1:10,1:10,6:15)
C <- cbind(1, kmin1) # Column of 1s
diag(C) <- 1
Ccrosprod <-crossprod(C) # C'C
Ctranspose <- t(C) # C'
CCtransposeinv <- solve(Ccrosprod) # (C'C)^-1
W <- Ctranspose %*% CCtransposeinv # W=(C'C)^-1*C'
但是我的假设是C应该能够成为m x n
矩阵,因为没有充分的理由假设因素等于观察值。
编辑:基于Hong Ooi的评论,我将kmin1 <- matrix(rexp(200, rate=.1), ncol=20)
更改为kmin1 <- matrix(rexp(200, rate=.1), nrow=20)
我检查了wikipedia,并发现m x n
可能具有左或右反角。为了将其付诸实践,我尝试了以下操作:
kmin1 <- matrix(rexp(200, rate=.1), nrow=20)
C <- cbind(1, kmin1) # Column of 1s
Ccrosprod <-crossprod(C) # C'C
Ctranspose <- t(C) # C'
CCtransposeinv <- solve(Ccrosprod) # (C'C)^-1
W <- Ctranspose %*% CCtransposeinv # W=(C'C)^-1*C'
编辑:基于此问题下面的评论,一切正常。
如果我确定这与语法没有任何关系,我会将其发布在stackexchange上,但是由于我对矩阵不熟悉,所以不确定。
答案 0 :(得分:0)
首先,我不熟悉您的研究/工作领域(计量经济学?),所以我不确定从特定领域的知识角度出发,以下内容是否明智。
此外,库MASS
允许计算非方阵的Moore-Penrose generalised inverse。
因此,您对非平方矩阵的计算可能会泛泛起来
library(MASS)
W <- ginv(t(C) %*% C) %*% t(C)
答案 1 :(得分:0)
如果C的列是线性独立的,则C'C是可逆的,并且(C'C) -1 C'等于以下任意值:
set.seed(123)
kmin1 <- matrix(rexp(200, rate=.1), nrow=20)
C <- cbind(1, kmin1)
r1 <- solve(crossprod(C), t(C))
r2 <- qr.solve(crossprod(C), t(C))
r3 <- chol2inv(chol(crossprod(C))) %*% t(C)
r4 <- with(svd(C), v %*% diag(1/d) %*% t(u))
r5 <- with(eigen(crossprod(C)), vectors %*% diag(1/values) %*% t(vectors)) %*% t(C)
r6 <- coef(lm.fit(C, diag(nrow(C))))
# check
all.equal(r1, r2)
## [1] TRUE
all.equal(r1, r3)
## [1] TRUE
all.equal(r1, r4)
## [1] TRUE
all.equal(r1, r5)
## [1] TRUE
dimnames(r6) <- NULL
all.equal(r1, r6)
## [1] TRUE
如果C'C不一定是可逆的,则答案不一定是唯一的(尽管如果我们对C(C'C)- C'感兴趣,那么即使伪逆,它也将是唯一的C'C可能不是)。无论如何,我们可以通过进行奇异值分解(或特征值分解)并使用奇异值(或特征值)的倒数并对接近0的值使用0来形成一个伪逆。这等于使用Moore彭罗斯伪逆。 (上面显示的lm.fit方法也可以使用,但是会在结果中生成一些NA。)
set.seed(123)
kmin1 <- matrix(rexp(200, rate=.1), nrow=20)
C <- cbind(1, kmin1)
C[, 11] <- C[, 2] + C[, 3] # force singularity
eps <- 1.e-5
s1 <- with(svd(C), v %*% diag(ifelse(abs(d) < eps, 0, 1/(d))) %*% t(u))
s2 <- with(eigen(crossprod(C)),
vectors %*% diag(ifelse(abs(values) < eps, 0, 1/values)) %*% t(vectors)) %*% t(C)
# check
all.equal(s1, s2)
## [1] TRUE