2015-05-31 7 views
5

Ich habe einen Datenrahmen wie unten:wie eine lineare Regressionsmatrix wie cor zu erzeugen()

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

I lineare Regression für jeweils zwei Spalten in dem Datenrahmen tun will, und setzte intercept als 0

Mit anderen Worten, ich möchte die Koeffizienten von lm(a1~a2+0), lm(a1~a3+0), lm(a1~a4+0), lm(a2~a1+0), lm(a2~a3+0)...

In cor() bekommen, wenn ich Eingang ein Datenrahmen, ich werde eine Matrix zurück, zB unten,

  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 

In lm() ist es eine Möglichkeit, die gleiche Art von Matrix zu bekommen?

Danke.

+0

Es tut mir leid für meinen Kommentar nicht zu Ihrer Frage, aber was das '+ 0' bedeutet? Versuchen Sie, keinen Schnittpunkt in das Modell aufzunehmen? – SabDeM

+0

@SabDeM '+ 0' bedeutet Entfernen des Abschnitts. – rankthefirst

+0

Ich vermutete es. Ich wusste nur, eine '- 1' zu setzen, aber jetzt weiß ich, dass' + 0' auch gut funktioniert, wie es hier gesagt wurde: http://stackoverflow.com/questions/14216893/how-to-remove-intercept-in -r. Danke. – SabDeM

Antwort

4

Hier ist eine ziemlich allgemeine Strategie

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

Diese der Matrix

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 

gibt das Element [4,1] ist die gleiche wie coef(lm(a4~a1+0, dd)) und Element [2,3] ist das gleiche wie coef(lm(a2~a3+0, dd))

+0

Danke, es ist sehr hilfreich. Ich möchte ursprünglich eine einzige Funktion, aber es funktioniert perfekt ~ – rankthefirst

+0

Während, nur ein Kommentar, in der 'Upper.tri (mm)', scheint es einfach 'rev()' ist nicht die richtige Reihenfolge, um die Matrix zu füllen. Vielleicht zuerst 't (mm)' dann 't (t (mm))'? – rankthefirst

+0

Ich habe jetzt auch die Spalten von 'dd' umgedreht, was das Problem behebt. – MrFlick

Verwandte Themen