如何生成像 cor() 这样的线性回归矩阵

how to generate a linear regression matrix like cor()

我有一个如下所示的数据框:

  a1 a2 a3 a4
1  3  3  5  5
2  4  3  5  5
3  5  4  6  5
4  6  5  7  3

我想对数据框中的每两列进行线性回归,并将intercept设置为0。

换句话说,我想得到lm(a1~a2+0), lm(a1~a3+0), lm(a1~a4+0), lm(a2~a1+0), lm(a2~a3+0)...

的系数

cor()中,如果我输入一个数据帧,我会得到一个矩阵,例如下面,

          a1        a2        a3        a4
a1 1.0000000 0.9467293 0.8944272 0.2045983
a2 0.9467293 1.0000000 0.9622504 0.4989222
a3 0.8944272 0.9622504 1.0000000 0.4574957
a4 0.2045983 0.4989222 0.4574957 1.0000000

lm()中有没有办法得到同种矩阵?

谢谢。

这是一个非常通用的策略

dd<-read.table(text="a1 a2 a3 a4
1  3  3  5  5
2  4  3  5  5
3  5  4  6  5
4  6  5  7  3", header=T)

mm<-diag(ncol(dd))
mm[lower.tri(mm)] <- combn(dd, 2, function(x) coef(lm(x[,2]~x[,1]+0)))
mm[upper.tri(mm)] <- rev(combn(dd[length(dd):1], 2, function(x) coef(lm(x[,2]~x[,1]+0))))

这给出了矩阵

mm
#           [,1]     [,2]      [,3]      [,4]
# [1,] 1.0000000 1.202381 0.7738095 0.9285714
# [2,] 0.8255814 1.000000 0.6592593 0.7925926
# [3,] 1.2441860 1.508475 1.0000000 1.2033898
# [4,] 0.9069767 1.101695 0.7481481 1.0000000

其中元素 [4,1] 与 coef(lm(a4~a1+0, dd)) 相同,元素 [2,3] 与 coef(lm(a2~a3+0, dd))

相同