2015-05-31 15 views
5

Ho un dataframe come di seguito:come generare una matrice di regressione lineare come 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 

voglio fare la regressione lineare per ogni due colonne nella dataframe, e impostare intercept come 0.

In altre parole, voglio ottenere i coefficienti di lm(a1~a2+0), lm(a1~a3+0), lm(a1~a4+0), lm(a2~a1+0), lm(a2~a3+0)...

In cor(), se un ingresso dataframe, otterrò una matrice posteriore, p.es. sotto,

  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() c'è alcun modo per ottenere lo stesso tipo di matrice?

Grazie.

+0

Mi dispiace per il mio commento non relativo alla tua domanda, ma cosa significa '+ 0'? Stai cercando di non includere un'intercetta nel modello? – SabDeM

+0

@SabDeM '+ 0' significa rimuovere l'intercetta. – rankthefirst

+0

L'ho indovinato. Sapevo solo di mettere un '- 1', ma ora so che' + 0' funziona bene anche come è stato detto qui: http://stackoverflow.com/questions/14216893/how-to-remove-intercept-in -r. Grazie. – SabDeM

risposta

4

Ecco una strategia abbastanza generale

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

Questo dà la matrice

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 

dove elemento [4,1] è la stessa di coef(lm(a4~a1+0, dd)) ed elemento [2,3] è la stessa coef(lm(a2~a3+0, dd))

+0

Grazie, è davvero d'aiuto. Voglio originariamente una singola funzione, ma funziona perfettamente ~ – rankthefirst

+0

Mentre, solo un commento, nel 'upper.tri (mm)', sembra semplice 'rev()' non è l'ordine giusto per riempire la matrice. Forse prima 't (mm)' poi 't (t (mm))'? – rankthefirst

+0

Ho anche capovolto le colonne di 'dd' ora che penso risolva il problema. – MrFlick

Problemi correlati