我有一个如下数据框:
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()
中有没有办法获得相同类型的矩阵?
感谢。
答案 0 :(得分:4)
这是一个非常一般的策略
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))
相同