2015-05-31 16 views
5

我有一个数据帧象下面这样:如何产生的线性回归矩阵状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()有什么办法可以得到相同类型的矩阵?

谢谢。

+0

我很抱歉我的评论与您的​​问题没有关系,但是那个'+ 0'是什么意思?你是否试图在模型中不包含拦截? – SabDeM

+0

@SabDeM'+ 0'意味着移除拦截。 – rankthefirst

+0

我猜测如此。我只知道要放一个' - 1',但现在我知道'+ 0'的工作方式也很好,因为它已经在这里说过了:http://stackoverflow.com/questions/14216893/how-to-remove-intercept-in -r。谢谢。 – SabDeM

回答

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))

+0

谢谢,这真的很有帮助。虽然我原本想要一个单一的功能,但它工作起来很完美〜 – rankthefirst

+0

虽然,只是一个注释,在'upper.tri(mm)'中,看起来很简单'rev()'不是填写矩阵的正确顺序。也许先是't(mm)'然后't(t(mm))'? – rankthefirst

+0

我也翻转了现在我认为可以解决问题的'dd'列。 – MrFlick